Răsfoiți Sursa

滴滴跑腿平台相关代码更新

shizhongqi 7 luni în urmă
părinte
comite
c221bbfc94

+ 44 - 15
common/components/delivery/platform/didi/CallBackHandler.php

@@ -29,10 +29,20 @@ class CallBackHandler
     public function handle($post)
     {
         try {
-            $data = json_decode($post['logisticsParam'], true);
-
             // 验证签名 (如有需要请实现)
-            // if (!$this->verifySignature($data)) { ... }
+            if (!$this->verifySignature($post)) {
+                Yii::error('滴滴回调签名验证失败', 'didi-callback');
+                return false;
+            }
+            // 签名验证通过后会判断请求有效期, now - 2分钟 < timestamp < now + 2分钟 为有效区间内的请求
+            if ($post['timestamp'] < time() - 120 || $post['timestamp'] > time() + 120) {
+                if(getenv('YII_ENV') == 'production'){
+                    Yii::error('滴滴回调请求有效期验证失败', 'didi-callback');
+                    noticeUtil::push('滴滴回调请求有效期验证失败 -- '.$post['logisticsParam']);
+                    return false;
+                }
+            }
+            $data = json_decode($post['logisticsParam'], true);
 
             // 区分业务类型
             // 订单详情查询: 包含 orderNo 和 outOrderNo (且不包含 status/updateTime)
@@ -184,7 +194,6 @@ class CallBackHandler
             $order = HdOrderClass::getByCondition(['orderSn' => $outOrderNo], true);
             $isGhs = false;
         }
-
         if (!$order) {
             Yii::error('滴滴回调未找到对应订单: ' . $outOrderNo, 'didi-callback');
             return false;
@@ -200,7 +209,6 @@ class CallBackHandler
         // 更新 didiOrderNo
         if (!empty($didiOrderNo) && empty($deliveryOrder->orderId)) {
              $deliveryOrder->orderId = (string)$didiOrderNo;
-             $deliveryOrder->save();
         }
 
         $sendStatus = $this->convertOrderSendStatus($didiStatus);
@@ -209,8 +217,11 @@ class CallBackHandler
             return true; 
         }
         // 更新配送订单状态
+        if ($didiStatus == 'SUBMIT_CHARGE') {
+            $deliveryOrder->fee = $data['realTotalFee']; //真实支付总金额 -- 总金额-抵扣金额(status = SUBMIT_CHARGE时返回)
+        }
         $deliveryOrder->orderStatus = $sendStatus;
-        $deliveryOrder->save();
+
 
         // 更新主订单
         if ($isGhs) {
@@ -224,6 +235,10 @@ class CallBackHandler
                 // 取消/异常 (且当前状态未取消)
                 if (!in_array($order->sendStatus, [-2, -1]) && in_array($sendStatus, [-1, -2])) {
                     OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']);
+                    // 取消费用设置与保存
+                    if($sendStatus == -1 && isset($data['cancelInfo'])){
+                        $deliveryOrder->cancelCost = $data['cancelCost']['cancelFee'];
+                    }
                     $event = $this->cancelFrom($data);
                     GhsNotifyClass::ptErrorNotify($order->id, $event);
                 }
@@ -247,6 +262,10 @@ class CallBackHandler
             util::checkRepeatCommit('hd_pt_' . $order->id . '_' . $didiStatus, 2);
             
             if (!in_array($order->sendStatus, [-2, -1]) && in_array($sendStatus, [-1, -2])) {
+                // 取消费用设置与保存
+                if($sendStatus == -1 && isset($data['cancelInfo'])){
+                    $deliveryOrder->cancelCost = $data['cancelCost']['cancelFee'];
+                }
                 $event = $this->cancelFrom($data);
                 HdNotifyClass::ptErrorNotify($order->id, $event);
             }
@@ -261,7 +280,9 @@ class CallBackHandler
             }
         }
 
