当前位置:首页 > PHP教程 > php高级应用 > 列表

关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-30 21:12:17 浏览: 评论:0 

最近做了个项目,当token验证之后,发送消息给订阅号,但是没有消息返回,下面小编通过本篇文章给大家分享我的解决办法。

相信很多人会跟我一样,token验证之后,发送消息给订阅号,没有消息返回。

以下,说一下我辛苦调试得到的解决办法:

首先,token验证:

自己写的token一直验证失败,找了好久,没有发现bug。实在没办法,就用了官方的示例代码。并且通过示例代码调试,发现了一个让我吐血的bug(也不算bug):

token验证貌似要求字符编码格式!!!!

官方的示例代码,直接上传到服务器,token直接过!

把官方示例代码改为UTF-8格式,再上传覆盖,token失败!失败!失败!

后来,把自己写的修改为ANSI格式还是token失败!醉了醉了!那只好用官方示例代码。在此,说下,token是一次握手验证,验证过一次就不用了。

下面,言归正传,貌似偏题了...orz

token验证之后,直接用官方示例代码,赶紧测试自己的订阅号,结果....发出去的消息就跟泼出去的水一样,什么鬼都没有返回...orz

又各种找bug,各种群问,各种搜索....历经本博主九九八十一的努力,终于找出了问题所在(这里是指我自己开发的,并不包括全部,如果你有不同的bug,欢迎交流):

1、最容易被忽视的一个bug,官方给的示例代码,压根就没调用写好的那个responseMsg()函数!

2、把之前的token代码注释,也就是$wechatObj->valid();这行代码。因为toke验证那段代码会有一个echo $echostr,会把responseMsg()函数里的echo $resultStr;(56行)xml格式混乱,输回给微信服务器就无法识别了(貌似只能识别xml格式,还有json格式)。(token验证是一次握手验证,验证开发者之后,就可以不用了,赶紧让它消失在我们整洁的代码orz...)

3、最恶心的一个bug,还是字符编码问题!orz...xml要求UTF-8编码,所以,把示例代码改回UTF-8编码!这个bug找的让我崩溃!!!

下面是我修改后的代码,能正常运行,无bug,需要的可以参考一下

  1. <?php 
  2.  /** 
  3.  * wechat php test 
  4.  */ 
  5.  //define your token 
  6.  define("TOKEN""codcodog"); 
  7.  $wechatObj = new wechatCallbackapiTest(); 
  8.  //$wechatObj->valid(); 
  9.  $wechatObj->responseMsg(); 
  10.  class wechatCallbackapiTest 
  11.  { 
  12.   public function valid() 
  13.   { 
  14.    $echoStr = $_GET["echostr"]; 
  15.    //valid signature , option 
  16.    if($this->checkSignature()){ 
  17.    header('content-type:text'); 
  18.     echo $echoStr
  19.     exit
  20.    } 
  21.   } 
  22.   public function responseMsg() 
  23.   { 
  24.    //get post data, May be due to the different environments 
  25.    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 
  26.    //$postStr = file_get_contents("php://input"); 
  27.    file_put_contents("log.txt",$postStr,FILE_APPEND ); 
  28.    //extract post data 
  29.    if (!emptyempty($postStr)){ 
  30.      /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection, 
  31.      the best way is to check the validity of xml by yourself */ 
  32.      libxml_disable_entity_loader(true); 
  33.      $postObj = simplexml_load_string($postStr'SimpleXMLElement', LIBXML_NOCDATA); 
  34.      $fromUsername = $postObj->FromUserName; //用户 
  35.      $toUsername = $postObj->ToUserName;  //公众平台 
  36.      $keyword = trim($postObj->Content); 
  37.      $time = time(); 
  38.      $textTpl = "<xml> 
  39.         <ToUserName><![CDATA[%s]]></ToUserName> 
  40.         <FromUserName><![CDATA[%s]]></FromUserName> 
  41.         <CreateTime>%s</CreateTime> 
  42.         <MsgType><![CDATA[%s]]></MsgType> 
  43.         <Content><![CDATA[%s]]></Content> 
  44.         <FuncFlag></FuncFlag> 
  45.         </xml>";     
  46.      if(!emptyempty$keyword )) 
  47.      { 
  48.       $msgType = "text"
  49.       $contentStr = "Welcome to wechat world!"
  50.       $resultStr = sprintf($textTpl$fromUsername$toUsername$time$msgType$contentStr); 
  51.       echo $resultStr
  52.      }else
  53.       echo "Input something..."
  54.      } 
  55.    }else { 
  56.     echo ""
  57.     exit
  58.    } 
  59.   } 
  60.   private function checkSignature() 
  61.   { 
  62.    // you must define TOKEN by yourself 
  63.    if (!defined("TOKEN")) { 
  64.     throw new Exception('TOKEN is not defined!'); 
  65.    } 
  66.    $signature = $_GET["signature"]; 
  67.    $timestamp = $_GET["timestamp"]; 
  68.    $nonce = $_GET["nonce"]; 
  69.    $token = TOKEN; 
  70.    $tmpArr = array($token$timestamp$nonce); 
  71.    // use SORT_STRING rule 
  72.    sort($tmpArr, SORT_STRING); 
  73.    $tmpStr = implode( $tmpArr ); 
  74.    $tmpStr = sha( $tmpStr ); 
  75.    if$tmpStr == $signature ){ 
  76.     return true; 
  77.    }else
  78.     return false; 
  79.    } 
  80.   } 
  81.  } 
  82.  ?> 

以上所述是小编给大家分享的php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的解决方案,希望大家喜欢。

Tags: php微信订阅号 token

分享到: