| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394 |
- <?php
- namespace app\utils\Delivery;
- use app\models\DeliveryInfo;
- use app\models\intracityService\IndexController;
- use app\models\Order;
- use app\models\WechatIntracityService;
- use app\modules\admin\models\OrderRevokeForm;
- use app\modules\admin\models\WechatDeliveryForm;
- class WechatNewDelivery
- {
- public $md_id = 171;
- public $store_id;
- //预下单 https://api.weixin.qq.com/cgi-bin/express/intracity/preaddorder
- //预览订单时查询运费-下单时查询运费-支付成功后查询运费是否一直,不一致提示配送费错误,请重新下单。- 下单后提交配送订单
- public function preAddOrder($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;
- $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()
- ];
- }
- }
- }
|