• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

php 搞代码 4年前 (2022-01-25) 20次浏览 已收录 0个评论

相信很多人会跟我一样,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,需要的可以参考一下

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<span style="color:transparent">本文来源gaodai#ma#com搞*!代#%^码$网!</span><strong>搞代gaodaima码</strong> 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 = "                        %s                                ";         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;   }  } } ?>

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


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题_PHP

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址