Heim >Backend-Entwicklung >PHP-Tutorial >Bezüglich des Problems der Entwicklung eines PHP-WeChat-Abonnementkontos, bei dem Nachrichten nach der Token-Verifizierung automatisch an das Abonnementkonto gesendet werden, aber keine Nachricht zurückgegeben wird
Ich glaube, dass es vielen Menschen wie mir gehen wird. Nachdem das Token überprüft wurde, wird eine Nachricht an das Abonnementkonto gesendet, aber es wird keine Nachricht zurückgegeben.
Das Folgende ist die Lösung, die ich durch hartes Debuggen erhalten habe:
Zuerst die Token-Verifizierung:
Die Das von mir geschriebene Token konnte lange nicht überprüft werden, aber es wurde kein Fehler gefunden. Da es wirklich keine andere Möglichkeit gab, habe ich den offiziellen Beispielcode verwendet. Und beim Debuggen des Beispielcodes habe ich einen Fehler gefunden, der mich Blut erbrechen ließ (kein Fehler):
Die Token-Überprüfung scheint ein Zeichenkodierungsformat zu erfordern! ! ! !
Der offizielle Beispielcode wird direkt auf den Server hochgeladen und das Token wird direkt übergeben!
Der offizielle Beispielcode wurde in das UTF-8-Format geändert und dann hochgeladen, um ihn zu überschreiben, aber das Token ist fehlgeschlagen! scheitern! scheitern!
Später habe ich das, was ich geschrieben habe, in das ANSI-Format geändert und das Token ist immer noch fehlgeschlagen! Betrunken, betrunken! Dann müssen Sie den offiziellen Beispielcode verwenden. Hier möchte ich sagen, dass es sich bei dem Token um eine einmalige Handshake-Überprüfung handelt und nach einer einmaligen Überprüfung nicht mehr benötigt wird.
Jetzt kommen wir zurück zum Thema, das scheinbar abgeschweift ist... orz
Nach der Token-Verifizierung habe ich zu schnell direkt den offiziellen Beispielcode verwendet teste mein Abo-Konto, und das Ergebnis... .Die ausgesendete Nachricht ist wie ausgegossenes Wasser, nichts kommt zurück...orz
Ich habe nach Bugs gesucht, in verschiedenen Gruppen gefragt, gesucht ... Nach neunundneunzig und einundachtzig Versuchen hat dieser Blogger endlich das Problem gefunden (dies bezieht sich auf die von mir entwickelten, nicht alle. Wenn Sie andere Fehler haben, können Sie diese gerne mitteilen):
1. Der am leichtesten zu übersehende Fehler ist, dass der offizielle Beispielcode die geschriebene Funktion „responsMsg()“ überhaupt nicht aufruft!
2. Kommentieren Sie den vorherigen Token-Code aus, bei dem es sich um die Zeile $wechatObj->valid(); handelt. Da es im Toke-Verifizierungscode ein echo $echostr gibt, liegt das echo $resultStr; (Zeile 56) in der Funktion „responsMsg()“ in einem verwirrenden XML-Format vor und wird bei der Eingabe nicht erkannt WeChat-Server (es scheint, dass er nur das XML-Format erkennen kann, auch im JSON-Format). (Die Token-Überprüfung ist eine Handshake-Überprüfung. Nach der Überprüfung durch den Entwickler ist sie nicht mehr erforderlich. Lassen Sie sie in unserem ordentlichen Code verschwinden ...)
3. Der ekelhafteste Fehler ist immer noch die Zeichenkodierung Problem! orz...xml erfordert UTF-8-Kodierung, also ändern Sie den Beispielcode wieder auf UTF-8-Kodierung! Dieser Bug lässt mich zusammenbrechen! ! !
Das Folgende ist mein geänderter Code. Er kann normal ausgeführt werden und weist keine Fehler auf. Sie können darauf zurückgreifen, wenn Sie ihn benötigen.
<?php /** * wechat php test */ //define your token define("TOKEN", "codcodog"); $wechatObj = new wechatCallbackapiTest(); //$wechatObj->valid(); $wechatObj->responseMsg(); class wechatCallbackapiTest { public function valid() { $echoStr = $_GET["echostr"]; //valid signature , option if($this->checkSignature()){ header('content-type:text'); echo $echoStr; exit; } } public function responseMsg() { //get post data, May be due to the different environments $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //$postStr = file_get_contents("php://input"); file_put_contents("log.txt",$postStr,FILE_APPEND ); //extract post data if (!empty($postStr)){ /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection, the best way is to check the validity of xml by yourself */ libxml_disable_entity_loader(true); $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName; //用户 $toUsername = $postObj->ToUserName; //公众平台 $keyword = trim($postObj->Content); $time = time(); $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag></FuncFlag> </xml>"; if(!empty( $keyword )) { $msgType = "text"; $contentStr = "Welcome to wechat world!"; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; }else{ echo "Input something..."; } }else { echo ""; exit; } } private function checkSignature() { // you must define TOKEN by yourself if (!defined("TOKEN")) { throw new Exception('TOKEN is not defined!'); } $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); // use SORT_STRING rule sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } } ?>
Das Obige ist die Lösung, die der Herausgeber mit Ihnen für die Entwicklung des PHP-WeChat-Abonnementkontos geteilt hat. Nach der Token-Verifizierung wird automatisch eine Nachricht an das Abonnementkonto gesendet, aber es wird keine Nachricht zurückgegeben.
Das Obige führt zu dem Problem, dass nach der Token-Verifizierung automatisch eine Nachricht an das Abonnementkonto gesendet wird, bei der Entwicklung des PHP-WeChat-Abonnementkontos jedoch keine Nachricht zurückgegeben wird. Ich hoffe, dass dies für Freunde hilfreich ist, die an PHP-Tutorials interessiert sind .