关于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_Flame(Version:Progress)的原代码
Oct 09 PHP
PHP explode()函数用法、切分字符串
Oct 03 PHP
PHP函数getenv简介和使用实例
May 12 PHP
php函数实现判断是否移动端访问
Mar 03 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
Apr 15 PHP
php结合ACCESS的跨库查询功能
Jun 12 PHP
php版微信自定义回复功能示例
Dec 05 PHP
PHP常用算法和数据结构示例(必看篇)
Mar 15 PHP
php微信扫码支付 php公众号支付
Mar 24 PHP
PHP中Static(静态)关键字功能与用法实例分析
Apr 05 PHP
PHP7.3.10编译安装教程
Oct 08 PHP
yii框架结合charjs实现统计30天数据的方法
Apr 04 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
破解.net程序(dll文件)编译和反编译方法
2013/01/31 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
2014/08/21 PHP
php截取字符串函数分享
2015/02/02 PHP
php计算税后工资的方法
2015/07/28 PHP
ThinkPHP路由机制简介
2016/03/23 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
2019/04/23 PHP
解决laravel查询构造器中的别名问题
2019/10/17 PHP
javascript 变量作用域 代码分析
2009/06/26 Javascript
Jquery阻止事件冒泡 event.stopPropagation
2011/12/11 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
JS匀速运动演示示例代码
2013/11/26 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
jQuery插件jquery-barcode实现条码打印的方法
2015/11/25 Javascript
js实现网页收藏功能
2015/12/17 Javascript
深入解析JavaScript中的立即执行函数
2016/05/21 Javascript
JavaScript直播评论发弹幕切图功能点集合效果代码
2016/06/26 Javascript
angular-ngSanitize模块-$sanitize服务详解
2017/06/13 Javascript
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
js定时器+简单的动画效果实例
2017/11/10 Javascript
动态加载权限管理模块中的Vue组件
2018/01/16 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
2019/09/03 Javascript
vue远程加载sfc组件思路详解
2019/12/25 Javascript
Python中的日期时间处理详解
2016/11/17 Python
浅谈Python 的枚举 Enum
2017/06/12 Python
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
2017/10/07 Python
Django实现基于类的分页功能
2019/10/31 Python
简单了解django处理跨域请求最佳解决方案
2020/03/25 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
HTML5 Web Workers之网站也能多线程的实现
2013/04/24 HTML / CSS
五一劳动节活动总结
2015/02/09 职场文书
自我推荐信怎么写
2015/03/24 职场文书
统计员岗位职责范本
2015/04/14 职场文书
关于对TypeScript泛型参数的默认值理解
2022/07/15 Javascript
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL