你所在的位置:微信群>互联网推广>正文

微信小店的二次开发

原创
发布时间: 2023-07-11 10:57:57 热度: 192 作者: 李斯特 来源: 微信加 本文共 28318 字 阅读需要 95 分钟
微信小店已经具有一个商城的基本功能,这包括商品管理、订单管理、货架管理、运费管理等功能,但还不够完善,比如没有购物车、没有订单查询等功能。

微信小店已经具有一个商城的基本功能,这包括商品管理、订单管理、货架管理、运费管理等功能,但还不够完善,比如没有购物车、没有订单查询等功能。根据微信小店提供的 API 接口及第三方接口,可以开发其他几个常用的功能,包括付款交易通知、订单明细查询以及快递查询功能,另外还可以在菜单中加入维权功能。

微信小店 SDK

在正式讲解开发内容之前,我们需要先将常用功能函数写入类中,以便在后面的章节中调用。以下是方倍工作室开发的用于微信小店的 SDK 代码。

1 <?php 2 3 /* 4 方倍工作室 5 CopyRight 2014 All Rights Reserved 6 */ 7 require_once('config.php'); //引用配置 8 9 class class_weixin 10 { 11 var $appid = APPID; 12 var $appsecret = APPSECRET; 13 14 //构造函数,获取 Access Token 15 public function __construct($appid = NULL, $appsecret = NULL) 16 { 17 if($appid && $appsecret){ 18 $this->appid = $appid; 19 $this->appsecret = $appsecret; 20 } 21 22 $url = 「https://api.weixin.qq.com/cgi-bin/token?grant_ type=client_credential&appid=」.$this->appid.「&secret=」.$this->appsecret; 23 $res = $this->http_request($url); 24 $result = json_decode($res, true); 25 //save to Database or Memcache 26 $this->access_token = $result[「access_token」]; 27 $this->lasttime = time(); 28 } 29 30 //创建菜单 31 public function create_menu($data) 32 { 33 $url = 「https://api.weixin.qq.com/cgi-bin/menu/ create?access_token=」.$this->access_token; 34 $res = $this->http_request($url, $data); 35 return json_decode($res, true); 36 } 37 38 //根据订单 ID 获取订单详情 39 public function get_detail_by_order_id($id) 40 { 41 $data = array(『order_id』 =>$id); 42 $url = 「https://api.weixin.qq.com/merchant/order/ getbyid?access_token=」.$this->access_token; 43 $res = $this->http_request($url, json_encode($data)); 44 return json_decode($res, true); 45 } 46 47 //根据订单状态/创建时间获取订单详情 48 public function get_detail_by_filter($data = null) 49 { 50 $url = 「https://api.weixin.qq.com/merchant/order/ getbyfilter?access_token=」.$this->access_token; 51 $res = $this->http_request($url, $data); 52 return json_decode($res, true); 53 } 54 55 //发送客服消息,已实现发送文本,其他类型可扩展 56 public function send_custom_message($touser, $type, $data) 57 { 58 $msg = array(『touser』 =>$touser); 59 $msg[『msgtype』] = $type; 60 switch($type) 61 { 62 case 『text』: 63 $msg[$type] = array(『content'=>urlencode($data)); 64 break; 65 case 』news『: 66 $msg[$type] = array(』articles'=>$data); 67 break; 68 default: 69 $msg[『text』] = array(『content'=>urlencode(「不支持 的消息类型 」.$type)); 70 break; 71 } 72 $url = 「https://api.weixin.qq.com/cgi-bin/message/custom/ send?access_token=」.$this->access_token; 73 return $this->http_request($url, urldecode(json_encode($msg))); 74 } 75 76 //发送模板消息 77 public function send_template_message($data) 78 { 79 $url = 「https://api.weixin.qq.com/cgi-bin/message/template/ send?access_token=」.$this->access_token; 80 $res = $this->http_request($url, $data); 81 return json_decode($res, true); 82 } 83 84 //https 请求(支持 GET 和 POST) 85 protected function http_request($url, $data = null) 86 { 87 $curl = curl_init(); 88 curl_setopt($curl, CURLOPT_URL, $url); 89 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 90 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); 91 if (!empty($data)){ 92 curl_setopt($curl, CURLOPT_POST, 1); 93 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); 94 } 95 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 96 $output = curl_exec($curl); 97 curl_close($curl); 98 return $output; 99 } 100 }

