Pārlūkot izejas kodu

feat(lakala): 新增订单确认前检查与结算功能

- 在订单确认前增加对拉卡拉支付状态的校验逻辑
- 实现订单结算接口,支持调用拉卡拉结算API
- 增加对微信订单状态的查询与判断逻辑
- 当订单处于待发货或已发货状态时阻止确认操作
- 提供详细的异常信息抛出机制以增强错误处理能力
runphp 3 mēneši atpakaļ
vecāks
revīzija
6ef0662840
2 mainītis faili ar 44 papildinājumiem un 0 dzēšanām
  1. 23 0
      src/Hook/OrderHook.php
  2. 21 0
      src/Service/LedgerService.php

+ 23 - 0
src/Hook/OrderHook.php

@@ -3,12 +3,14 @@ declare(strict_types=1);
 
 namespace SixShop\Lakala\Hook;
 
+use app\event\BeforeOrderConfirmEvent;
 use app\event\OrderDetailResponseEvent;
 use app\model\Order;
 use SixShop\Core\Attribute\Hook;
 use SixShop\Lakala\Enum\WechatOrderStateEnum;
 use SixShop\Payment\Model\ExtensionPaymentModel;
 use SixShop\Wechat\Service\ExpressService;
+use function SixShop\Core\throw_logic_exception;
 
 class OrderHook
 {
@@ -53,4 +55,25 @@ class OrderHook
             }
         }
     }
+
+    #[Hook(BeforeOrderConfirmEvent::class)]
+    public function onBeforeConfirmOrder(BeforeOrderConfirmEvent $event): void
+    {
+        $order = $event->orderModel;
+        if ($order->payment_method == 'lakala' && $order->shipping_status == 1) {
+            $payment = ExtensionPaymentModel::where([
+                'order_id' => $order->id,
+                'biz_type' => 1,
+                'pay_type' => 'lakala'
+            ])->findOrEmpty();
+            if (!$payment->isEmpty()) {
+                $wechatTransactionID = $payment['payment_result']['acc_trade_no'];
+                $orderInfo = $this->expressService->queryOrder($wechatTransactionID);
+                $orderState = WechatOrderStateEnum::from($orderInfo['order_state']);
+                if ($orderState == WechatOrderStateEnum::PENDING_SHIPMENT || $orderState == WechatOrderStateEnum::SHIPPED) {
+                    throw_logic_exception('订单正在处理中,请稍后再试');
+                }
+            }
+        }
+    }
 }

+ 21 - 0
src/Service/LedgerService.php

@@ -174,4 +174,25 @@ class LedgerService
             );
         }
     }
+
+    /**
+     * 订单结算
+     *
+     * @link https://o.lakala.com/#/home/document/detail?id=336
+     */
+    public function settle(array $reqData):bool
+    {
+        $request = new V2ModelRequest();
+        $request->setReqData($reqData);
+        $response = $this->v2LakalaApi->tradeApi('/api/v2/mrss/ledger/settle', $request);
+        if ($response->getRetCode() == '0000') {
+            return true;
+        } else {
+            throw_logic_exception(
+                msg:$response->getRetMsg(),
+                code: (int)$response->getRetCode(),
+                data: $response->getRespData(),
+            );
+        }
+    }
 }