微信公众平台开发接口-subscribe事件的处理

由于微信公众平台升级,涉及到得接口也有所变动。最为重要的变动是:新用户订阅,将由之前推送一条“Hello2BizUser”文本,变化为推送一条“subscribe”的事件。最近碰到好几个朋友询问新用户订阅事件后代码要怎么改,现在将详细过程讲解如下:

一、Hello2BizUser旧事件的处理

在老的关注事件中,用户关注微信公众平台账号后,系统会帮用户发送一条Hello2BizUser的文本给公众账号,公众账号后台开发模式下通过判断Hello2BizUser这个词来实现发送欢迎词。

代码样例如下:

[php]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. if ($keyword == "Hello2BizUser"){  
  2.     $contentStr = "欢迎关注白云机场交流论坛,这其实是老的欢迎词,你收不到了";  
  3.     $resultStr = $this->transmitText($object$contentStr$funcFlag);  
  4.     return $resultStr;  
  5. }  

做出基础接口上的修改,影响会是所有人。一般不会轻易做这样的改动。

为什么微信要修改这一事件了,这个方法的弊端在于,如果用户没有判断这一事件,那么就不会有欢迎词,本来这也没什么关系,不出现欢迎词也不影响什么。但很多人的程序代码里面,所有流程直接就是判断关键词。比如我们曾看到过一家医院的微信账号,用户发送挂号的号码,就显示前面有多少人排列,但后台程序没有做区分,把Hello2BizUser也当成挂号单发送过去,返回没有找到Hello2BizUser这一挂号,不知道前面有多少人,搞得用户莫名奇妙。还有就是用户如果主动发送一个Hello2BizUser过去,那么得到的也是和欢迎词一样的内容,虽然很少有用户会去发这个东西。

另一方面,将用户关注做成事件,更有利于统计功能的实现。利用这个事件,我们就更能容易的判断出关注人数和退订人数,而原来的Hello2BizUser文本推送判断是有可能不准确的,因为用户可以手工发送,形成虚假关注统计。

 

二、“subscribe”订阅事件判断

subscribe是一种新的事件,我们先需要做事件类型做判断,我们在官方样例中增加对这一事件的判断,修改如下:

[php]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. $postObj = simplexml_load_string($postStr'SimpleXMLElement', LIBXML_NOCDATA);  
  2. $RX_TYPE = trim($postObj->MsgType);  
  3.   
  4. switch ($RX_TYPE)  
  5. {  
  6.     case "text":  
  7.         $resultStr = $this->receiveText($postObj);  
  8.         break;  
  9.     case "event":  
  10.         $resultStr = $this->receiveEvent($postObj);  
  11.         break;  
  12.     default:  
  13.         $resultStr = "unknow msg type: ".$RX_TYPE;  
  14.         break;  
  15. }  

然后在事件接收处理函数中再判断订阅事件 :

[php]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private function receiveEvent($object)  
  2. {  
  3.     $contentStr = "";  
  4.     switch ($object->Event)  
  5.     {  
  6.         case "subscribe":  
  7.             $contentStr = "您好,欢迎关注白云机场交流论坛";  
  8.             break;  
  9.     }  
  10.     $resultStr = $this->transmitText($object$contentStr);  
  11.     return $resultStr;  
  12. }  

这样就完成了“subscribe”的订阅事件下的处理。

二、完整代码

[php]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?php  
  2. define("TOKEN""weixin");  
  3. $wechatObj = new wechatCallbackapiTest();  
  4. $wechatObj->responseMsg();  
  5.   
  6. class wechatCallbackapiTest  
  7. {  
  8.     public function responseMsg()  
  9.     {  
  10.         $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];  
  11.         if (!empty($postStr)){  
  12.             $postObj = simplexml_load_string($postStr'SimpleXMLElement', LIBXML_NOCDATA);  
  13.             $RX_TYPE = trim($postObj->MsgType);  
  14.   
  15.             switch ($RX_TYPE)  
  16.             {  
  17.                 case "text":  
  18.                     $resultStr = $this->receiveText($postObj);  
  19.                     break;  
  20.                 case "event":  
  21.                     $resultStr = $this->receiveEvent($postObj);  
  22.                     break;  
  23.                 default:  
  24.                     $resultStr = "unknow msg type: ".$RX_TYPE;  
  25.                     break;  
  26.             }  
  27.             echo $resultStr;  
  28.         }else {  
  29.             echo "";  
  30.             exit;  
  31.         }  
  32.     }  
  33.   
  34.     private function receiveText($object)  
  35.     {  
  36.         $funcFlag = 0;  
  37.         $keyword = trim($object->Content);  
  38.         $resultStr = "";  
  39.         $cityArray = array();  
  40.         $contentStr = "";  
  41.         $needArray = false;  
  42.         $illegal = false;  
  43.         $saytome = false;  
  44.   
  45.         if ($keyword == "Hello2BizUser"){  
  46.             $contentStr = "欢迎关注白云机场交流论坛,这其实是老的欢迎词,你关注时收不到了";  
  47.             $resultStr = $this->transmitText($object$contentStr$funcFlag);  
  48.             return $resultStr;  
  49.         }else {  
  50.   
  51.         }  
  52.     }  
  53.   
  54.     private function receiveEvent($object)  
  55.     {  
  56.         $contentStr = "";  
  57.         switch ($object->Event)  
  58.         {  
  59.             case "subscribe":  
  60.                 $contentStr = "您好,欢迎关注白云机场交流论坛!";  
  61.                 break;  
  62.         }  
  63.         $resultStr = $this->transmitText($object$contentStr);  
  64.         return $resultStr;  
  65.     }  
  66.   
  67.     private function transmitText($object$content$flag = 0)  
  68.     {  
  69.         $textTpl = "<xml>  
  70. <ToUserName><![CDATA[%s]]></ToUserName>  
  71. <FromUserName><![CDATA[%s]]></FromUserName>  
  72. <CreateTime>%s</CreateTime>  
  73. <MsgType><![CDATA[text]]></MsgType>  
  74. <Content><![CDATA[%s]]></Content>  
  75. <FuncFlag>%d</FuncFlag>  
  76. </xml>";  
  77.         $resultStr = sprintf($textTpl$object->FromUserName, $object->ToUserName, time(), $content$flag);  
  78.         return $resultStr;  
  79.     }  
  80. }  
  81.   
  82. ?>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值