使用「掃碼推事件」菜單,可以獲得掃碼結果,再通過第三方快遞查詢接口,可以實現掃瞄快遞條碼查詢快遞進度的功能。
微信類中創建菜單的函數如下。
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 快遞查詢效果圖