上述代码定义了微信小店的类,在类中定义了本章开发实现需要用到的方法,这包括前面章节提到的创建自定义菜单、客服消息及模板消息等功能,以及需要用到的根据订单 ID 获取订单详情和根据订单状态/创建时间获取订单详情两个方法,这两个方法的使用方法在后面的章节有详细介绍。

付款交易通知

用户在微信中付款成功后,微信服务器会将订单付款通知推送到开发者在公众平台网站中设置的回调 URL(在开发模式中设置)中。该通知是一个 merchant_order 事件通知。

微信推送的 merchant_order 事件消息内容如下:

<xml> <ToUserName><![CDATA[weixin_media1]]></ToUserName> <FromUserName><![CDATA[oDF3iYyVlek46AyTBbMRVV8VZVlI]]></FromUserName> <CreateTime>1398144192</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[merchant_order]]></Event> <OrderId><![CDATA[7197417460812584720]]></OrderId> <OrderStatus>2</OrderStatus> <ProductId><![CDATA[pDF3iYx7KDQVGzB7kDg6Tge5OKFo]]></ProductId> <SkuInfo><![CDATA[10001:1000012;10002:100021]]></SkuInfo> </xml>

其中的 OrderId 参数即为该次交易的订单 ID 号。我们可以根据订单 ID 查询订单详情。

根据订单 ID 查询订单详情接口如下所示:

https://api.weixin.qq.com/merchant/order/getbyid?access_token=ACCESS_TOKEN

该接口的 POST 数据格式如下,参数说明如表 7-1 所示。

{ "order_id": "7197417460812584720" }

表 7-1 订单查询接口参数说明

返回数据格式如下,参数说明如表 7-2 所示。

