ソースを参照

feat(alibaba): 添加1688订单退款原因查询功能

- 新增 refundReasonList 方法用于查询退款退货原因列表
- 集成 alibaba.trade.getRefundReasonList-1 API 接口
- 实现订单号和子订单号参数验证及传递逻辑
- 添加退款原因数据格式化处理功能
- 在路由配置中注册新的退款原因查询接口
- 完善错误处理和日志记录机制
shichen 2 ヶ月 前
コミット
a4b648818d
共有3 個のファイルを変更した137 個の追加0 個の削除を含む
  1. 30 0
      app/controller/api/store/order/AlibabaOrder.php
  2. 106 0
      app/services/ThirdParty/AlibabaAgent/OrderService.php
  3. 1 0
      route/api.php

+ 30 - 0
app/controller/api/store/order/AlibabaOrder.php

@@ -56,4 +56,34 @@ class AlibabaOrder
56 56
         }
57 57
         return app('json')->success(['postagePrice' => $res['preview']['sumCarriage'] / 100, 'flow' => $res['preview']['flowFlag']]);
58 58
     }
59
+
60
+    /**
61
+     * 查询退款退货原因列表
62
+     *
63
+     * API: alibaba.trade.getRefundReasonList-1
64
+     *
65
+     * @return \think\Response
66
+     */
67
+    public function refundReasonList()
68
+    {
69
+        $orderId = request()->param('order_id');
70
+        $orderEntryIds = request()->param('order_entry_ids', '');
71
+
72
+        if (empty($orderId)) {
73
+            return app('json')->fail('订单号不能为空');
74
+        }
75
+
76
+        $orderService = new OrderService();
77
+        $params = ['orderId' => $orderId];
78
+        if (!empty($orderEntryIds)) {
79
+            $params['orderEntryIds'] = $orderEntryIds;
80
+        }
81
+
82
+        $result = $orderService->getRefundReasonList($params);
83
+        if ($result === false) {
84
+            return app('json')->fail('获取退款原因失败');
85
+        }
86
+
87
+        return app('json')->success($result);
88
+    }
59 89
 }

+ 106 - 0
app/services/ThirdParty/AlibabaAgent/OrderService.php

@@ -507,4 +507,110 @@ class OrderService extends AlibabaAgentBaseService
507 507
             'rawData'         => $result,
508 508
         ];
509 509
     }
510
+
511
+    /**
512
+     * 查询退款退货原因列表
513
+     *
514
+     * API: com.alibaba.trade:alibaba.trade.getRefundReasonList-1
515
+     *
516
+     * 接口文档: https://open.1688.com/api/apidocdetail.htm?id=com.alibaba.trade%3Aalibaba.trade.getRefundReasonList-1
517
+     *
518
+     * 请求参数:
519
+     *   - orderId: 订单号(必填)
520
+     *   - orderEntryIds: 子订单号(可选,多个用逗号分隔)
521
+     *
522
+     * 返回示例:
523
+     * {
524
+     *   "result": [
525
+     *     {
526
+     *       "refundId": "REFUND123456",
527
+     *       "refundType": "退货退款",
528
+     *       "refundStatus": "waitSellerAgree",
529
+     *       "refundReasonList": [
530
+     *         {
531
+     *           "reasonId": 1,
532
+     *           "reasonText": "质量问题"
533
+     *         }
534
+     *       ]
535
+     *     }
536
+     *   ],
537
+     *   "success": true
538
+     * }
539
+     *
540
+     * @param array $params 请求参数(orderId 必填)
541
+     * @return array|false
542
+     */
543
+    public function getRefundReasonList(array $params = [])
544
+    {
545
+        // --- 参数校验 ---
546
+        if (empty($params['orderId'])) {
547
+            Log::channel('alibaba')->error('[获取退款原因] orderId不能为空');
548
+            return false;
549
+        }
550
+
551
+        $businessParams = [
552
+            'orderId' => (string)$params['orderId'],
553
+        ];
554
+
555
+        // 可选参数:子订单号
556
+        if (!empty($params['orderEntryIds'])) {
557
+            $businessParams['orderEntryIds'] = (string)$params['orderEntryIds'];
558
+        }
559
+
560
+        // --- 调用API ---
561
+        $result = $this->executeParam2(
562
+            self::NAMESPACE,
563
+            'alibaba.trade.getRefundReasonList',
564
+            1,
565
+            $businessParams
566
+        );
567
+
568
+        if ($result === false) {
569
+            Log::channel('alibaba')->error('[获取退款原因] API请求失败, params:' . json_encode($businessParams, JSON_UNESCAPED_UNICODE));
570
+            return false;
571
+        }
572
+
573
+        Log::channel('alibaba')->info('[获取退款原因] API请求成功, result:' . json_encode($result, JSON_UNESCAPED_UNICODE));
574
+
575
+        return $this->formatRefundReasonListResult($result);
576
+    }
577
+
578
+    /**
579
+     * 格式化退款退货原因列表返回结果
580
+     *
581
+     * @param array $result API原始返回数据
582
+     * @return array
583
+     */
584
+    protected function formatRefundReasonListResult(array $result): array
585
+    {
586
+        $success = $result['success'] ?? false;
587
+        $refundList = [];
588
+
589
+        if (isset($result['result']) && is_array($result['result'])) {
590
+            foreach ($result['result'] as $item) {
591
+                $reasons = [];
592
+                if (isset($item['refundReasonList']) && is_array($item['refundReasonList'])) {
593
+                    foreach ($item['refundReasonList'] as $reason) {
594
+                        $reasons[] = [
595
+                            'reasonId'   => $reason['reasonId'] ?? '',
596
+                            'reasonText' => $reason['reasonText'] ?? '',
597
+                        ];
598
+                    }
599
+                }
600
+
601
+                $refundList[] = [
602
+                    'refundId'         => $item['refundId'] ?? '',
603
+                    'refundType'       => $item['refundType'] ?? '',
604
+                    'refundStatus'     => $item['refundStatus'] ?? '',
605
+                    'refundReasonList' => $reasons,
606
+                ];
607
+            }
608
+        }
609
+
610
+        return [
611
+            'success'    => $success,
612
+            'refundList' => $refundList,
613
+            'rawData'    => $result,
614
+        ];
615
+    }
510 616
 }

+ 1 - 0
route/api.php

@@ -142,6 +142,7 @@ Route::group('api/', function () {
142 142
         // 1688
143 143
         Route::group('alibaba',function (){
144 144
             Route::post('checkOrder','/checkOrder');
145
+            Route::get('refundReasonList','/refundReasonList');
145 146
         })->prefix('api.store.order.AlibabaOrder');
146 147
 
147 148