| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443 |
- <?php
- namespace bizGhs\express\services;
- //小程序 即使配送相关接口 lqh 2021.2.4
- use bizHd\wx\classes\WxOpenClass;
- use biz\express\classes\ExpressClass;
- use common\components\miniUtil;
- use common\components\util;
- class MiniExpressService
- {
- //订单取消原因
- public static $cancelOrderReasonMap = [
- 1=>'暂时不需要邮寄',
- 2=>'价格不合适',
- 3=>'订单信息有误,重新下单',
- 4=>'骑手取货不及时',
- 5=>'骑手配送不及时',
- 6=>'其他原因', //如果选择6,需要填写取消原因,否则不需要填写
- ];
- //order_status 枚举值
- /*
- * 最终状态包括成功状态302,失败状态: 103,203,204,205,401,501,502。
- 当状态更新时,我们会在关键节点给收件用户推送服务通知,告知配送状态,
- 同一配送单常态下会收到三条通知,即【骑手已接单】、【骑手已取货,配送中】、【配送已完成】,
- 配送异常时会下发【配送异常】服务通知。
- 骑手已接单 102
- 骑手已取货,配送中 202或301
- 配送已完成 302
- 配送异常 203、204、205、303、304、305、501、502
- */
- public static $orderStatusMap = [
- 101=>'等待分配骑手',//配送公司接单阶段——等待分配骑手,即初始状态
- 102=>'骑手已接单',//配送公司接单阶段——分配骑手成功
- 103=>'商家取消订单',//配送公司接单阶段——商家取消订单, 订单结束
- 201=>'骑手到店开始取货',//骑手取货阶段——骑手到店开始取货
- 202=>'取货成功',//骑手取货阶段——取货成功
- 203=>'取货失败,商家取消订单',//骑手取货阶段——取货失败,商家取消订单, 订单结束
- 204=>'取货失败,骑手因自身原因取消订单',//骑手取货阶段——取货失败,骑手因自身原因取消订单, 订单结束
- 205=>'取货失败,骑手因商家原因取消订单',//骑手取货阶段——取货失败,骑手因商家原因取消订单, 订单结束
- 301=>'配送中',//骑手配送阶段——配送中
- 302=>'配送成功',//骑手配送阶段——配送成功, 订单结束
- 303=>'商家取消订单,配送物品开始返还商家',//骑手配送阶段——商家取消订单,配送物品开始返还商家
- 304=>'无法联系收货人,配送物品开始返还商家',//骑手配送阶段——无法联系收货人,配送物品开始返还商家
- 305=>'收货人拒收,配送物品开始返还商家',//骑手配送阶段——收货人拒收,配送物品开始返还商家
- 401=>'货品返还商户成功',//骑手返回配送货品阶段——货品返还商户成功, 订单结束
- 501=>'因运力系统原因取消, 订单结束',//因运力系统原因取消, 订单结束
- 502=>'因不可抗拒因素取消,订单结束',//因不可抗拒因素(天气,道路管制等原因)取消,订单结束
- ];
- //获取已支持的配送公司列表接口(改为查 数据库 xhExpress)
- /*
- * [{"delivery_id":"SFTC","delivery_name":"顺丰同城急送"},{"delivery_id":"SS","delivery_name":"闪送"},{"delivery_id":"MTPS","delivery_name":"美团配送"},{"delivery_id":"DADA","delivery_name":"达达"}]
- */
- public static function getAllImmeDelivery($select='*',$where=[])
- {
- // $merchant = self::getGhsWxInfo();
- // $res = miniUtil::getAllImmeDelivery($merchant,2);
- // self::handleReturn($res);
- // return $res;
- $res = ExpressClass::getExpressAll($select,$where);
- return $res;
- }
- //下单
- /**
- * @param int $expressId 哪家快递 xhExpress 主键ID
- * @param string $shopNo 门店ID(商家ID)
- * @param string $orderSn 订单号
- * @param string $openId 下单用户的openid
- * @param array $sender 发件人信息,顺丰同城急送必须填写,美团配送、达达、闪送,若传了shop_no的值可不填该字段
- * @param array $receiver 收件人信息
- * @param array $cargo 货物信息
- * @param array $orderInfo 订单信息
- * @param array $shop 商品信息,会展示到物流通知消息中
- * @param string $subBizId 子商户id,区分小程序内部多个子商户
- * @return mixed
- */
- /*
- * https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-business/immediateDelivery.addOrder.html
- * 'sender'=>[
- 'name'=>'test', //必填:姓名,最长不超过256个字符
- 'city'=>'厦门市', //必填:城市名称,如广州市
- 'address'=>'思明区', //必填:地址(街道、小区、大厦等,用于定位)
- 'address_detail'=>'软件园二期', //必填:地址详情(楼号、单元号、层号)
- 'phone'=>'19959271111', //必填:电话/手机号,最长不超过64个字符
- 'lng'=>118.134343, //必填:经度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,确到小数点后6位
- 'lat'=>24.483566, //必填:纬度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,精确到小数点后6位)
- 'coordinate_type'=>0, //非必填:坐标类型,0:火星坐标(高德,腾讯地图均采用火星坐标) 1:百度坐标
- ],
- 'receiver'=>[
- 'name'=>'test', //必填:姓名,最长不超过256个字符
- 'city'=>'厦门市', //必填:城市名称,如广州市
- 'address'=>'思明区', //必填:地址(街道、小区、大厦等,用于定位)
- 'address_detail'=>'软件园二期', //必填:地址详情(楼号、单元号、层号)
- 'phone'=>'19959271111', //必填:电话/手机号,最长不超过64个字符
- 'lng'=>118.134343, //必填:经度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,确到小数点后6位
- 'lat'=>24.483566, //必填:纬度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,精确到小数点后6位)
- 'coordinate_type'=>0, //非必填:坐标类型,0:火星坐标(高德,腾讯地图均采用火星坐标) 1:百度坐标
- ],
- 'cargo'=>[
- 'goods_value'=>1, //必填:货物价格,单位为元,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-5000]
- 'goods_weight'=>0.1 //必填: 货物重量,单位为kg,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-50]
- 'goods_height'=>0.1,//非必填: 货物高度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-45]
- 'goods_length'=>0.1,//非必填: 货物长度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-65]
- 'goods_with'=>0.1,//非必填: 货物宽度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-50]
- 'goods_pickup_info'=>'', //非必填: 货物取货信息,用于骑手到店取货,最长不超过100个字符
- 'goods_delivery_info'=>'', //非必填: 货物交付信息,最长不超过100个字符
- 'cargo_first_class'=>'鲜花', //可以固定写死
- 'cargo_second_class'=>'鲜花',//可以固定写死
- 'goods_detail'=>[ //非必填:货物详情
- 'goods'=>[
- [
- 'good_count'=>1, //必填:货物数量
- 'good_name'=>'', //必填:货品名称
- 'good_price'=>1, //非必填:货品单价,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数)
- 'good_unit'=>'', //非必填:货品单位,最长不超过20个字符
- ],
- ]
- ],
- ],
- 'order_info'=>[ //可以不填?
- ],
- 'shop'=>[
- 'wxa_path'=>'/shop',
- 'img_url'=>'http://www.baidu.com/test.png',
- 'goods_name'=>'test',
- 'goods_count'=>1,
- ],
- */
- public static function addOrder(int $expressId,string $shopNo,string $orderSn,string $openId,array $sender,array $receiver,array $cargo,array $orderInfo,array $shop, string $subBizId='')
- {
- $merchant = self::getGhsWxInfo();
- //通过 $expressId, 获取 appKey, appSecret
- $expressData = self::getExpressInfo($expressId);
- $shopId = $expressData['appKey']; //app_key
- $shopOrderId = $orderSn;
- $appSecret = $expressData['appSecret'];//app_secrect
- $delivery_id = $expressData['deliveryId'];
- $delivery_sign = self::getDeliverySign($shopId,$appSecret,$shopOrderId);
- $data = [
- 'shopid'=>$shopId,
- 'shop_order_id'=>$orderSn,
- 'shop_no'=>$shopNo,
- 'delivery_sign'=>$delivery_sign, //delivery_sign=SHA1(shopid + shop_order_id + AppSecret)
- 'delivery_id'=>$delivery_id,
- 'openid'=>$openId,
- 'sender'=>$sender,
- 'receiver'=>$receiver,
- 'cargo'=>$cargo,
- 'order_info'=>$orderInfo,
- 'shop'=>$shop,
- ];
- if(empty($orderInfo)) {
- unset($data['order_info']);
- }
- $res = miniUtil::addOrder($data,$merchant, 2);
- self::handleReturn($res);
- return $res;
- }
- //增加小费
- /*
- * "shopid": "123456",
- "shop_order_id": "123456",
- "waybill_id": "123456",
- "tips": 5,
- "remark": "gogogo",
- "delivery_sign": "123456",
- "shop_no": "shop_no_111"
- */
- /**
- * @param int $expressId xhExpressLocal 主键ID
- * @param string $orderSn 订单号
- * @param string $waybillId 快递方的订单号
- * @param string $shopNo 店铺ID
- * @param float $tips 小费
- * @param string $remark 备注说明
- * @return mixed
- */
- public static function addTip(int $expressId,string $orderSn, string $waybillId, string $shopNo, float $tips,string $remark='')
- {
- $merchant = self::getGhsWxInfo();
- $expressData = self::getExpressInfo($expressId);
- $data = [
- 'shopid'=>$expressData['appKey'],
- 'shop_order_id'=>$orderSn,
- 'waybill_id'=>$waybillId,
- 'tips'=>$tips,
- 'remark'=>$remark,
- 'shop_no'=>$shopNo,
- 'delivery_sign'=>self::getDeliverySign($expressData['appKey'],$expressData['appSecret'],$orderSn),
- ];
- $res = miniUtil::addOrder($data,$merchant, 2);
- self::handleReturn($res);
- return $res;
- }
- //取消订单
- /*
- * {
- "shopid": "123456",
- "shop_order_id": "123456",
- "waybill_id": "123456",
- "delivery_id": "123456",
- "cancel_reason_id": 1,
- "cancel_reason": "",
- "delivery_sign": "123456",
- "shop_no": "shop_no_111"
- }
- */
- public static function cancelOrder(int $expressId,string $orderSn,string $waybillId, string $shopNo,int $reasonId,string $reason='')
- {
- $merchant = self::getGhsWxInfo();
- $expressData = self::getExpressInfo($expressId);
- $data = [
- 'shopid'=>$expressData['appKey'],
- 'shop_order_id'=>$orderSn,
- 'waybill_id'=>$waybillId,
- 'delivery_id'=>$expressData['deliveryId'],
- 'cancel_reason_id'=>$reasonId,
- 'cancel_reason'=>$reason,
- 'shop_no'=>$shopNo,
- 'delivery_sign'=>self::getDeliverySign($expressData['appKey'],$expressData['appSecret'],$orderSn),
- ];
- $res = miniUtil::cancelOrder($data,$merchant,2);
- self::handleReturn($res);
- return $res;
- }
- //获取运单数据
- /*
- 'shopid'=>'',
- 'shop_order_id'=>'',
- 'shop_no'=>'',
- 返回数据:
- (
- [resultcode] => 0
- [resultmsg] => ok
- [order_status] => 302
- [agent_info] => Array
- (
- )
- [waybill_id] => test_waybill_id
- [rider_name] => 我是小哥
- [rider_phone] => 13712345678
- [order_token] => NsXweKCKhSyAEIhAdnX3TYZsVDES0-t-tymHDONG0MpRsF31dQvVxiP_JJvLFaKS-kwXuOG3D0hzKkl7o-gzew
- )
- */
- /**
- * @param int $expressId
- * @param string $orderSn
- * @param string $shopNo
- * @return mixed
- */
- public static function getOrder(int $expressId,string $orderSn,string $shopNo)
- {
- $merchant = self::getGhsWxInfo();
- $expressData = self::getExpressInfo($expressId);
- $data =[
- 'shopid'=>$expressData['appKey'],
- 'shop_order_id'=>$orderSn,
- 'shop_no'=>$shopNo,
- ];
- $res = miniUtil::getOrder($data,$merchant,2);
- self::handleReturn($res);
- return $res;
- }
- //更新快递状态(沙箱)
- /*
- * {
- "shopid": "test_shop_id",
- "shop_order_id": "xxxxxxxxxxx",
- "action_time": 12345678,
- "order_status": 101,
- "action_msg": "",
- }
- */
- /**
- * @param int $expressId 快递ID
- * @param string $orderSn 唯一标识订单的 ID,由商户生成
- * @param int $orderStatus 配送状态
- * @param string $actionMsg 附加信息
- * @return mixed
- */
- /*
- * 返回数据:
- * {
- "resultcode": 0,
- "resultmsg": "ok"
- }
- */
- public static function mockUpdateOrder(int $expressId,string $orderSn,int $orderStatus,string $actionMsg='')
- {
- $merchant = self::getGhsWxInfo();
- $expressData = self::getExpressInfo($expressId);
- $data =[
- 'shopid'=>$expressData['appKey'],
- 'shop_order_id'=>$orderSn,
- 'action_time'=>time(),
- 'order_status'=>$orderStatus,
- 'action_msg'=>$actionMsg,
- ];
- $res = miniUtil::mockUpdateOrder($data,$merchant,2);
- self::handleReturn($res);
- return $res;
- }
- //预下配送单接口 (参数跟下单一样)
- /*
- 返回数据:
- {
- "resultcode": 0,
- "resultmsg": "ok",
- "fee": 10,
- "deliverfee": 10,
- "couponfee": 0,
- "tips": 0,
- "insurancfee": 0,
- "distance": 1000,
- "dispatch_duration": 300,
- "delivery_token": "1111111"
- }
- */
- public static function preAddOrder(int $expressId,string $shopNo,string $orderSn,string $openId,array $sender,array $receiver,array $cargo,array $orderInfo,array $shop, string $subBizId='')
- {
- $merchant = self::getGhsWxInfo();
- //通过 $expressId, 获取 appKey, appSecret
- $expressData = self::getExpressInfo($expressId);
- $shopId = $expressData['appKey']; //app_key
- $shopOrderId = $orderSn;
- $appSecret = $expressData['appSecret'];//app_secrect
- $delivery_id = $expressData['deliveryId'];
- $delivery_sign = self::getDeliverySign($shopId,$appSecret,$shopOrderId);
- if(!$shopNo){
- //$shopNo = $expressData['shopNo'];
- }
- $data = [
- 'shopid'=>(string)$shopId,
- 'shop_order_id'=>$orderSn,
- 'shop_no'=>$shopNo,
- 'delivery_sign'=>$delivery_sign, //delivery_sign=SHA1(shopid + shop_order_id + AppSecret)
- 'delivery_id'=>$delivery_id,
- 'openid'=>$openId,
- 'sender'=>$sender,
- 'receiver'=>$receiver,
- 'cargo'=>$cargo,
- 'order_info'=>$orderInfo,
- 'shop'=>$shop,
- ];
- if(empty($orderInfo)) {
- unset($data['order_info']);
- }
- $res = miniUtil::preAddOrder($data,$merchant, 2);
- self::handleReturn($res);
- return $res;
- }
- //预取消配送单接口
- /*
- * {
- "shopid": "123456",
- "shop_order_id": "123456",
- "waybill_id": "123456",
- "delivery_id": "123456",
- "cancel_reason_id": 1,
- "cancel_reason": "",
- "delivery_sign": "123456",
- "shop_no": "shop_no_111"
- }
- 返回数据:
- {
- "resultcode": 0,
- "resultmsg": "ok",
- "deduct_fee": 5,
- "desc": "blabla"
- }
- */
- public static function preCancelOrder(int $expressId,string $orderSn,string $waybillId, string $shopNo,int $reasonId,string $reason='')
- {
- $merchant = self::getGhsWxInfo();
- $expressData = self::getExpressInfo($expressId);
- $data = [
- 'shopid'=>$expressData['appKey'],
- 'shop_order_id'=>$orderSn,
- 'waybill_id'=>$waybillId,
- 'delivery_id'=>$expressData['deliveryId'],
- 'cancel_reason_id'=>$reasonId,
- 'cancel_reason'=>$reason,
- 'shop_no'=>$shopNo,
- 'delivery_sign'=>self::getDeliverySign($expressData['appKey'],$expressData['appSecret'],$orderSn),
- ];
- $res = miniUtil::preCancelOrder($data,$merchant,2);
- self::handleReturn($res);
- return $res;
- }
- //重新下单(暂不支持。可以先取消,再下单)
- //运力签名 lqh 2021.2.3
- public static function getDeliverySign($shopId,$appSecret,$shopOrderId)
- {
- return sha1($shopId.$shopOrderId.$appSecret);
- }
- public static function getGhsWxInfo()
- {
- return WxOpenClass::getGhsWxInfo();
- }
- public static function getExpressInfo($expressId)
- {
- return ExpressClass::getExpressInfo($expressId);
- }
- public static function handleReturn($res)
- {
- if(isset($res['errcode'])){
- util::fail($res['errmsg']);
- }
- if($res['resultcode'] != 0 ){
- if (getenv('YII_ENV', 'local') == 'production') {
- util::fail('出错啦!请联系客服');
- }
- util::fail($res['resultmsg']);
- }
- }
- }
|