{ 「errcode」: 0, 「errmsg」: 「success」, 「order」: { 「order_id」: 「7197417460812533543」, 「order_status」: 6, 「order_total_price」: 69, 「order_create_time」: 1394635817, 「order_express_price」: 5, 「buyer_openid」: 「oDF3iY17NsDAW4UP2qzJXPsz1S9Q」, 「buyer_nick」: 「方倍」, 「receiver_name」: 「方倍工作室」, 「receiver_province」: 「广东省」, 「receiver_city」: 「深圳市」, 「receiver_address」: 「华景路一号南方通信大厦 5 楼」, 「receiver_mobile」: 「123456789」, 「receiver_phone」: 「123456789」, 「product_id」: 「pDF3iYx7KDQVGzB7kDg6Tge5OKFo」, 「product_name」: 「包邮正版 《微信公众平台开发最佳实践》 双十一特惠」, 「product_price」: 1, 「product_sku」: 「10000983:10000995;10001007:10001010」, 「product_count」: 1, 「product_img」: 「http://img2.paipaiimg.com/00000000/item-52B87243-63CCF66C00000000040100003565C1EA.0.300x300.jpg」, 「delivery_id」: 「1900659372473」, 「delivery_company」: 「059Yunda」, 「trans_id」: 「1900000109201404103172199813」 } }

表 7-2 订单查询接口返回内容参数说明

付款通知在事件消息中的实现代码如下所示。

1 //接收事件消息 2 private function receiveEvent($object) 3 { 4 $content = 「」; 5 switch ($object->Event) 6 { 7 case 「subscribe」: 8 $content = 「欢迎关注方倍工作室」; 9 break; 10 case 「merchant_order」: 11 $orderid = strval($object->OrderId); 12 $openid = strval($object->FromUserName); 13 require_once(『weixin.class.php』); 14 $weixin = new class_weixin(); 15 $orderArr0 = $weixin->get_detail_by_order_id($orderid); 16 $orderArr = $orderArr0[「order」]; 17 18 //模板消息发送 消费品 - 消费品 - 购买成功通知 19 $template = array(『touser』 => $openid, 20 『template_id』 => 「-dEAy_IB2iUY8aePSMHfnxpJvxKf1rwuMd_4tLNyGF4」, 21 『url』 => 「」, 22 『topcolor』 => 「#7B68EE」, 23 『data』 => array(『first'=> array(』value『 => urlencode(「您好,方倍,欢迎使用模板消息。」), 24 』color『 => 「#000000」, 25 ), 26 』product'=> array(『value』 => urlencode ($orderArr[「product_name」]), 27 『color』 => 「#000093」, 28 ), 29 『price』 => array(『value』 => urlencode(「¥」.($orderArr[「order_total_price」] / 100)), 30 『color』 => 「#FF0000」, 31 ), 32 『time』 => array(『value』 => urlencode(date(「Y-m-d H:i:s」, ($orderArr[「order_create_time」]))), 33 『color』 => 「#006000」, 34 ), 35 『remark』 => array(『value』 => urlencode(「你的订单已提交,我们将尽快发货,祝您生活愉快!」), 36 『color』 => 「#000000」, 37 ), 38 ) 39 ); 40 $result = $weixin->send_template_message(urldecode(json_encode($template))); 41 42 $content = 「」; 43 break; 44 default: 45 $content = 「」; 46 break; 47 48 } 49 if(is_array($content)){ 50 if (isset($content[0])){ 51 $result = $this->transmitNews($object, $content); 52 }else if (isset($content[『MusicUrl』])){ 53 $result = $this->transmitMusic($object, $content); 54 } 55 }else{ 56 $result = $this->transmitText($object, $content); 57 } 58 59 return $result; 60 }

上述代码中和订单查询通知相关部分简要说明如下:

第 10 行:判断是否收到订单付款通知。

第 11 行 ~ 第 12 行:获取用户的 OpenID 及订单 ID。

第 13 行 ~ 第 16 行:引用微信小店 SDK,根据订单 ID 查询订单详情。

第 18 行 ~ 第 40 行:将订单详情中的内容填充进微信模板消息中并发送。

最后,一个购买成功通知的模板消息实现如图 7-30 所示。

图 7-30 购买成功通知

我的订单查询

微信小店的后台提供订单查询功能,但那是给商家看的,如果用户需要查看自己的订单,则要使用微信小店的接口来开发实现。这需要用到根据订单状态/创建时间获取订单详情接口。

根据订单状态/创建时间获取订单详情接口如下所示:

https://api.weixin.qq.com/merchant/order/getbyid?access_token=ACCESS_TOKEN

该接口的 POST 数据格式如下,参数说明如表 7-3 所示。

{ "status": 2, "begintime": 1397130460, "endtime": 1397130470 }

表 7-3 订单查询接口参数说明

返回数据格式如下,参数说明如表 7-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/4whpV1VZl2icND8WwM ThBEcehjhDv2icY4GrDSG5RLM3B2qd9kOicWGVJcsAhvXfibhWRNoGOvCfMC33G9z5yQr2Qw/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/4whpV1VZl2icND8WwM ThBEcehjhDv2icY4GrDSG5RLM3B2qd9kOicWGVJcsAhvXfibhWRNoGOvCfMC33G9z5yQr2Qw/0」, 「delivery_id」: 「1900659372473」, 「delivery_company」: 「059Yunda」, 「trans_id」: 「1900000109201404103172199813」 } ] }