+        $deliveryOrder->save();
         Yii::info('滴滴回调处理成功', 'didi-callback');
+
         return true;
     }
 
@@ -300,16 +321,24 @@ class CallBackHandler
         }
     }
 
+    private function verifySignature($data)
+    {
+        $didi = new Didi();
+        $logisticsParam = $data['logisticsParam'];
+        $sign = $didi->generateSignature($logisticsParam, $data['timestamp']);
+        return $sign === $data['appSign'];
+    }
+
     private function convertOrderSendStatus($didiStatus)
     {
         $map = [
-            'WAIT_ACCEPT' => 2,         // 待接单 -> 派单中
-            'PAIRED_DRIVER' => 20,      // 已接单 -> 已分配骑手
-            'ARRIVED_FROM_ADDRESS' => 20, // 到达起点 -> 已分配骑手(或30骑手已到店)
+            'DRIVER_ACCEPT' => 3,       // 司机接单 -> 待取货
+            'PAIRED_DRIVER' => 20,      // 发单成功,匹配司机中 -> 已分配骑手
+            'ARRIVED_FROM_ADDRESS' => 30, // 到达起点 -> 骑手已到店
             'LEAVE_FROM_ADDRESS' => 4,  // 已取货 -> 配送中
             'ARRIVED_TO_ADDRESS' => 4,  // 到达终点 -> 配送中
-            'SERVICE_FINISH' => 4,      //
-            'SUBMIT_CHARGE' => 4,       //
+            'SERVICE_FINISH' => 4,      // 结束服务
+            'SUBMIT_CHARGE' => 4,       // 司机提交费用
             'COMPLETED' => 5,           // 已完成 -> 已送达
             'CANCEL' => -1,             // 已取消
         ];
@@ -321,8 +350,8 @@ class CallBackHandler
          // 对应 OrderClass 的 status
          // 3: 配送中, 4: 已完成
          $map = [
-             'WAIT_ACCEPT' => 3, 
-             'PAIRED_DRIVER' => 3,
+             'PAIRED_DRIVER' => 3, //发单成功,匹配司机中
+             'DRIVER_ACCEPT' => 3, //司机接单
              'ARRIVED_FROM_ADDRESS' => 3,
              'LEAVE_FROM_ADDRESS' => 3,
              'ARRIVED_TO_ADDRESS' => 3,
@@ -340,8 +369,8 @@ class CallBackHandler
     private function convertStatusToDidi($sendStatus)
     {
         $map = [
-            2 => 'WAIT_ACCEPT',
-            20 => 'PAIRED_DRIVER',
+            20 => 'DRIVER_ACCEPT',
+            2 => 'PAIRED_DRIVER',
             30 => 'ARRIVED_FROM_ADDRESS',
             4 => 'LEAVE_FROM_ADDRESS', // or ARRIVED_TO_ADDRESS
             5 => 'COMPLETED',

+ 1 - 1
common/components/delivery/platform/didi/Didi.php

@@ -79,7 +79,7 @@ class Didi
      * @param int $timestamp 毫秒时间戳
      * @return string
      */
-    protected function generateSignature($logisticsParam, $timestamp)
+    public function generateSignature($logisticsParam, $timestamp)
     {
         $str = $logisticsParam . $this->appSecret . $timestamp;
         return md5($str);

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

@@ -167,8 +167,8 @@ class DispatchService
         }
 
         if ($adapter instanceof DidiAdapter) {
-            $deliveryOrder = $this->getDeliveryOrder($orderId, 'didi');
-            $timeStamp = strtoTime($deliveryOrder->createdAt);
+            $deliveryOrder = $this->getDeliveryOrder($orderId, 'didi', 'id,orderId,createdAt');
+            $timeStamp = strtoTime($deliveryOrder['createdAt']);
             return $adapter->selectOrder($deliveryOrder['orderId'], $thirdOrderNo, $timeStamp);
         }