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


Posted in PHP onDecember 21, 2015

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

<?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 相关文章推荐
使用PHP遍历文件夹与子目录的函数代码
Sep 26 PHP
关于PHP递归算法和应用方法介绍
Apr 15 PHP
解析PHP中的正则表达式以及模式匹配
Jun 19 PHP
关于PHP语言构造器介绍
Jul 08 PHP
php多线程实现方法及用法实例详解
Oct 26 PHP
PHP封装的字符串加密解密函数
Dec 18 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
Jan 19 PHP
iis 7下安装laravel 5.4环境的方法教程
Jun 14 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
Sep 29 PHP
PHP实现文件上传后台处理脚本
Mar 04 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 PHP
Laravel配合jwt使用的方法实例
Oct 25 PHP
变量在 PHP7 内部的实现(二)
Dec 21 #PHP
变量在 PHP7 内部的实现(一)
Dec 21 #PHP
php阿拉伯数字转中文人民币大写
Dec 21 #PHP
详解PHP执行定时任务的实现思路
Dec 21 #PHP
PHP定时执行任务的3种方法详解
Dec 21 #PHP
详解PHP实现执行定时任务
Dec 21 #PHP
php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
Dec 21 #PHP
You might like
PHP安全防范技巧分享
2011/11/03 PHP
php中数组首字符过滤功能代码
2012/07/31 PHP
PHP面向对象精要总结
2014/11/07 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
PHP使用ActiveMQ实现消息队列的方法详解
2019/05/31 PHP
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
IE8下String的Trim()方法失效的解决方法
2013/11/08 Javascript
php利用curl获取远程图片实现方法
2015/10/26 Javascript
jQuery+jsp实现省市县三级联动效果(附源码)
2015/12/03 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
2016/02/16 Javascript
Node.js插件安装图文教程
2016/05/06 Javascript
BOM系列第二篇之定时器requestAnimationFrame
2016/08/17 Javascript
JavaScript 函数节流详解及方法总结
2017/02/09 Javascript
js实现文字跑马灯效果
2017/02/23 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
2017/11/22 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
Vue中mintui的field实现blur和focus事件的方法
2018/08/25 Javascript
React优化子组件render的使用
2019/05/12 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
2019/07/09 Javascript
利用Vue实现简易播放器的完整代码
2020/12/30 Vue.js
对Python的Django框架中的项目进行单元测试的方法
2016/04/11 Python
浅谈Python的文件类型
2016/05/30 Python
Python进程间通信之共享内存详解
2017/10/30 Python
Python自定义简单图轴简单实例
2018/01/08 Python
Python装饰器使用你可能不知道的几种姿势
2019/10/25 Python
关于python中plt.hist参数的使用详解
2019/11/28 Python
先进个人事迹材料
2014/01/25 职场文书
吨的认识教学反思
2014/04/27 职场文书
2014年加油站站长工作总结
2014/12/23 职场文书
店铺转让协议书
2015/01/29 职场文书
2015年幼儿园教研活动总结
2015/03/25 职场文书
聘任合同书
2015/09/21 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书
高中议论文(范文2篇)
2019/08/19 职场文书
mysq启动失败问题及场景分析
2021/07/15 MySQL