表 7-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」]) 29 .「\n 名称:」.$item[「product_name」].「\n 总价:¥」.($item[「product_price」] / 100).「 × 」.$item[「product_count」].「 + ¥」.($item[「order_express_price」] / 100).「 = ¥」.($item[「order_total_price」] / 100); 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 行:使用客服接口将订单详情通过图文消息方式发送。

最后,我的订单查询实现如图 7-31 所示。

图 7-31 我的订单查询结果

快递物流查询

发货后,快递查询是一个最常用的功能需求。我们使用爱查快递的查询接口来实现快递查询功能。

爱查快递已集成国内外近百家常见快递/物流/COD 公司单号和网点查询功能,如 EMS 快递、顺丰快递、申通快递、圆通快递、中通快递、韵达快递、天天快递、汇通快递、宅急送快递、CCES、华宇物流、速尔快递、优速快递等,我们使用爱查快递来作为我们的快递查询接口,它的接口申请地址为:http://api.ickd.cn/users/。

使用邮箱在爱查快递网站上注册一个新用户,然后登录,登录后如图 7-32 所示。

图 7-32 爱查快递 API 管理中心

左侧菜单目录中的「API 申请」中包括「申请正式 API」和「申请临时 API」。如果需要长期稳定的接口,请选择申请正式 API。这里以申请临时 API 为例,申请成功后的界面如图 7-33 所示。

图 7-33 爱查快递 API 基本信息

爱查快递的接口请求地址如下:

http://api.ickd.cn/?id=[]&secret=[]&com=[]&nu=[]&type=[]&encode=[]&ord=[]&lang=[]

该接口相关参数说明如表 7-5 所示。

表 7-5 爱查快递接口参数说明

爱查快递目前支持的快递公司包括:AAE 快递、安捷快递、安信达快递、Aramex 国际快递、巴伦支、宝通达、成都奔腾国际快递、CCES 快递、长通物流、程光快递、城际快递、城市 100、传喜快递、传志快递、出口易物流、CityLinkExpress、东方快递、城市之星、大田物流、大洋物流快递、德邦物流、德创物流、DHL 快递、店通快递、递达快递、叮咚快递、递四方速递、DPEX 快递、D 速快递、百福东方物流、EMS 快递、凡宇快递、Fardar、国际 Fedex、Fedex 国内、飞邦物流、飞豹快递、原飞航物流、飞狐快递、飞特物流、飞远物流、丰达快递、飞康达快递、广东邮政物流、邮政国内小包、共速达物流、国通快递、山东海红快递、海盟速递、昊盛物流、河北建华快递、恒路物流、华诚物流、华翰物流、华企快递、华夏龙物流、天地华宇物流、汇强快递、汇通快递、海外环球快递、佳吉快运、佳怡物流、加运美快递、金大物流、京广快递、晋越快递、急先达物流、嘉里大通物流、康力物流、顺鑫(KCS)快递、快捷快递、宽容物流、跨越快递、乐捷递快递、联昊通快递、成都立即送快递、龙邦快递、民邦快递、明亮物流、闽盛快递、尼尔快递、港中能达快递、OCS 快递、平安达、中国邮政平邮、品速心达快递、全晨快递、全峰快递、全际通快递、全日通快递、全一快递、RPX 保时达、如风达快递、赛澳递、三态速递、伟邦(SCS)快递、圣安物流、盛丰物流、盛辉物流、申通快递、顺丰快递、穗佳物流、速尔快递、天天快递、TNT 快递、通成物流、通和天下物流、UPS 快递、USPS 快递、万博快递、万家物流、微特派、祥龙运通快递、新邦物流、信丰快递、希优特快递、源安达快递、亚风快递、一邦快递、银捷快递、音素快运、亿顺航快递、优速快递、北京一统飞鸿快递、远成物流、圆通快递、元智捷诚、越丰快递、誉美捷快递、韵达快递、运通中港快递、宇鑫物流、源伟丰、宅急送快递、郑州建华快递、芝麻开门快递、济南中天万运、中通快递、忠信达快递、中邮物流。

