讀古今文學網 > 微信公眾平台開發:從零基礎到ThinkPHP5高性能框架實踐 > 5.3.2 掃瞄快遞條碼查詢快遞進度 >

5.3.2 掃瞄快遞條碼查詢快遞進度

使用「掃碼推事件」菜單,可以獲得掃碼結果,再通過第三方快遞查詢接口,可以實現掃瞄快遞條碼查詢快遞進度的功能。

微信類中創建菜單的函數如下。


 1 // 創建菜單
 2 public function create_menu($button, $matchrule = NULL)
 3 {
 4     foreach ($button as &$item) {
 5         foreach ($item as $k => $v) {
 6             if (is_array($v)){
 7                 foreach ($item[$k] as &$subitem) {
 8                     foreach ($subitem as $k2 => $v2) {
 9                         $subitem[$k2] = urlencode($v2);
10                     }
11                 }
12             }else{
13                 $item[$k] = urlencode($v);
14             }
15         }
16     }
17 
18     if (isset($matchrule) && !is_null($matchrule)){
19         foreach ($matchrule as $k => $v) {
20             $matchrule[$k] = urlencode($v);
21         }
22         $data = urldecode(json_encode(array('button' => $button, 'matchrule' => 
           $matchrule)));
23         $url = "https:// api.weixin.qq.com/cgi-bin/menu/addconditional?access_token=".
       $this->access_token;
24     }else{
25         $data = urldecode(json_encode(array('button' => $button)));
26         $url = "https:// api.weixin.qq.com/cgi-bin/menu/create?access_token=".$th
           is->access_token;
27     }
28     $res = $this->http_request($url, $data);
29     return json_decode($res, true);
30 }
  

上述代碼解讀如下。

第4~16行:將菜單數組中的中文值進行urlencode,這是為了後面將數組轉為JSON時不導致亂碼。

第18行:判斷是否有個性化菜單規則。

第19~23行:構建個性化菜單數據並將url接口定為個性化菜單接口。

第25~26行:構建自定義菜單數據並將url接口定為自定義菜單接口。

第28~29行:提交創建菜單請求並返回結果。

創建菜單的代碼如下。


 1 <?php
 2 require_once('weixin.class.php');
 3 $weixin = new class_weixin;
 4 
 5 $button = array('type' => "scancode_waitmsg",
 6                 'name' => "掃快遞碼",
 7                 'key'  => "rselfmenu_2_1"
 8                );
 9 $result = $weixin->create_menu($button);
10 var_dump($result);
11 ?>
  

執行後,底部生成菜單如圖5-2所示。

圖5-2 生成菜單

當點擊「掃快遞碼」菜單時,開發者接口將收到scancode_wait-msg事件消息,該消息的處理代碼如下。


 1 // 接收事件消息
 2 private function receiveEvent($object)
 3 {
 4     $content = "";
 5     switch ($object->Event)
 6     {
 7         case "subscribe":
 8             $content = "歡迎關注";
 9             break;
10         case "unsubscribe":
11             $content = "取消關注";
12             break;
13         case "scancode_waitmsg":
14             if ($object->ScanCodeInfo->ScanType == "barcode"){
15                 $codeinfo = explode(",",strval($object->ScanCodeInfo->ScanResult));
16                 $codeValue = $codeinfo[1];
17                 $content = array;
18                 $content = array("Title"=>"掃瞄成功",  "Description"=>"快遞號:
                   ".$codeValue."\r\n點擊查看快遞進度詳情", "PicUrl"=>"", "Url" =>
                   "http:// m.kuaidi100.com/result.jsp?nu=".$codeValue);
19             }else{
20                 $content = "不是條碼";
21             }
22             break;
23         default:
24             $content = "receive a new event: ".$object->Event;
25             break;
26     }
27 
28     if(is_array($content)){
29         $result = $this->transmitNews($object, $content);
30     }else{
31         $result = $this->transmitText($object, $content);
32     }
33     return $result;
34 }
  

上面代碼中,第13行檢測當前事件是否為掃瞄推事件,然後檢測當前碼是否為條形碼(第14行)。如果是條形碼,則將碼的數值解析出來(第15~16行),再組裝成一個單圖文消息,消息的鏈接地址為「快遞100」的查詢接口,其中參數為解析出來的快遞單號(第17~18行)。

圖5-3所示是一個快遞條碼,當使用案例中的公眾號菜單掃瞄該條碼時,會返回一個圖文消息。當用戶點擊該圖文消息時,將自動跳轉到「快遞100」的頁面中查詢該快遞的進度詳情,如圖5-4所示。

圖5-3 快遞條碼

圖5-4 快遞查詢效果圖