$md_id, 'is_delete' => 0, 'store_id' => $store_id]); if (!$service) { throw new \Exception('暂未申请同城配送权限'); } if (empty($service->wx_store_id)) { $form = new WechatDeliveryForm(); $form->store_id = $store_id; $form->md_id = $md_id; $service_result = $form->getStoreInfo(); if ($service_result['code'] === 0) { $service = $service_result['service']; } else { throw new \Exception('运费查询失败' . $service_result['msg']); } } $goods_list = $params['goods_list']; $weight = 0; $cargo_num = 0; $price = 0; $cargo_name = ""; foreach ($goods_list as $goods_item) { $weight += $goods_item['weight']; $cargo_num += $goods_item['num']; $price += $goods_item['price']; $cargo_name .= $goods_item['name'] . ';'; } if ($weight <= 0) { throw new \Exception('商品重量需要设置'); } $price = sprintf('%.2f', $price); $cargo_name = mb_substr($cargo_name, 0, 32, 'utf-8'); $data = [ 'wx_store_id' => $service->wx_store_id, 'user_lng' => $params['address']['longitude'], 'user_lat' => $params['address']['latitude'], 'user_name' => $params['address']['name'], 'user_phone' => $params['address']['mobile'], 'user_address' => $params['address']['province'] . $params['address']['city'] . $params['address']['district'] . $params['address']['detail'], // 'cargo_name' => $goods_list['name'], 'cargo' => [ 'cargo_name' => $cargo_name, 'cargo_weight' => $weight ?: 0, 'cargo_price' => $price * 100, 'cargo_type' => 3, 'cargo_num' => $cargo_num, ], //cargo_type这里选择商品类型,填入的是百货,实际应用可能会涉及药品之类,可能会有问题 //'use_sandbox' => 1, ]; $form = new IndexController(); $form->store_id = $store_id; $result = $form->getUrlData($store_id, 'cgi-bin/express/intracity/preaddorder', $data); if (isset($result['errcode']) && $result['errcode'] === 0) { return [ 'code' => 0, 'msg' => '计算成功', 'data' => [ 'resultcode' => 0, 'service_trans_id' => $result['service_trans_id'], 'distance' => $result['distance'], 'fee' => floatval(sprintf('%.2f',$result['est_fee'] / 100)), 'expected_finished_time' => $result['expected_finished_time'], 'promise_delivery_time' => $result['promise_delivery_time'], 'is_wechat_new_delivery' => 1 ] ]; // 'resultcode' => 0, // 'address' => $address, // 'store' => $store, // 'distance' => $distance, // 'delivery_time' => $delivery_time, // 'delivery_time_stamp' => $delivery_time_stamp, // 'LocalDeliveryFreight' => $result, // 'freight_detail' => $freight_detail, // 'fee' => (float)$freight, // 'endTime' => $endTime } throw new \Exception($result['errmsg'], $result['errcode']); } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } //下单 https://api.weixin.qq.com/cgi-bin/express/intracity/addorder public function addOrder($params) { try { $md_id = $params['md_id']; if ($md_id <= 0) { $md_id = 0; } $store_id = $params['store_id']; $service = WechatIntracityService::findOne(['md_id' => $md_id, 'is_delete' => 0, 'store_id' => $store_id]); if (!$service) { throw new \Exception('暂未申请同城配送权限'); } if (empty($service->wx_store_id)) { $form = new WechatDeliveryForm(); $form->store_id = $store_id; $form->md_id = $md_id; $service_result = $form->getStoreInfo(); if ($service_result['code'] === 0) { $service = $service_result['service']; } else { throw new \Exception('运费查询失败' . $service_result['msg']); } } $goods_list = $params['goods_list']; $weight = 0; $cargo_num = 0; $cargo_price = 0; $cargo_name = ""; $goods_item_list = []; foreach ($goods_list as $goods_index => $goods_item) { $weight += $goods_item['weight']; $cargo_num += $goods_item['num']; $cargo_price += $goods_item['price']; $cargo_name .= $goods_item['name'] . ';'; $goods_item_list[$goods_index]['item_name'] = $goods_item['name']; $goods_item_list[$goods_index]['item_pic_url'] = $goods_item['pic']; $goods_item_list[$goods_index]['count'] = $goods_item['num']; } if ($weight <= 0) { throw new \Exception('商品重量需要设置'); } $cargo_price = sprintf('%.2f', $cargo_price); $cargo_name = mb_substr($cargo_name, 0, 32, 'utf-8'); $data = [ 'wx_store_id' => $service->wx_store_id, 'store_order_id' => $params['order_no'], 'user_openid' => $params['store_user']['wechat_open_id'], 'user_lng' => $params['address']['longitude'], 'user_lat' => $params['address']['latitude'], 'user_name' => $params['address']['name'], 'user_phone' => $params['address']['mobile'], 'user_address' => $params['address']['province'] . $params['address']['city'] . $params['address']['district'] . $params['address']['detail'], 'order_seq' => $params['order_seq'], 'verify_code_type' => 3, 'order_detail_path' => $params['order_detail_path'], 'callback_url' => 'https://' . \Yii::$app->request->hostName . '/index.php/wechat/delivery-callback', //'use_sandbox' => 1, 'cargo' => [ 'cargo_name' => $cargo_name, 'cargo_weight' => $weight ?: 0, 'cargo_price' => $cargo_price * 100, 'cargo_type' => 3, 'cargo_num' => $cargo_num, 'item_list' => $goods_item_list ], ]; $form = new IndexController(); $result = $form->getUrlData($store_id, 'cgi-bin/express/intracity/addorder', $data); if (isset($result['errcode']) && $result['errcode'] === 0) { $delivery_type = 0; if ($result['service_trans_id']) { switch ($result['service_trans_id']) { case 'DADA': $delivery_type = 2; break; case 'SFTC': $delivery_type = 1; break; } } $deliveryInfo = DeliveryInfo::findOne(['order_no' => $params['order_no']]); $deliveryInfo->fee = bcdiv($result['fee'], 100, 2); $deliveryInfo->delivery_type = $delivery_type; $deliveryInfo->wx_order_id = $result['wx_order_id']; $deliveryInfo->success_params = json_encode($result, JSON_UNESCAPED_UNICODE); if (!$deliveryInfo->save()) { throw new \Exception(json_encode($deliveryInfo->errors, JSON_UNESCAPED_UNICODE)); } return [ 'code' => 0, 'msg' => '计算成功', 'data' => [ 'wx_store_id' => $result['wx_store_id'], 'wx_order_id' => $result['wx_order_id'], 'store_order_id' => $result['store_order_id'], 'service_trans_id' => $result['service_trans_id'], 'distance' => $result['distance'], 'trans_order_id' => $result['trans_order_id'], 'waybill_id' => $result['waybill_id'], 'fee' => $result['fee'], 'fetch_code' => $result['fetch_code'], 'order_seq' => $result['order_seq'] ] ]; } throw new \Exception($result['errmsg'], $result['errcode']); } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } //取消订单 https://api.weixin.qq.com/cgi-bin/express/intracity/cancelorder public function cancelOrder($params) { try { // $md_id = $params['md_id']; // if ($md_id <= 0) { // $md_id = 0; // } $store_id = $params['store_id']; $order_no = $params['order_no']; $deliveryInfo = DeliveryInfo::findOne(['order_no' => $order_no]); if (!$deliveryInfo) { throw new \Exception('未找到订单'); } $data = [ 'wx_order_id' => $deliveryInfo->wx_order_id, 'cancel_reason_id' => 1,//此处为 1.不需要了 1:不需要了 2:信息填错 3:无人接单 99:其他 ]; $form = new IndexController(); $result = $form->getUrlData($store_id, 'cgi-bin/express/intracity/cancelorder', $data); if (isset($result['errcode']) && $result['errcode'] === 0) { $deliveryInfo->deduct_fee = $result['deductfee']; if (!$deliveryInfo->save()) { throw new \Exception(json_encode($deliveryInfo->errors, JSON_UNESCAPED_UNICODE)); } return [ 'code' => 0, 'msg' => '取消成功' ]; } throw new \Exception($result['errmsg'], $result['errcode']); } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } //查询订单状态 https://api.weixin.qq.com/cgi-bin/express/intracity/queryorder public function getOrderStatus($params) { try { $store_id = $params['store_id']; $order_no = $params['order_no']; $deliveryInfo = DeliveryInfo::findOne(['order_no' => $order_no]); $data = [ 'wx_order_id' => $deliveryInfo->wx_order_id ]; $form = new IndexController(); $result = $form->getUrlData($store_id, 'cgi-bin/express/intracity/queryorder', $data); if (isset($result['errcode']) && $result['errcode'] === 0) { $deliveryInfo->wx_order_status = $result['order_status']; if (!$deliveryInfo->save()) { throw new \Exception(json_encode($deliveryInfo->errors, JSON_UNESCAPED_UNICODE)); } $order_ = Order::findOne(['order_no' => $order_no, 'is_delete' => 0]); if (in_array($result['order_status'], [30000, 40000, 50000])) { $order_->trade_status = Order::ORDER_FLOW_SEND; } if (intval($result['order_status']) === 70000) { $order_->trade_status = Order::ORDER_FLOW_CONFIRM; } if (!$order_->save()) { throw new \Exception(json_encode($order_->errors, JSON_UNESCAPED_UNICODE)); } //如果取消订单 配送状态:取消 --- 调用取消接口 // 用户主动取消 --调用取消接口 if (in_array($result['order_status'], [20000, 20001, 60000])) { $result = $this->handleCancel(['order_no' => $order_no]); debug_log($result, 'delivery_.log'); } return [ 'code' => 0, 'msg' => '获取成功', 'data' => [ 'order_status' => $result['order_status'] ] ]; } throw new \Exception($result['errmsg'], $result['errcode']); } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } //模拟订单回调 https://api.weixin.qq.com/cgi-bin/express/intracity/mocknotify public function mockNotify($params) { $store_id = $params['store_id']; $order_no = $params['order_no']; $deliveryInfo = DeliveryInfo::findOne(['order_no' => $order_no]); $data = [ 'wx_order_id' => $deliveryInfo->wx_order_id, 'order_status' => 20000 ]; $form = new IndexController(); return $form->getUrlData($store_id, 'cgi-bin/express/intracity/queryorder', $data); } public function handleCancel($params) { try { $order_no = $params['order_no']; $order_ = Order::findOne(['order_no' => $order_no]); //取消订单 $order_revoke = new OrderRevokeForm(); $order_revoke->store_id = $order_->store_id; $order_revoke->order_id = $order_->id; $order_revoke->delete_pass = true; return $order_revoke->save(); } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } }