关于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 printf输出格式使用说明
Dec 05 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
Jul 04 PHP
php仿QQ验证码的实例分析
Jul 01 PHP
PHP中source #N问题的解决方法
Jan 27 PHP
ThinkPHP模板Switch标签用法示例
Jun 30 PHP
php结合正则批量抓取网页中邮箱地址
May 19 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
Aug 08 PHP
分析PHP中单双引号的误区和双引号小隐患
Jul 19 PHP
PHP设计模式之工厂模式实例总结
Sep 01 PHP
php实现微信支付之企业付款
May 30 PHP
laravel获取不到session的三种解决办法【推荐】
Sep 16 PHP
浅析php如何实现爬取数据原理
Sep 27 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
一个取得文件扩展名的函数
2006/10/09 PHP
用PHP程序实现支持页面后退的两种方法
2008/06/30 PHP
PHP cdata 处理(详细介绍)
2013/07/05 PHP
PHP中使用smarty生成静态文件的例子
2014/04/24 PHP
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
PIGCMS 如何关闭聊天机器人
2015/02/12 PHP
PHP7 新增常量
2021/03/09 PHP
JavaScript去除空格的几种方法
2006/10/03 Javascript
jQuery extend 的简单实例
2013/09/18 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
jQuery formValidator表单验证
2016/01/07 Javascript
JavaScript类型系统之布尔Boolean类型详解
2016/06/26 Javascript
js简单实现图片延迟加载的方法
2016/07/19 Javascript
vue实现列表的添加点击
2016/12/29 Javascript
Angular排序实例详解
2017/06/28 Javascript
通过实例讲解JS如何防抖动
2019/06/15 Javascript
小程序实现背景音乐播放和暂停
2020/06/19 Javascript
[01:18:43]2014 DOTA2华西杯精英邀请赛5 24 iG VS DK
2014/05/25 DOTA
Python开发之快速搭建自动回复微信公众号功能
2016/04/22 Python
python解决方案:WindowsError: [Error 2]
2016/08/28 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
python集合常见运算案例解析
2019/10/17 Python
python 多线程共享全局变量的优劣
2020/09/24 Python
python中的yield from语法快速学习
2020/11/06 Python
五种Python转义表示法
2020/11/27 Python
html5 canvas实现跟随鼠标旋转的箭头
2016/03/11 HTML / CSS
美国彩妆品牌:Coastal Scents
2017/04/01 全球购物
我们是伦敦女孩:WalG
2018/01/08 全球购物
函授毕业自我鉴定
2013/12/19 职场文书
应用外语系自荐信
2014/06/26 职场文书
教师反腐倡廉演讲稿
2014/09/03 职场文书
2014年班主任工作总结
2014/11/08 职场文书
大学生创业事迹材料
2014/12/30 职场文书
南京南京观后感
2015/06/02 职场文书
2015年中学团委工作总结
2015/07/22 职场文书
小学班主任工作随笔
2015/08/15 职场文书