Просмотр исходного кода

feat(lakala): add complete notify url and update transaction service

- Add completeNotifyUrl property to TransPreorderRequest model
- Implement setCompleteNotifyUrl method in TransPreorderRequest
- Update TransactionService to accept TradeAccBusiFields type hint
- Set default busiMode to 'ACQ' in preOrder method
- Move subject assignment after busiMode in request building
- Pass complete notify url from config to request
- Update test to include accBusiFields parameter
- Add required use statements for WeChat business fields models
- Refactor test data setup for better readability
runphp 4 месяцев назад
Родитель
Сommit
5f0b2a646f

+ 7 - 0
src/OpenAPISDK/V3/Model/TransPreorderRequest.php

@@ -74,6 +74,8 @@ class TransPreorderRequest extends ModelRequest implements \JsonSerializable
     protected $outOrderNo;
     // 服务商机构标识码	C	String(11)	银联分配的服务商机构标识码
     protected $pnrInsIdCd;
+    // 发货确认通知地址 C	String(128) 发货类小程序确认收获后通知商户的地址
+    protected $completeNotifyUrl;
 
     public function __construct()
     {
@@ -244,6 +246,11 @@ class TransPreorderRequest extends ModelRequest implements \JsonSerializable
         return $this;
     }
 
+    public function setCompleteNotifyUrl($completeNotifyUrl)
+    {
+        $this->completeNotifyUrl = $completeNotifyUrl;
+        return $this;
+    }
     public function getAccBusiFields()
     {
         return $this->accBusiFields;

+ 6 - 37
src/Service/TransactionService.php

@@ -4,6 +4,7 @@ namespace SixShop\Lakala\Service;
 
 use SixShop\Lakala\OpenAPISDK\V3\Api\TransPreorderApi;
 use SixShop\Lakala\OpenAPISDK\V3\Configuration;
+use SixShop\Lakala\OpenAPISDK\V3\Model\TradeAccBusiFields;
 use SixShop\Lakala\OpenAPISDK\V3\Model\TradePreorderWechaAccBusiFields;
 use SixShop\Lakala\OpenAPISDK\V3\Model\TradePreorderWechaDetail;
 use SixShop\Lakala\OpenAPISDK\V3\Model\TradePreorderWechaGoodsDetail;
@@ -44,12 +45,12 @@ class TransactionService
         LocationInfo $locationInfo,
         string $accountType = 'WECHAT',
         string $transType = '71',
-        string $busiMode = '',
+        string $busiMode = 'ACQ',
         string $subject = '',
         string $payOrderNo = '',
         string $settleType = '',
         string $remark = '',
-        object $accBusiFields = null,
+        TradeAccBusiFields $accBusiFields = null,
     )
     {
         $request = new TransPreorderRequest();
@@ -62,48 +63,16 @@ class TransactionService
         $totalAmount = round($totalAmount * 100, 0);
         $request->setTotalAmount($totalAmount); // 单位分
         $request->setLocationInfo($locationInfo);
-        $request->setSubject($subject);
 
         // 非必填参数
         $request->setBusiMode($busiMode);
+        $request->setSubject($subject);
         $request->setPayOrderNo($payOrderNo);
         $request->setNotifyUrl($this->config->notify_url);
         $request->setSettleType($settleType);
         $request->setRemark($remark);
-        // $request->setPromoInfo('');
-        // $request->setOutOrderNo('');
-        // $request->setPnrInsIdCd('');
-
-        // 微信主扫场景 - 账户端业务信息
-        $acc_busi_fields = new TradePreorderWechaAccBusiFields();
-        $acc_busi_fields->setTimeoutExpress('');
-        $acc_busi_fields->setSubAppid('wx1308d811d01639eb');
-        $acc_busi_fields->setUserId('oPuRO15wmxv3AwRyEznRfuDLehrk');
-        $acc_busi_fields->setDetail('');
-        $acc_busi_fields->setGoodsTag('');
-        $acc_busi_fields->setAttach('');
-        $acc_busi_fields->setDeviceInfo('');
-        $acc_busi_fields->setLimitPay('');
-        $acc_busi_fields->setSceneInfo('');
-        $acc_busi_fields->setLimitPayer('');
-
-        $detail = new TradePreorderWechaDetail();
-        $detail->setCostPrice($totalAmount);
-        $detail->setReceiptId('');
-
-        $goods_detail = new TradePreorderWechaGoodsDetail();
-        $goods_detail->setGoodsId('3452234');
-        $goods_detail->setWxpayGoodsId('');
-        $goods_detail->setGoodsName('');
-        $goods_detail->setQuantity(1);
-        $goods_detail->setPrice($totalAmount);
-
-        $detail->setGoodsDetail([$goods_detail]);
-
-        $acc_busi_fields->setDetail($detail);
-
-        // 账户端业务信息
-        $request->setAccBusiFields($acc_busi_fields);
+        $request->setAccBusiFields($accBusiFields);
+        $request->setCompleteNotifyUrl($this->config->complete_notify_url);
 
         try {
             $response = $this->transPreorderApi->transPreorder($request);

+ 29 - 1
tests/Service/TransactionServiceTest.php

@@ -4,6 +4,9 @@ namespace SixShop\Lakala\Service;
 
 use PHPUnit\Framework\TestCase;
 use SixShop\Lakala\Dto\LocationInfo;
+use SixShop\Lakala\OpenAPISDK\V3\Model\TradePreorderWechaAccBusiFields;
+use SixShop\Lakala\OpenAPISDK\V3\Model\TradePreorderWechaDetail;
+use SixShop\Lakala\OpenAPISDK\V3\Model\TradePreorderWechaGoodsDetail;
 use SixShop\Payment\Enum\NumberBizEnum;
 
 class TransactionServiceTest extends TestCase
@@ -16,11 +19,36 @@ class TransactionServiceTest extends TestCase
 
     public function testPreOrder()
     {
+        $totalAmount = .01;
+        // 微信主扫场景 - 账户端业务信息
+        $accBusiFields = new TradePreorderWechaAccBusiFields();
+        $accBusiFields->setTimeoutExpress('');
+        $accBusiFields->setSubAppid('wx1308d811d01639eb');
+        $accBusiFields->setUserId('oPuRO15wmxv3AwRyEznRfuDLehrk');
+        $accBusiFields->setDetail('');
+        $accBusiFields->setGoodsTag('');
+        $accBusiFields->setAttach('');
+        $accBusiFields->setDeviceInfo('');
+        $accBusiFields->setLimitPay('');
+        $accBusiFields->setSceneInfo('');
+        $accBusiFields->setLimitPayer('');
+        $detail = new TradePreorderWechaDetail();
+        $detail->setCostPrice($totalAmount);
+        $detail->setReceiptId('');
+        $goods_detail = new TradePreorderWechaGoodsDetail();
+        $goods_detail->setGoodsId('3452234');
+        $goods_detail->setWxpayGoodsId('');
+        $goods_detail->setGoodsName('');
+        $goods_detail->setQuantity(1);
+        $goods_detail->setPrice($totalAmount);
+        $detail->setGoodsDetail([$goods_detail]);
+        $accBusiFields->setDetail($detail);
         $this->transactionService->preOrder(
             outTradeNo: generate_number(NumberBizEnum::ORDER_PAY),
-            totalAmount: .01,
+            totalAmount: $totalAmount,
             locationInfo: new LocationInfo(requestIP: '183.214.109.50'),
             subject: '测试订单',
+            accBusiFields: $accBusiFields,
         );
     }
 }