Maison >Applet WeChat >Développement WeChat >Problèmes rencontrés dans la réponse automatique aux messages WeChat dans le développement PHP WeChat

Problèmes rencontrés dans la réponse automatique aux messages WeChat dans le développement PHP WeChat

高洛峰
高洛峰original
2017-03-21 16:10:041789parcourir

Cet article porte sur les pièges rencontrés par la réponse automatique aux messages WeChat que l'éditeur vous présente. Il est souvent rencontré dans le développement de projets quotidiens et constitue une grande valeur de référence. Les amis intéressés peuvent apprendre ensemble. >Principe de réponse WeChat :

Lorsqu'un utilisateur WeChat ordinaire envoie un message

à un compte public

, le serveur WeChat reçoit d'abord le message envoyé par l'utilisateur puis Pack ; informations utilisateur et messages dans un paquet de données au format

XML

, puis soumettez ce paquet de données XML à l'URL définie par le développeur via la méthode POST. Question 1 : Pourquoi utiliser $GLOBALS["HTTP_RAW_POST_DATA"] pour enregistrer les données POST au lieu de $_POST

array

 ? Réponse :

POST ne peut enregistrer que le

type de données

standard, pour le contenu tel que XML, SOAP ou Application/Octet-steam Impossible d'analyser . Et $GLOBALS["HTTP_RAW_POST_DATA"] est identique à $_POST Si PHP peut reconnaître les données POST, vous pouvez utiliser $GLOBALS["HTTP_RAW_POST_DATA"] pour les recevoir.

Question 2 : Quels sont les paramètres et les valeurs de retour de

simplexml

_load_file() ? Réponse :

Signification du paramètre

chaîne

 : XML chaîne qui doit être traitée.

class

 : utilisé pour spécifier un nouveau objet, généralement défini sur "SimpleXMLElement" pour générer une classe d'éléments XML simples. options : spécifiez des paramètres Libxml supplémentaires, généralement définis sur la

constante

LIBXML_NOCDATA, ce qui signifie définir CDATA comme nœud de texte. ns : généralement omis

is_prefix : généralement omis

La fonction

renvoie un objet de la classe SimpleXMLElement une fois terminée. Fonction : Le compte officiel n'accepte que les messages texte et envoie les réponses textuelles correspondantes.

Fonction : Le compte officiel n'accepte que les messages photo et envoie les réponses textuelles correspondantes.
<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>

Ce qui précède est la connaissance que l'éditeur a partagée avec vous sur les pièges rencontrés lors de la réponse automatique aux messages WeChat. J'espère que cela sera utile à tout le monde !
<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>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn