加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP编程:关于php微信订阅号开发之token验证后自动发送消息给订

发布时间:2020-12-13 03:00:53 所属栏目:PHP教程 来源:网络整理
导读:《关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题》要点: 本文介绍了关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题,希望对您有用。如果有疑问,可以联系我们。 PHP实例 相信很多人会跟

《关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题》要点:
本文介绍了关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题,希望对您有用。如果有疑问,可以联系我们。

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

PHP实例以下,说一下我辛苦调试得到的解决方法:

PHP实例首先,token验证:

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

PHP实例token验证貌似要求字符编码格局!!!!

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

PHP实例把官方示例代码改为UTF-8格式,再上传笼罩,token失败!失败!失败!

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

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

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

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

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

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

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

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

PHP实例
<?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;
   }
  }
 }
 ?>

《关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题》是否对您有启发,欢迎查看更多与《关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题》相关教程,学精学透。编程之家 52php.cn为您提供精彩教程。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读