'暂时不需要邮寄', 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']); } } }