使用爱查快递接口、查询顺丰快递,运单单号 113819507900,URL 构造如下所示:

http://api.ickd.cn/?id=103223&secret=5d91adb21d97d109130d4671369910f4&com=shunfeng&nu=113819507900&type=json&encode=utf8

该接口返回结果如下:

{ 「status」: 「1」, 「message」: 「」, 「errCode」: 「0」, 「data」: [ { 「time」: 「2014-02-15 11:00」, 「context」: 「已收件」 }, { 「time」: 「2014-02-15 12:19」, 「context」: 「快件在东莞,准备送往下一站东莞集散中心」 }, { 「time」: 「2014-02-16 01:40」, 「context」: 「快件在东莞集散中心,准备送往下一站」 } ], 「html」: 「」, 「mailNo」: 「113819507900」, 「expTextName」: 「顺丰快递」, 「expSpellName」: 「shunfeng」, 「update」: 「1392549644」, 「cache」: 「0」, 「ord」: 「ASC」, 「tel」: 「4008-111-111」 }

上述返回结果字段说明如表 7-6 所示。

表 7-6 爱查快递接口返回字段说明

根据上述接口,我们编写的快递查询代码如下:

function getIckdExpressInfo($companyEn, $number) { $appid = "103223"; $secret = "5d91adb21d97d109130d4671369910f4"; $url= "http://api.ickd.cn/?id=".$appid."&secret=".$secret."&com=".$ companyEn. "&nu=".$number."&type=json&encode=utf8"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); if(curl_errno($ch)) { echo 'CURL ERROR Code: '.curl_errno($ch).', reason: '.curl_error($ch);} curl_close($ch); $AllInfo = json_decode($output, true); if($AllInfo['message'] != "" ){ return $AllInfo['message']; }else{ $result = ""; foreach ($AllInfo["data"] as $singleStep) { $result .= $singleStep["time"]." ".$singleStep["context"]."\n"; } return trim($result); } }

我们希望能查询到所有快递公司的运单信息。在查询的时候,一般使用快递公司名再加上单号的方法,而快递公司名称既有中文名称也有英文名称,根据这一原则,我们使用正则表达式来判断,相应代码编写如下:

private function receiveText($object) { $keyword = trim($object->Content); if (preg_match(「/[\x{4e00}-\x{9fa5}]{2,4}\s{0,}\w{8,15}/u」,$keyword) || preg_match(「/[A-Za-z]{3,9}\s{0,}\w{8,15}/u」,$keyword) ){ include(「express.php」); $content = getExpressInfo($keyword); }else{ $content = 「不是快递查询格式?」; } $result = $this->transmitText($object, $content); return $result; }

在上述代码中,判断用户发送过来的信息是否满足以下规则:

□2~4 位汉字 +0~N 个空格 +8~15 位数字或字母

□3~8 位字母 +0~N 个空格 +8~15 位数字或字母

如果满足以上两者中的任何一种,则认为是快递查询请求格式。进入快递查询请求函数,代码如下:

