Jelajahi Sumber

1.代码改动 2.fix bug: 找到货拉拉签名认证失败的原因并修复

shizhongqi 9 bulan lalu
induk
melakukan
5ad3094cbf

+ 0 - 1
app-ghs/controllers/DeliveryController.php

@@ -578,7 +578,6 @@ class DeliveryController extends BaseController
             return $this->asJson(['return_code' => 0, 'return_msg' => 'OK']);
         }else{
             Yii::error('蜂鸟回调接口签名出错');
-
         }
     }
 

+ 0 - 2
common/components/delivery/helpers/SignHelper.php

@@ -21,7 +21,6 @@ class SignHelper
         // 拼接 query 字符串(过滤空值)
         $str = '';
         foreach ($params as $k => $v) {
-            //if ($v === '' || $v === null) continue;
             if (is_array($v)) {
                 // 关键:在 JSON 编码前对数组进行递归排序
                 //$v = self::sortArrayRecursive($v);
@@ -30,7 +29,6 @@ class SignHelper
 
             if ($platform == 'shansong') {
                 $str .= "{$k}{$v}";
-                //$str .= "{$k}={$v}&";
             } else {
                 $str .= "{$k}={$v}&";
             }

+ 1 - 2
common/components/delivery/services/DispatchService.php

@@ -4,7 +4,6 @@ namespace common\components\delivery\services;
 
 use biz\shop\classes\ShopClass;
 use bizGhs\express\classes\DeliveryAuthTokenClass;
-use bizGhs\order\classes\OrderClass;
 use bizGhs\order\classes\OrderItemClass;
 use common\components\delivery\helpers\HttpClient;
 use common\components\delivery\services\adapter\{ ShansongAdapter,  HuolalaAdapter, FengniaoAdapter, ShunfengAdapter}; // MeituanAdapter, DadaAdapter, SFAdapter, UUAdapter,
@@ -80,7 +79,7 @@ class DispatchService
     public function createOrder($order, $shopId, $params)
     {
         $order = $order->toArray();
-        $shop = ShopClass::getById($shopId, false, 'id,merchantName,fullAddress,lat,long,city,dist,floor,mobile,merchantName,mobile');
+        $shop = ShopClass::getById($shopId, false, 'id,merchantName,fullAddress,lat,long,city,dist,floor,mobile,merchantName');
 
         $adapter = $this->getAdapter();
         $orderData = $adapter->formatOrderData($order, $shop, $params);

+ 4 - 8
common/components/delivery/services/adapter/HuolalaAdapter.php

@@ -251,7 +251,7 @@ class HuolalaAdapter implements Adapter
             'city_id' => $cityId,
             'city_info_revision' => $params['city_info_revision'],
             'order_vehicle_id' => $params['order_vehicle_id'],
-             'addr_info' => [
+            'addr_info' => [
                  [
                      'name' => $shop['merchantName'], //地址名称
                      'addr' => $shop['fullAddress'],
@@ -274,7 +274,7 @@ class HuolalaAdapter implements Adapter
                      'contacts_name' => $order['customName'],
                      'contacts_phone_no' => $order['customMobile'],
                  ]
-             ],
+            ],
             'vehicle_std' => $params['vehicle_std'],
             'spec_req' => $params['spec_req'],
             'order_time' => $orderTime,
@@ -292,7 +292,7 @@ class HuolalaAdapter implements Adapter
         ];
 
         // 添加订单消息回调地址
-        $apiData['notify_url'] = $this->notifyUrl;
+        $apiData['notify_url'] = urlencode($this->notifyUrl); // 要进行 URL 转码,不然会引起签名验证出错
 
         return $apiData;
     }
@@ -697,12 +697,8 @@ class HuolalaAdapter implements Adapter
      */
     protected function generateSignature($params)
     {
+
         // 使用 SignHelper 的通用签名算法
-        // 参数说明:
-        // - $params: 待签名参数
-        // - $this->appSecret: 应用密钥
-        // - 'md5': 签名算法(默认值)
-        // - true: 是否按 key 排序(默认值)
         $sign = SignHelper::makeSign($params, $this->appSecret);
         
         // 货拉拉 API 要求32位小写,转换为小写

+ 8 - 9
common/components/delivery/services/adapter/ShunfengAdapter.php

@@ -9,24 +9,23 @@ use Yii;
 class ShunfengAdapter
 {
     protected $baseUrl;
-    protected $appId;
+    protected $devId;
     protected $appSecret;
-    protected $merchantId;
     protected $shopId;
     protected $accessToken;
-    protected $apiVersion = '1.0';
+    protected $apiVersion = 19;
 
     public function __construct($accessToken = '', $shopId = 0)
     {
         // 根据环境设置基础URL
         if (getenv('YII_ENV') == 'production') {
             $this->baseUrl = 'https://openic.sf-express.com/open/api/external/';
-            $this->appId = 1741530942;
+            $this->devId = 1741530942;
             $this->appSecret = '07b3f83d19a4a9f89322976c936faf92';
             $this->shopId = $shopId;
         } else {
             $this->baseUrl = 'https://openic.sf-express.com/open/api/external/';
-            $this->appId = 1741530942;
+            $this->devId = 1741530942;
             $this->appSecret = '07b3f83d19a4a9f89322976c936faf92';
             $this->shopId = $shopId;
         }
@@ -111,7 +110,7 @@ class ShunfengAdapter
             'order_source' => $params['order_source'] ?? '花店系统', // 订单接入来源
             'order_time' => $orderTime, // 用户下单时间(秒级时间戳)
             'push_time' => time(), // 推单时间(秒级时间戳)
-            'version' => 19, // API版本号
+            'version' => $this->apiVersion, // API版本号
 
             // 收货人信息
             'receive' => [
@@ -247,7 +246,7 @@ class ShunfengAdapter
 
         // 构建签名用的完整payload
         $payload = [
-            'dev_id' => $this->appId,
+            'dev_id' => $this->devId,
             'shop_id' => $this->shopId,
             'shop_type' => 1, //1:顺丰店铺ID 2:接入方店铺ID
         ];
@@ -278,7 +277,7 @@ class ShunfengAdapter
     {
         // 构建参数
         $payload = [
-            'dev_id' => $this->appId,
+            'dev_id' => $this->devId,
             'shop_id' => $this->shopId,
             'shop_type' => 1, //1:顺丰店铺ID 2:接入方店铺ID
             //-------------------------------------------------
@@ -298,7 +297,7 @@ class ShunfengAdapter
     public function generateSignature($params)
     {
         $post_data = json_encode($params);
-        $sign_char = $post_data . "&{$this->appId}&{$this->appSecret}";
+        $sign_char = $post_data . "&{$this->devId}&{$this->appSecret}";
         $sign      = base64_encode(MD5($sign_char)); // 注:md5出来的结果是32位小写16进制字符串,$sign 的最终结果末尾包含等号=
         return $sign;
     }