1. 古い Hello2BizUser イベントの処理
古いアテンション イベントでは、ユーザーが WeChat パブリック プラットフォーム アカウントをフォローした後、システムはユーザーがバックグラウンド開発モードで Hello2BizUser のテキストをパブリック アカウントに送信するのを支援します。公開アカウントの場合、Hello2BizUser の単語を判断してウェルカム メッセージを送信します。
コードサンプルは次のとおりです:
if ($keyword == "Hello2BizUser"){ $contentStr = "PHP中文网"; $resultStr = $this->transmitText($object, $contentStr, $funcFlag); return $resultStr; }
基本的なインターフェースに変更を加えると、全員に影響します。一般に、そのような変更は簡単には行われません。
なぜ WeChat はこのイベントを変更したいのでしょうか? この方法の欠点は、ユーザーがこのイベントを判断しない場合、ウェルカム メッセージが表示されないことです。本来、これは問題ではなく、ウェルカム メッセージがなくても問題はありません。何も影響しません。しかし、多くの人のプログラム コードでは、すべてのプロセスがキーワードの判断に直接基づいています。たとえば、病院の WeChat アカウントでは、ユーザーが登録番号を送信すると、その前に何人が並んでいるのかが表示されますが、バックグラウンド プログラムは区別せず、登録順序として Hello2BizUser を送信します。登録番号 Hello2BizUser が見つかりません。目の前に何人いるのかわかりません。ユーザーは混乱しています。また、ユーザーが率先して Hello2BizUser を送信すると、ウェルカム メッセージと同じ内容が返されますが、これを送信するユーザーはほとんどいません。
その一方で、ユーザーの注意をイベントに変えることは、統計関数の実現にさらに役立ちます。このイベントを使用すると、フォロワーと購読解除者の数をより簡単に判断できます。ただし、ユーザーが手動で送信して誤ったフォロー統計が形成されるため、元の Hello2BizUser テキスト プッシュの決定は不正確になる可能性があります。
2. 「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; }
2. 完全なコード
<?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; } } ?>