Jelajahi Sumber

取消账单

shish 1 bulan lalu
induk
melakukan
1ce65215ec
1 mengubah file dengan 28 tambahan dan 8 penghapusan
  1. 28 8
      app-ghs/controllers/ClearController.php

+ 28 - 8
app-ghs/controllers/ClearController.php

@@ -86,9 +86,6 @@ class ClearController extends BaseController
         if ($clear->status == ClearClass::STATUS_EXPIRE) {
             util::fail('账单已取消');
         }
-        $clear->status = ClearClass::STATUS_EXPIRE;
-        $clear->remark = "商家主动取消 " . date("m-d H:i") . ' 操作人 ' . $staffName;
-        $clear->save();
 
         $ghsShop = $this->shop;
         $merchantPrivateKeyPath = Yii::getAlias("@vendor/lakala") . '/production/api_private_key.pem';
@@ -102,16 +99,34 @@ class ClearController extends BaseController
             'lklCertificatePath' => $lklCertificatePath,
         ];
         $laResource = new Lakala($params);
+
+        // 1. 先查询拉卡拉订单状态,确保未付款成功,防止时序竞争问题
+        $queryResponse = $laResource->query(['orderSn' => $orderSn]);
+        if (isset($queryResponse['code']) && $queryResponse['code'] == 'BBS00000') {
+            $tradeState = $queryResponse['resp_data']['trade_state'] ?? '';
+            if ($tradeState == 'SUCCESS') {
+                util::fail('账单已付款成功,不可取消!');
+            }
+        }
+
+        // 2. 调用拉卡拉关单,防止后续再次支付成功
         $closeParams = [
             'orderSn' => $orderSn,
         ];
         $response = $laResource->close($closeParams);
         if (isset($response['code']) == false || $response['code'] != 'BBS00000') {
-            //$msg = $response['msg'] ?? '';
-            //noticeUtil::push("\n花店结账单:" . $orderSn . "\n关单失败了\n{$msg} ", '15280215347');
-        }
-
-        //收银台关单
+            $msg = $response['msg'] ?? '';
+            $code = $response['code'] ?? 0;
+            // 如果拉卡拉明确返回已经支付,则阻断本地状态更新为取消
+            if (in_array($code, ['BBS11112', 'BBS11113'])) {
+                util::fail('账单在第三方支付渠道已被支付或处理中,无法取消!');
+            }
+            if (!in_array($code, ['BBS11114'])) {
+                noticeUtil::push("\n花店结账单:" . $orderSn . "\n关单失败了\n{$msg} {$code}", '15280215347');
+            }
+        }
+
+        // 收银台关单
         $closeParams = ['orderSn' => $orderSn];
         $response = $laResource->cashClose($closeParams);
         if (isset($response['code']) == false || $response['code'] != '000000') {
@@ -119,6 +134,11 @@ class ClearController extends BaseController
             //noticeUtil::push('单号:' . $orderSn . ',关单没有成功(收银台-支付宝),' . $msg, '15280215347');
         }
 
+        // 3. 第三方关单/状态校验通过后,最后才修改并保存本地数据库状态为 STATUS_EXPIRE
+        $clear->status = ClearClass::STATUS_EXPIRE;
+        $clear->remark = "商家取消 " . date("m-d H:i") . ' 操作人 ' . $staffName;
+        $clear->save();
+
         util::complete();
     }