Heim  >  Artikel  >  WeChat-Applet  >  Bei der automatischen Beantwortung von WeChat-Nachrichten sind in der PHP-WeChat-Entwicklung Probleme aufgetreten

Bei der automatischen Beantwortung von WeChat-Nachrichten sind in der PHP-WeChat-Entwicklung Probleme aufgetreten

高洛峰
高洛峰Original
2017-03-21 16:10:041769Durchsuche

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 Konto

sendet, 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

Arrays

zu speichern? Antwort:

POST kann nur Standard-

Datentypen

speichern, 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

-Konstante

LIBXML_NOCDATA gesetzt sind, was bedeutet, dass CDATA als Textknoten festgelegt wird. ns: generell weggelassen

is_prefix: generell weggelassen

Die Funktion

gibt 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>

Das Obige ist das Wissen, das der Herausgeber mit Ihnen über die Fallstricke geteilt hat, die beim automatischen Antworten auf WeChat-Nachrichten auftreten. Ich hoffe, es wird für alle hilfreich sein!
<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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn