新的微信公眾平臺開發介面-subscribe事件的處理
今年,由於微信公眾平臺升級,涉及到得介面也有所變動。最為重要的變動是:新使用者訂閱,將由之前推送一條“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", "weixin");
$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;
}
}
?>