1. 程式人生 > >微信公眾平臺開發介面-subscribe事件的處理

微信公眾平臺開發介面-subscribe事件的處理

由於微信公眾平臺升級,涉及到得介面也有所變動。最為重要的變動是:新使用者訂閱,將由之前推送一條“Hello2BizUser”文字,變化為推送一條“subscribe”的事件。最近碰到好幾個朋友詢問新使用者訂閱事件後代碼要怎麼改,現在將詳細過程講解如下:

一、Hello2BizUser舊事件的處理

在老的關注事件中,使用者關注微信公眾平臺賬號後,系統會幫使用者傳送一條Hello2BizUser的文字給公眾賬號,公眾賬號後臺開發模式下通過判斷Hello2BizUser這個詞來實現傳送歡迎詞。

程式碼樣例如下:

  1. if ($keyword == "Hello2BizUser"){  
  2.     $contentStr = "歡迎關注白雲機場交流論壇,這其實是老的歡迎詞,你收不到了";  
  3.     $resultStr = $this->transmitText($object$contentStr$funcFlag);  
  4.     return$resultStr;  
  5. }  

做出基礎介面上的修改,影響會是所有人。一般不會輕易做這樣的改動。

為什麼微信要修改這一事件了,這個方法的弊端在於,如果使用者沒有判斷這一事件,那麼就不會有歡迎詞,本來這也沒什麼關係,不出現歡迎詞也不影響什麼。但很多人的程式程式碼裡面,所有流程直接就是判斷關鍵詞。比如我們曾看到過一家醫院的微信賬號,使用者傳送掛號的號碼,就顯示前面有多少人排列,但後臺程式沒有做區分,把Hello2BizUser也當成掛號單傳送過去,返回沒有找到Hello2BizUser這一掛號,不知道前面有多少人,搞得使用者莫名奇妙。還有就是使用者如果主動傳送一個Hello2BizUser過去,那麼得到的也是和歡迎詞一樣的內容,雖然很少有使用者會去發這個東西。

另一方面,將使用者關注做成事件,更有利於統計功能的實現。利用這個事件,我們就更能容易的判斷出關注人數和退訂人數,而原來的Hello2BizUser文字推送判斷是有可能不準確的,因為使用者可以手工傳送,形成虛假關注統計。

二、“subscribe”訂閱事件判斷

subscribe是一種新的事件,我們先需要做事件型別做判斷,我們在官方樣例中增加對這一事件的判斷,修改如下:

  1. $postObj = simplexml_load_string($postStr'SimpleXMLElement', LIBXML_NOCDATA);  
  2. $RX_TYPE = trim($postObj
    ->MsgType);  
  3. switch ($RX_TYPE)  
  4. {  
  5.     case"text":  
  6.         $resultStr = $this->receiveText($postObj);  
  7.         break;  
  8.     case"event":  
  9.         $resultStr = $this->receiveEvent($postObj);  
  10.         break;  
  11.     default:  
  12.         $resultStr = "unknow msg type: ".$RX_TYPE;  
  13.         break;  
  14. }  

然後在事件接收處理函式中再判斷訂閱事件 :
  1. privatefunction 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”的訂閱事件下的處理。

二、完整程式碼

  1. <?php  
  2. define("TOKEN""weixin");  
  3. $wechatObj = new wechatCallbackapiTest();  
  4. $wechatObj->responseMsg();  
  5. class wechatCallbackapiTest  
  6. {  
  7.     publicfunction responseMsg()  
  8.     {  
  9.         $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];  
  10.         if (!empty($postStr)){  
  11.             $postObj = simplexml_load_string($postStr'SimpleXMLElement', LIBXML_NOCDATA);  
  12.             $RX_TYPE = trim($postObj->MsgType);  
  13.             switch ($RX_TYPE)  
  14.             {  
  15.                 case"text":  
  16.                     $resultStr = $this->receiveText($postObj);  
  17.                     break;  
  18.                 case"event":  
  19.                     $resultStr = $this->receiveEvent($postObj);  
  20.                     break;  
  21.                 default:  
  22.                     $resultStr = "unknow msg type: ".$RX_TYPE;  
  23.                     break;  
  24.             }  
  25.             echo$resultStr;  
  26.         }else {  
  27.             echo"";  
  28.             exit;  
  29.         }  
  30.     }  
  31.     privatefunction receiveText($object)  
  32.     {  
  33.         $funcFlag = 0;  
  34.         $keyword = trim($object->Content);  
  35.         $resultStr = "";  
  36.         $cityArray = array();  
  37.         $contentStr = "";  
  38.         $needArray = false;  
  39.         $illegal = false;  
  40.         $saytome = false;  
  41.         if ($keyword == "Hello2BizUser"){  
  42.             $contentStr = "歡迎關注白雲機場交流論壇,這其實是老的歡迎詞,你關注時收不到了";  
  43.             $resultStr = $this->transmitText($object$contentStr$funcFlag);  
  44.             return$resultStr;  
  45.         }else {  
  46.         }  
  47.     }  
  48.     privatefunction receiveEvent($object)  
  49.     {  
  50.         $contentStr = "";  
  51.         switch ($object->Event)  
  52.         {  
  53.             case"subscribe":  
  54.                 $contentStr = "您好,歡迎關注白雲機場交流論壇!";  
  55.                 break;  
  56.         }  
  57.         $resultStr = $this->transmitText($object$contentStr);  
  58.         return$resultStr;  
  59.     }  
  60.     privatefunction transmitText($object$content$flag = 0)  
  61.     {  
  62.         $textTpl = "<xml>  
  63. <ToUserName><![CDATA[%s]]></ToUserName>  
  64. <FromUserName><![CDATA[%s]]></FromUserName>  
  65. <CreateTime>%s</CreateTime>  
  66. <MsgType><![CDATA[text]]></MsgType>  
  67. <Content><![CDATA[%s]]></Content>  
  68. <FuncFlag>%d</FuncFlag>  
  69. </xml>";  
  70.         $resultStr = sprintf($textTpl$object->FromUserName, $object->ToUserName, time(), $content$flag);  
  71.         return$resultStr;  
  72.     }  
  73. }  
  74. ?>