In diesem Artikel geht es um die Fallstricke, auf die Sie bei der automatischen Beantwortung von WeChat-Nachrichten stoßen. Sie treten häufig in der täglichen Projektentwicklung auf und sind von großem Referenzwert >WeChat-Antwortprinzip:
Wenn ein normaler WeChat-Benutzer eine Nachricht
an ein öffentliches Kontosendet, empfängt der WeChat-Server zuerst die vom Benutzer gesendete Nachricht und packt sie dann Benutzerinformationen und Nachrichten in ein Datenpaket im
XML-Format umwandeln und dieses XML-Datenpaket dann über die POST-Methode an die vom Entwickler festgelegte URL senden. Frage 1: Warum $GLOBALS["HTTP_RAW_POST_DATA"] verwenden, um POST-Daten anstelle des $_POST
ArraysPOST kann nur Standard-
Datentypenspeichern, für Inhalte wie XML, SOAP oder Application/Octet-steam. Analyse nicht möglich . Und $GLOBALS["HTTP_RAW_POST_DATA"] ist dasselbe wie $_POST. Wenn PHP die POST-Daten erkennen kann, können Sie $GLOBALS["HTTP_RAW_POST_DATA"] verwenden, um sie zu empfangen.
Frage 2: Was sind die Parameter und Rückgabewerte von
simplexml_load_file()? Antwort:
Parameterbedeutung
string: XML string , der verarbeitet werden muss.
Klasse: wird verwendet, um ein neues -Objekt anzugeben, normalerweise auf „SimpleXMLElement“ gesetzt, um eine Klasse einfacher XML-Elemente zu generieren. Optionen: Geben Sie zusätzliche Libxml-Parameter an, die normalerweise auf die
-KonstanteLIBXML_NOCDATA gesetzt sind, was bedeutet, dass CDATA als Textknoten festgelegt wird. ns: generell weggelassen
is_prefix: generell weggelassen
Die Funktiongibt nach Abschluss ein Objekt der SimpleXMLElement-Klasse zurück. Funktion: Das offizielle Konto akzeptiert nur Textnachrichten und gibt entsprechende Textantworten aus.
Funktion: Der offizielle Account akzeptiert nur Bildnachrichten und gibt entsprechende Textantworten.<span style="font-family:Courier New;font-size:14px;"><?php define("TOKEN","weixin"); $weixinObj = new Wechat(); $weixinObj->valid(); class Wechat{ public function valid(){ $echoStr = $_GET['echostr']; //如果是第一次接入 if($this->checkSignature() && $echoStr ){ echo $echoStr; exit; }else{ $this->responseMsg(); } } //校验方法 private function checkSignature(){ $signature = $_GET['signature']; $timestamp = $_GET['timestamp']; $nonce = $_GET['nonce']; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr); $tmpStr = implode($tmpArr); $tmpStr = sha1($tmpStr); if($tmpStr == $signature){ return true; }else{ return false; } } /* 普通文本消息 <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[this is a test]]></Content> </xml> */ public function responseMsg(){ //获取微信服务器POST请求中的数据 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; if( !empty($postStr) ){ $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUser = $postObj->FromUserName; $toUser = $postObj->ToUserName; $keyword = trim($postObj->Content); $time = time(); $template = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>"; if( strtolower($postObj->MsgType)!='text' ){ $msgType = "text"; $content = "我只接受文本消息"; }else{ $msgType = "text"; if( !empty($keyword) ){ $content = "您发送的消息是:".$postObj->Content; }else{ $content = "请输入关键字";//消息为空 } } $info = sprintf($template, $fromUser, $toUser, $time, $msgType, $content); echo $info; }else{ echo ""; exit; } } }</span>
<span style="font-family:Courier New;font-size:14px;"><?php define("TOKEN","weixin"); $weixinObj = new Wechat(); $weixinObj->valid(); class Wechat{ public function valid(){ $echoStr = $_GET['echostr']; //如果是第一次接入 if($this->checkSignature() && $echoStr ){ echo $echoStr; exit; }else{ $this->responseMsg(); } } //校验方法 private function checkSignature(){ $signature = $_GET['signature']; $timestamp = $_GET['timestamp']; $nonce = $_GET['nonce']; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr); $tmpStr = implode($tmpArr); $tmpStr = sha1($tmpStr); if($tmpStr == $signature){ return true; }else{ return false; } } /* 接收图片消息格式 <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[image]]></MsgType> <PicUrl><![CDATA[this is a url]]></PicUrl> <MediaId><![CDATA[media_id]]></MediaId> <MsgId>1234567890123456</MsgId> </xml> */ public function responseMsg(){ //获取微信服务器POST请求中的数据 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; if( !empty($postStr) ){ $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUser = $postObj->FromUserName; $toUser = $postObj->ToUserName; $time = time(); $msgType= $postObj->MsgType; $picUrl = $postObj->PicUrl; $mediaId = $postObj->MediaId; $template = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>"; if( strtolower($msgType)!='image' ){ $msgType = "text"; $content = "我只接受图片消息"; }else{ $msgType = "text"; if( !empty( $picUrl ) ){ $content = "图片链接为:".$picUrl."\n"; $content .= "媒体id:".$mediaId; }else{ $content = "请发送图片";//消息为空 } } $info = sprintf($template, $fromUser, $toUser, $time, $msgType, $content); echo $info; }else{ echo ""; exit; } } }</span>
Das obige ist der detaillierte Inhalt vonBei der automatischen Beantwortung von WeChat-Nachrichten sind in der PHP-WeChat-Entwicklung Probleme aufgetreten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!