微信小店的后台中提供了订单查询功能,但只有商家能使用,如果用户需要查看自己的订单,则要使用微信小店的接口来开发实现。这需要用到根据订单状态/创建时间获取订单详情的接口。
根据订单状态/创建时间获取订单详情的接口如下。
https:// api.weixin.qq.com/merchant/order/getbyid?access_token=ACCESS_TOKEN
该接口的POST数据格式如下,参数说明如表10-3所示。
{ "status": 2, "begintime": 1397130460, "endtime": 1397130470}
表10-3 订单查询接口的参数说明
返回数据格式如下,参数说明如表10-4所示。
{ "errcode": 0, "errmsg": "success", "order_list": [ { "order_id": "7197417460812533543", "order_status": 6, "order_total_price": 6, "order_create_time": 1394635817, "order_express_price": 5, "buyer_openid": "oDF3iY17NsDAW4UP2qzJXPsz1S9Q", "buyer_nick": "likeacat", "receiver_name": "方倍", "receiver_province": "广东省", "receiver_city": "广州市", "receiver_address": "华景路一号南方通信大厦5楼", "receiver_mobile": "123456", "receiver_phone": "123456", "product_id": "pDF3iYx7KDQVGzB7kDg6Tge5OKFo", "product_name": "《微信公众平台开发最佳实践》", "product_price": 1, "product_sku": "10000983:10000995;10001007:10001010", "product_count": 1, "product_img": "http:// mmbiz.qpic.cn/mmbiz/4whpV1VZl2icND8WwMThBEcehjh Dv2icY4GrDSG5RLM3B2qd9kOicWGVJcsAhvXfibhWRNoGOvCfMC33G9z5yQr2Qw/0", "delivery_id": "1900659372473", "delivery_company": "059Yunda", "trans_id": "1900000109201404103172199813" }, { "order_id": "7197417460812533569", "order_status": 8, "order_total_price": 1, "order_create_time": 1394636235, "order_express_price": 0, "buyer_openid": "oDF3iY17NsDAW4UP2qzJXPsz1S9Q", "buyer_nick": "likeacat", "receiver_name": "张三", "receiver_province": "广东省", "receiver_city": "广州市", "receiver_address": "华景路一号南方通信大厦5楼", "receiver_mobile": "123456", "receiver_phone": "123456", "product_id": "pDF3iYx7KDQVGzB7kDg6Tge5OKFo", "product_name": "《教爸爸妈妈用微信》", "product_price": 1, "product_sku": "1075741873:1079742377", "product_count": 1, "product_img": "http:// mmbiz.qpic.cn/mmbiz/4whpV1VZl2icND8WwMThBEcehjh Dv2icY4GrDSG5RLM3B2qd9kOicWGVJcsAhvXfibhWRNoGOvCfMC33G9z5yQr2Qw/0", "delivery_id": "1900659372473", "delivery_company": "059Yunda", "trans_id": "1900000109201404103172199813" } ]}
表10-4 订单查询接口返回内容的参数说明
为了在微信中实现订单查询,需要先将一个菜单设置为“订单查询”,该菜单的类型为“CLICK”,key值为“WDDD”。
菜单的实现代码如下。
1 require_once('weixin.class.php'); 2 $weixin = new class_weixin; 3 4 $button = array('type' => "view", 5 'name' => urlencode("微信小店"), 6 'url' => "http:// mp.weixin.qq.com/bizmall/mallshelf?id=&t=mall/ list&biz=MzANDQxNDUwNQ==&shelf_id=1&showwxpaytitle=1#wechat_ redirect", 7 ); 8 $button = array('name' => urlencode("更多"), 9 'sub_button' => array(array('type' => "click",10 'name' => urlencode("我的订单"),11 'key' => urlencode("WDDD")12 ),13 )14 );15 $menu = urldecode(json_encode(array('button' => $button)));16 var_dump($weixin->create_menu($menu));
当用户点击“我的订单”时,微信接口将接收到这一点击事件通知,并且调用微信小店的订单查询接口来查询当前用户的订单信息,实现代码如下。
1 // 接收事件消息 2 private function receiveEvent($object) 3 { 4 $content = ""; 5 switch ($object->Event) 6 { 7 case "subscribe": 8 $content = "欢迎关注方倍工作室"; 9 break; 10 case "CLICK": 11 switch ($object->EventKey) 12 { 13 case "WDDD": 14 require_once('weixin.class.php'); 15 $weixin = new class_weixin; 16 $openid = strval($object->FromUserName); 17 $orderArr = $weixin->get_detail_by_filter("{}"); 18 if ($orderArr["errcode"] == -1){ 19 $weixin->send_custom_message($openid, "text", "系统繁忙, 请稍后再试!"); 20 } 21 else if (count($orderArr["order_list"]) == 0){ 22 $weixin->send_custom_message($openid, "text", "没有查询 到订单记录!"); 23 }else{ 24 $data = array; 25 $data = array("title"=>urlencode("我的订单"), "description"=>"", "picurl"=>"", "url" =>""); 26 foreach ($orderArr["order_list"] as $index => $item){ 27 if($item["buyer_openid"] == $openid){ 28 $title = "编号:".$item["order_id"]."/n时间:". date("Y-m-d H:i:s",$item["order_create_time"]) ."/n名称:".$item["product_name"]."/n总:¥".($item ["product_price"] / 100)." × ".$item["product_ count"]." + ¥".($item["order_express_price"] / 100)." = ¥".($item["order_total_price"] / 100); 29 30 switch ($item["order_status"]) 31 { 32 case 2: 33 $orderstatus = "待发货"; 34 break; 35 case 3: 36 $orderstatus = "已发货"; 37 break; 38 case 5: 39 $orderstatus = "已完成"; 40 break; 41 case 8: 42 $orderstatus = "维权中"; 43 break; 44 default: 45 $orderstatus = "未知状态码". $item["order_status"]; 46 break; 47 } 48 $title .= "/n状态:".$orderstatus; 49 $url = ""; 50 if ($item["order_status"] == 3 && !empty($item ["delivery_company"])){ 51 switch ($item["delivery_company"]) 52 { 53 case "Fsearch_code": 54 $expressName = "邮政EMS"; 55 break; 56 case "002shentong": 57 $expressName = "申通快递"; 58 break; 59 case "066zhongtong": 60 $expressName = "中通速递"; 61 break; 62 case "056yuantong": 63 $expressName = "圆通速递"; 64 break; 65 case "042tiantian": 66 $expressName = "天天快递"; 67 break; 68 case "003shunfeng": 69 $expressName = "顺丰速运"; 70 break; 71 case "059Yunda": 72 $expressName = "韵达快运"; 73 break; 74 case "064zhaijisong": 75 $expressName = "宅急送"; 76 break; 77 case "020huitong": 78 $expressName = "汇通快运"; 79 break; 80 case "zj001yixun": 81 $expressName = "易迅快递"; 82 break; 83 default: 84 $expressName = "未知物流公司,ID:". $item["delivery_company"]; 85 break; 86 } 87 $title .= "/n物流:".$expressName." ".$item ["delivery_id"]; 88 if(preg_match("/^/d{3}[A-Za-z]{2,10}$/", $item["delivery_company"])){ 89 $companyEn = trim(substr($item["delivery_ company"],3,strlen($item["delivery_ company"]))); 90 $url = "http:// m.kuaidi100.com/result. jsp?com=".strtolower($companyEn)."&nu=". $item["delivery_id"]; 91 } 92 } 93 $data = array("title"=>urlencode($title), "description"=>"", "picurl"=>"", "url" =>$url); 94 } 95 if (count($data) >=9){break;} 96 } 97 98 if (count($data) == 1){ 99 $result = $weixin->send_custom_message($openid, "text", "没有查询到你的订单记录!");100 }else{101 $result = $weixin->send_custom_message($openid, "news", $data);102 }103 }104 $content = "";105 break;106 default:107 $content = "空菜单响应!";108 break;109 }110 break;111 }112 if(is_array($content)){113 if (isset($content[0])){114 $result = $this->transmitNews($object, $content);115 }else if (isset($content['MusicUrl'])){116 $result = $this->transmitMusic($object, $content);117 }118 }else{119 $result = $this->transmitText($object, $content);120 }121 return $result;122 }
在上述代码中与订单查询通知相关部分的简要说明如下。
第13行:判断是否收到订单查询事件通知。
第14~17行:引用微信小店SDK,获取当前的所有订单信息。
第18~23行:用于查询订单接口的异常判断。
第24~96行:遍历订单详细中的所有订单列表,将当前用户的订单内容填充到微信图文消息中。
第98~102行:使用客服接口将订单详情通过图文消息方式发送。
我的订单查询实现效果如图10-28所示。