shizhongqi 8 ヶ月 前
コミット
3539c903aa

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

@@ -542,6 +542,10 @@ class DeliveryController extends BaseController
         $get = Yii::$app->request->get();
         Yii::info('fengniao 回调 -- get: ' . json_encode($get));
 
+        $fa = new \common\components\delivery\services\adapter\FengniaoAdapter();
+        $sign = $fa->second_geneSignature($callbackData['business_data']);
+        Yii::info('fengniao sign: ' . $sign);
+
         util::complete('蜂鸟回调接口');
     }
 

+ 9 - 1
common/components/delivery/helpers/SignHelper.php

@@ -21,7 +21,7 @@ class SignHelper
         // 拼接 query 字符串(过滤空值)
         $str = '';
         foreach ($params as $k => $v) {
-            if ($v === '' || $v === null) continue;
+            //if ($v === '' || $v === null) continue;
             if (is_array($v)) {
                 // 关键:在 JSON 编码前对数组进行递归排序
                 //$v = self::sortArrayRecursive($v);
@@ -41,6 +41,14 @@ class SignHelper
             case 'hmac_sha256':
                 $sign = hash_hmac('sha256', $str, $secret);
                 break;
+            case 'sha256':
+                if ($platform == 'fengniao') {
+                    $sign = $secret . $str;
+                } else {
+                    $sign = $str . $secret;
+                }
+                $sign = hash('sha256', $sign);
+                break;
             case 'md5':
             default:
                 if ($platform == 'shansong') {

+ 8 - 7
common/components/delivery/services/adapter/FengniaoAdapter.php

@@ -1653,15 +1653,10 @@ class FengniaoAdapter implements Adapter
 
         // Step 3: 拼接成字符串
         $paramStr = '';
-        $first = true;
         foreach ($params as $key => $value) {
-            if ($first) {
-                $paramStr = "{$key}={$value}";
-                $first = false;
-            } else {
-                $paramStr .= "&{$key}={$value}";
-            }
+            $paramStr .= "{$key}={$value}&";
         }
+        $paramStr = rtrim($paramStr, '&');
 
         // Step 4: 拼接 appSecret
         $signBefore = $this->appSecret . $paramStr;
@@ -1672,4 +1667,10 @@ class FengniaoAdapter implements Adapter
         Yii::info("[FengniaAuth] Sign Before: {$signBefore}, Signature: {$signature}");
         return $signature;
     }
+
+    public function second_geneSignature(array $params)
+    {
+        $signature = strtolower(SignHelper::makeSign($params, $this->appSecret, 'sha256', true, 'fengniao'));
+        return $signature;
+    }
 }