post(); Log::channel('alibaba')->info('[订阅消息通知] 收到请求', ['data' => json_encode($postData, JSON_UNESCAPED_UNICODE)]); if (empty($postData['message'])) { Log::channel('alibaba')->error('[订阅消息通知] message参数为空'); return response('fail: message is empty'); } // 解析message $message = json_decode($postData['message'], true); if (json_last_error() !== JSON_ERROR_NONE) { Log::channel('alibaba')->error('[订阅消息通知] message JSON解析失败', ['message' => $postData['message']]); return response('fail: message json decode error'); } $type = $message['type'] ?? ''; Log::channel('alibaba')->info('[订阅消息通知] 消息类型', ['type' => $type, 'message' => $message]); try { switch ($type) { case 'ORDER_BUYER_VIEW_ANNOUNCE_SENDGOODS': return $this->handleOrderSendGoods($message); default: Log::channel('alibaba')->warning('[订阅消息通知] 未知消息类型', ['type' => $type]); return response('success: unknown type'); } } catch (\Throwable $e) { Log::channel('alibaba')->error('[订阅消息通知] 处理异常', [ 'type' => $type, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString(), ]); return response('fail: exception - ' . $e->getMessage()); } } /** * 处理订单发货通知 * * 订阅消息类型: ORDER_BUYER_VIEW_ANNOUNCE_SENDGOODS * * 消息内容示例: * { * "bizKey": "3300284931845138963", * "data": { * "buyerMemberId": "b2b-665170100", * "orderId": 3300284931845138963, * "currentStatus": "waitbuyerreceive", * "sellerMemberId": "b2b-1676547900b7bb3", * "msgSendTime": "2018-05-30 19:34:27" * }, * "gmtBorn": 1778221635003, * "msgId": 189049289670, * "type": "ORDER_BUYER_VIEW_ANNOUNCE_SENDGOODS", * "userInfo": "b2b-22210711363891dff5" * } * * 处理流程: * 1. 记录日志 * 2. 根据 data.orderId 查询本地 store_order 表(alibaba_order_id) * 3. 请求1688获取物流信息接口,获取物流公司和物流单号 * 4. 更新 store_order 表的 delivery_name(快递名称)和 delivery_id(快递单号) * * @param array $message 消息内容 * @return \think\Response */ protected function handleOrderSendGoods(array $message) { $data = $message['data'] ?? []; $orderId = $data['orderId'] ?? 0; if (empty($orderId)) { Log::channel('alibaba')->error('[发货通知] data.orderId为空', ['message' => $message]); return response('fail: orderId is empty'); } Log::channel('alibaba')->info('[发货通知] 开始处理', [ 'alibaba_order_id' => $orderId, 'currentStatus' => $data['currentStatus'] ?? '', 'msgSendTime' => $data['msgSendTime'] ?? '', ]); // 1. 根据1688订单号查询本地订单 $storeOrder = Db::name('store_order') ->where('alibaba_order_id', (string)$orderId) ->find(); if (empty($storeOrder)) { Log::channel('alibaba')->warning('[发货通知] 未找到匹配的本地订单', ['alibaba_order_id' => $orderId]); return response('success: order not found locally'); } Log::channel('alibaba')->info('[发货通知] 找到本地订单', [ 'order_id' => $storeOrder['order_id'], 'order_sn' => $storeOrder['order_sn'], ]); // 2. 如果已有物流信息,跳过 if (!empty($storeOrder['delivery_name']) && !empty($storeOrder['delivery_id'])) { Log::channel('alibaba')->info('[发货通知] 订单已有物流信息,跳过更新', [ 'order_id' => $storeOrder['order_id'], 'delivery_name' => $storeOrder['delivery_name'], 'delivery_id' => $storeOrder['delivery_id'], ]); return response('success: already has logistics info'); } // 3. 请求1688获取物流信息 $orderService = new OrderService(); $logisticsResult = $orderService->getLogisticsInfosBuyerView([ 'orderId' => $orderId, ]); if ($logisticsResult === false || empty($logisticsResult['logisticsItems'])) { Log::channel('alibaba')->warning('[发货通知] 获取物流信息失败或物流信息为空', [ 'alibaba_order_id' => $orderId, 'result' => $logisticsResult, ]); return response('success: no logistics info yet'); } // 4. 取第一条物流信息 $firstLogistics = $logisticsResult['logisticsItems'][0]; $deliveryName = $firstLogistics['logisticsName'] ?? ''; $deliveryId = $firstLogistics['logisticsCode'] ?? ''; if (empty($deliveryName) || empty($deliveryId)) { Log::channel('alibaba')->warning('[发货通知] 物流信息不完整', ['logistics' => $firstLogistics]); return response('success: logistics info incomplete'); } // 5. 更新 store_order 表 $updateData = [ 'delivery_type' => 1, 'delivery_name' => $deliveryName, 'delivery_id' => $deliveryId, 'status' => 1, // 待收货 ]; Db::name('store_order') ->where('order_id', $storeOrder['order_id']) ->update($updateData); app()->make(StoreOrderStatusRepository::class)->status($storeOrder['order_id'], 'delivery_0', '订单以配送【快递名称】:' . $deliveryName . '; 【快递单号】:' . $deliveryId); Log::channel('alibaba')->info('[发货通知] 物流信息更新成功', [ 'order_id' => $storeOrder['order_id'], 'order_sn' => $storeOrder['order_sn'], 'delivery_name' => $deliveryName, 'delivery_id' => $deliveryId, ]); return response('success'); } }