讀古今文學網 > 微信公眾平台開發:從零基礎到ThinkPHP5高性能框架實踐 > 10.2.3 訂單查詢 >

10.2.3 訂單查詢

微信小店的後台中提供了訂單查詢功能,但只有商家能使用,如果用戶需要查看自己的訂單,則要使用微信小店的接口來開發實現。這需要用到根據訂單狀態/創建時間獲取訂單詳情的接口。

根據訂單狀態/創建時間獲取訂單詳情的接口如下。


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所示。