微信小店的后台中提供了订单查询功能,但只有商家能使用,如果用户需要查看自己的订单,则要使用微信小店的接口来开发实现。这需要用到根据订单状态/创建时间获取订单详情的接口。
根据订单状态/创建时间获取订单详情的接口如下。
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所示。