1 function getExpressInfo($keyword) 2 { 3 $expresses = array( 4 「AAE」=>「aae」,「安捷」=>「anjie」,「安信达」=>「anxinda」,「AR AMEX」=>「aramex」,「巴伦支」=>「balunzhi」,「宝通达」=>「baotongda」,「成都奔腾」=>「benteng」,「CCES」=>「cces」,「长通」=>「changtong」,「程光」=>「chengguang」,「城际」=>「chengji」,「城市 100」=>「chengshi100」,「传喜」=>「chuanxi」,「传志」=>「chuanzhi」,「出口易」=>「chukouyi」,「CITYLINK」=>「citylink」,「东方」=>「coe」,「城市之星」=>「cszx」,「大田」=>「datian」,「大洋」=>「dayang」,「德邦」=>「debang」,「德创」=>「dechuang」,「DHL」=>「dhl」,「店通」=>「diantong」,「递达」=>「dida」,「叮咚」=>「dingdong」,「递四方」=>「disifang」,「DPEX」=>「dpex」,「D 速」=>「dsu」,「百福东方」=>「ees」,「EMS」=>「ems」,「凡宇」=>「fanyu」,「FARDAR」=>「fardar」,「FEDEX」=>「fedex」,「FEDEX 国内」=>「fedexcn」,「飞邦」=>「feibang」,「飞豹」=>「feibao」,「原飞航」=>「feihang」,「飞狐」=>「feihu」,「飞特」=>「feite」,「飞远」=>「feiyuan」,「丰达」=>「fengda」,「飞康达」=>「fkd」,「广东邮政」=>「gdyz」,「国内小包」=>「gnxb」,「共速达」=>「gongsuda」,「国通」=>「guotong」,「山东海红」=>「haihong」,「海盟」=>「haimeng」,「昊盛」=>「haosheng」,「河北建华」=>「hebeijianhua」,「恒路」=>「henglu」,「华诚」=>「huacheng」,「华翰」=>「huahan」,「华企」=>「huaqi」,「华夏龙」=>「huaxialong」,「天地华宇」=>「huayu」,「汇强」=>「huiqiang」,「汇通」=>「huitong」,「海外环球」=>「hwhq」,「佳吉快运」=>「jiaji」,「佳怡」=>「jiayi」,「加运美」=>「jiayunmei」,「金大」=>「jinda」,「京广」=>「jingguang」,「晋越」=>「jinyue」,「急先达」=>「jixianda」,「嘉里大通」=>「jldt」,「康力」=>「kangli」,「顺鑫」=>「kcs」,「快捷」=>「kuaijie」,「宽容」=>「kuanrong」,「跨越」=>「kuayue」,「乐捷递」=>「lejiedi」,「联昊通」=>「lianhaotong」,「立即送」=>「lijisong」,「龙邦」=>「longbang」,「民邦」=>「minbang」,「明亮」=>「mingliang」,「闽盛」=>「minsheng」,「尼尔」=>「nell」,「港中能达」=>「nengda」,「OCS」=>「ocs」,「平安达」=>「pinganda」,「邮政」=>「pingyou」,「品速心达」=>「pinsu」,「全晨」=>「quanchen」,「全峰」=>「quanfeng」,「全际通」=>「quanjitong」,「全日通」=>「quanritong」,「全一」=>「quanyi」,「保时达」=>「rpx」,「如风达」=>「rufeng」,「赛澳递」=>「saiaodi」,「三态」=>「santai」,「伟邦」=>「scs」,「圣安」=>「shengan」,「盛丰」=>「shengfeng」,「盛辉」=>「shenghui」,「申通」=>「shentong」,「顺丰」=>「shunfeng」,「穗佳」=>「suijia」,「速尔」=>「sure」,「天天」=>「tiantian」,「TNT」=>「tnt」,「通成」=>「tongcheng」,「通和天下」=>「tonghe」,「UPS」=>「ups」,「USPS」=>「usps」,「万博」=>「wanbo」,「万家」=>「wanjia」,「微特派」=>「weitepai」,「祥龙运通」=>「xianglong」,「新邦」=>「xinbang」,「信丰」=>「xinfeng」,「希优特」=>「xiyoute」,「源安达」=>「yad」,「亚风」=>「yafeng」,「一邦」=>「yibang」,「银捷」=>「yinjie」,「音素」=>「yinsu」,「亿顺航」=>「yishunhang」,「优速」=>「yousu」,「一统飞鸿」=>「ytfh」,「远成」=>「yuancheng」,「圆通」=>「yuantong」,「元智捷诚」=>「yuanzhi」,「越丰」=>「yuefeng」,「誉美捷」=>「yumeijie」,「韵达」=>「yunda」,「运通中港」=>「yuntong」,「宇鑫」=>「yuxin」,「源伟丰」=>「ywfex」,「宅急送」=>「zhaijisong」,「郑州建华」=>「zhengzhoujianhua」,「芝麻开门」=>「zhima」,「中天万运」=>「zhongtian」,「中通」=>「zhongtong」,「忠信达」=>「zhongxinda」,「中邮」=>「zhongyou」 5 ); 6 $contentStr = 「」; 7 for($len = 3; $len 8 { 9 if (array_key_exists(substr($keyword, 0, $len), $expresses) ||array_key_exists(strtoupper(substr($keyword, 0, $len)), $expresses)){ 10 if (preg_match(「/[a-zA-Z]/」,substr($keyword, 0, $len))){ 11 $companyEn = $expresses[strtoupper(substr($keyword,0, $len))]; 12 }else{ 13 $companyEn = $expresses[substr($keyword, 0, $len)]; 14 } 15 $number = trim(substr($keyword, $len, strlen($keyword))); 16 if (!preg_match(「/^\w{8,14}$/」,$number)){ 17 return 「 请发送『 快递名称』+『 单号』,不要加快递两个字。例如「汇通 210157777433」」; 18 } 19 $contentStr = getIckdExpressInfo($companyEn, $number); 20 return $contentStr; 21 } 22 } 23 if ($contentStr == 「」){ 24 $contentStr = 「 没有匹配到快递公司! 」; 25 return $contentStr; 26 } 27 }

上述代码解读如下:

第 3 行 ~ 第 5 行:定义快递公司名称及相应的查询代码。在这里,我们把所有包含英文的名称都转成大写了,便于后续匹配。

第 7 行 ~ 第 9 行:使用循环遍历长度的方式,匹配快递公司名称。快递公司名称最短为 3 字母(3 字节),最长不超过 4 个汉字(utf-8 编码下 12 字节)所以长度值为 3~12。匹配的方法同时考虑中文或者字母的方式。对于字母,将其强制转换成大写。

第 10 行 ~ 第 14 行:根据快递公司名称获取相应的快递公司英文代码。若含有英文字母,获取之前将其转为大写。

第 15 行 ~ 第 16 行:剥离出快递单号,并且判断单号是否为数字字母组成。如果不是,则匹配快递公司名称失败。

第 19 行 ~ 第 20 行:根据获取的快递公司名称调用爱查快递查询接口查询快递的当前进度,并且返回。

第 23 行 ~ 第 26 行:如果上述循环遍历没有找到快递公司名称,则返回匹配快递公司名称失败。

需要说明的是:由于快递公司名称的不规则性太强,上述方法仍有可能存在无法匹配到快递公司名称和单号的情况。在这种情况下,需要更进一步分析出错原因,找出代码中疏漏的地方。

上述快递查询代码最终实现效果如图 7-34 所示。

图 7-34 快递查询实现效果

加入维权功能

在微信小店中,如果需要实现用户退货退款等功能,则需要在菜单中加入「维权」按钮,让用户到达维权页面。加入方法很简单,给对应名称为「我要维权」的菜单设置链接(view 事件),URL 为 https://mp.weixin.qq.com/payfb/payfeedbackindex?appid=wx830f2de3fabcdefg#wechat_webview_type=1&wechat_redirect,把其中的 appid,换成当前公众账号的即可。菜单中的实现代码如下所示。

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 array(『type』 => 「view」, 14 『name』 => urlencode(「维权」), 15 『url』 => 「https://mp.weixin.qq.com/payfb/payfeedbackindex?appid=wx830f2de3fabcdefg#wechat_webview_type=1&wechat_redirect」 16 ), 17 ) 18 ); 19 $menu = urldecode(json_encode(array(『button』 => $button))); 20 var_dump($weixin->create_menu($menu));

上述维权代码实现效果如图 7-35 所示。

图 7-35 维权接入效果

版权保护: 本文由 李斯特 原创,转载请保留链接: https://www.wechatadd.com/artdet/8930