微信公家平台由于接口进级,将发生以下改观。新用户订阅,将由之前推送一条“Hello2BizUser”文本,变革为推送一条“subscribe”的事件。最近遇到好几个伴侣询问新用户订阅事件儿女码要怎么改,此刻将具体进程讲授如下:
一、Hello2BizUser往事件的处理惩罚
在老的存眷事件中,用户存眷微信公家平台账号后,系统会帮用户发送一条Hello2BizUser的文本给公家账号,公家账号靠山开拓模式下通过判定Hello2BizUser这个词来实现发送接待词。
代码样譬喻下:
if ($keyword == "Hello2BizUser"){ $contentStr = "接待存眷方倍事情室,这其实是老的接待词,你收不到了"; $resultStr = $this->transmitText($object, $contentStr, $funcFlag); return $resultStr; }
做出基本接口上的修改,影响会是所有人。一般不会等闲做这样的窜改。
为什么微信要修改这一事件了,这个要领的漏洞在于,假如用户没有判定这一事件,那么就不会有接待词,原来这也没什么干系,不呈现接待词也不影响什么。但许多人的措施代码内里,所有流程直接就是判定要害词。好比我们曾看到过一家医院的微信账号,用户发送登记的号码,就显示前面有几多人分列,但靠山措施没有做区分,把Hello2BizUser也当成登记单发送已往,返回没有找到Hello2BizUser这一登记,不知道前面有几多人,搞得用户莫名奇妙。尚有就是用户假如主动发送一个Hello2BizUser已往,那么获得的也是和接待词一样的内容,固然很少有用户会去发这个对象。
另一方面,将用户存眷做成事件,更有利于统计成果的实现。操作这个事件,我们就更能容易的判定出存眷人数和退订人数,而本来的Hello2BizUser文本推送判定是有大概禁绝确的,因为用户可以手工发送,形成虚假存眷统计。
二、“subscribe”订阅事件判定
subscribe是一种新的事件,我们先需要干事件范例做判定,我们在官方样例中增加对这一事件的判定,修改如下:
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $RX_TYPE = trim($postObj->MsgType); switch ($RX_TYPE) { case "text": $resultStr = $this->receiveText($postObj); break; case "event": $resultStr = $this->receiveEvent($postObj); break; default: $resultStr = "unknow msg type: ".$RX_TYPE; break; }
然后在事件吸收处理惩罚函数中再判定订阅事件 :
private function receiveEvent($object) { $contentStr = ""; switch ($object->Event) { case "subscribe": $contentStr = "您好,接待存眷方倍事情室。新感受,新体验!"; break; } $resultStr = $this->transmitText($object, $contentStr); return $resultStr; }
这样就完成了“subscribe”的订阅事件下的处理惩罚。
二、完整代码
<?php define("TOKEN", "方倍事情室"); $wechatObj = new wechatCallbackapiTest(); $wechatObj->responseMsg(); class wechatCallbackapiTest { public function responseMsg() { $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; if (!empty($postStr)){ $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $RX_TYPE = trim($postObj->MsgType); switch ($RX_TYPE) { case "text": $resultStr = $this->receiveText($postObj); break; case "event": $resultStr = $this->receiveEvent($postObj); break; default: $resultStr = "unknow msg type: ".$RX_TYPE; break; } echo $resultStr; }else { echo ""; exit; } } private function receiveText($object) { $funcFlag = 0; $keyword = trim($object->Content); $resultStr = ""; $cityArray = array(); $contentStr = ""; $needArray = false; $illegal = false; $saytome = false; if ($keyword == "Hello2BizUser"){ $contentStr = "接待存眷方倍事情室,这其实是老的接待词,你存眷时收不到了"; $resultStr = $this->transmitText($object, $contentStr, $funcFlag); return $resultStr; }else { } } private function receiveEvent($object) { $contentStr = ""; switch ($object->Event) { case "subscribe": $contentStr = "您好,接待存眷方倍事情室。新感受,新体验!"; break; } $resultStr = $this->transmitText($object, $contentStr); return $resultStr; } private function transmitText($object, $content, $flag = 0) { $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>%d</FuncFlag> </xml>"; $resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $flag); return $resultStr; } } ?>