首页 » 微信公众平台开发:从零基础到ThinkPHP5高性能框架实践 » 微信公众平台开发:从零基础到ThinkPHP5高性能框架实践全文在线阅读

《微信公众平台开发:从零基础到ThinkPHP5高性能框架实践》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 快递查询效果图