|
|
@@ -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',
|