Sfoglia il codice sorgente

Merge branch 'casher' into dev

shish 3 settimane fa
parent
commit
54fff8bd94
1 ha cambiato i file con 30 aggiunte e 6 eliminazioni
  1. 30 6
      app-ghs/controllers/OrderController.php

+ 30 - 6
app-ghs/controllers/OrderController.php

@@ -2775,6 +2775,8 @@ class OrderController extends BaseController
         }
         $get = Yii::$app->request->get();
         $cashier = $get['cashier'] ?? 0;
+        //是否强制取消订单 0不要强制 1强制,没有关单成功也要取消
+        $forceCancel = $get['forceCancel'] ?? 0;
         $id = $get['id'] ?? 0;
         $order = OrderClass::getById($id, true);
         OrderClass::valid($order, $this->shopId);
@@ -2803,12 +2805,34 @@ class OrderController extends BaseController
                 'lklCertificatePath' => $lklCertificatePath,
             ];
             $laResource = new Lakala($params);
-            $closeParams = ['orderSn' => $orderSn];
-            //关闭拉卡拉聚合支付订单
-            $response = $laResource->close($closeParams);
-            if (!isset($response['code']) || $response['code'] != 'BBS00000') {
-                $msg = $response['msg'] ?? '未知错误';
-                noticeUtil::push("拉卡拉聚合支付关单失败:{$orderSn},原因:{$msg} 编号:".$response['code'], '15280215347');
+
+            // 1. 先查询拉卡拉侧订单状态
+            $queryResponse = $laResource->query(['orderSn' => $orderSn]);
+            //响应CODE为BBS00000,仅表示查到了这笔交易。交易本身的成功与否状态,要查看响应报文中的trade_state这个值
+            if (isset($queryResponse['code']) && $queryResponse['code'] == 'BBS00000') {
+                $tradeState = $queryResponse['resp_data']['trade_state'] ?? '';
+
+                // 订单已支付,拦截取消操作
+                if ($tradeState == 'SUCCESS') {
+                    util::fail('已付款,不能取消');
+                }
+
+                // 根据拉卡拉聚合支付文档(id=116)及实际情况,判断是否为非终态
+                // INIT:初始化, CREATE:下单成功, DEAL:交易处理中, USERPAYING:支付中, NOTPAY:未支付
+                $pendingStates = ['INIT', 'CREATE', 'DEAL', 'USERPAYING', 'NOTPAY'];
+                if (in_array($tradeState, $pendingStates)) {
+                    $closeParams = ['orderSn' => $orderSn];
+                    $closeResponse = $laResource->close($closeParams);
+                    if (!isset($closeResponse['code']) || $closeResponse['code'] != 'BBS00000') {
+                        $msg = $closeResponse['msg'] ?? '关闭失败';
+                        noticeUtil::push("拉卡拉聚合支付关单失败:{$orderSn},原因:{$msg} 原单状态:{$tradeState}", '15280215347');
+                        if ($forceCancel == 0) {
+                            //返回禁止关单
+                            util::success(['returnStatus' => 'FORBID']);
+                        }
+                    }
+                }
+                // 如果状态是 CLOSED 或 CANCELED,则视为已关单,直接继续本地流程
             }
         }
         OrderService::expire($order);