关于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 array_map()数组函数使用说明
Jul 12 PHP
php使用curl发送json格式数据实例
Dec 17 PHP
PHP ajax 异步执行不等待执行结果的处理方法
May 27 PHP
php文件读取方法实例分析
Jun 20 PHP
php排序算法实例分析
Oct 17 PHP
PHP并发查询MySQL的实例代码
Aug 09 PHP
PHP基于递归实现的约瑟夫环算法示例
Aug 27 PHP
PHP基于堆栈实现的高级计算器功能示例
Sep 15 PHP
PHP实现浏览器格式化显示XML的方法示例
Jan 22 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
Jan 22 PHP
php实现根据身份证获取精准年龄
Feb 26 PHP
php中yar框架实例用法讲解
Dec 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
广播爱好者需要了解的天线知识
2021/03/01 无线电
用穿越火线快速入门php面向对象
2012/02/22 PHP
解析PHP中empty is_null和isset的测试
2013/06/29 PHP
php+mysql实现无限分类实例详解
2015/01/15 PHP
PHP随机生成信用卡卡号的方法
2015/03/23 PHP
PHP 7的一些引人注目的新特性简单介绍
2015/11/08 PHP
jQuery AnythingSlider滑动效果插件
2010/02/07 Javascript
jQuery中绑定事件的命名空间详解
2011/04/05 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
javascript兼容性(实例讲解)
2017/08/15 Javascript
mongoose设置unique不生效问题的解决及如何移除unique的限制
2017/11/07 Javascript
使用classList来实现两个按钮样式的切换方法
2018/01/24 Javascript
mint-ui在vue中的使用示例
2018/04/05 Javascript
vue实现城市列表选择功能
2018/07/16 Javascript
React注册倒计时功能的实现
2018/09/06 Javascript
Node.js 的 GC 机制详解
2019/06/03 Javascript
微信小程序页面调用自定义组件内的事件详解
2019/09/12 Javascript
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[03:12]完美世界DOTA2联赛PWL DAY6集锦
2020/11/05 DOTA
使用Python判断IP地址合法性的方法实例
2014/03/13 Python
Python中使用md5sum检查目录中相同文件代码分享
2015/02/02 Python
Python制作CSDN免积分下载器
2015/03/10 Python
解决python flask中config配置管理的问题
2019/07/26 Python
python实发邮件实例详解
2019/11/11 Python
OpenCV Python实现图像指定区域裁剪
2021/03/12 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
淘宝网店营销策划书
2014/01/11 职场文书
幼儿园教师奖惩制度
2014/02/01 职场文书
党课知识竞赛主持词
2014/04/01 职场文书
关于诚信的活动方案
2014/08/18 职场文书
农村环境卫生倡议书
2015/04/29 职场文书
房屋产权证明书
2015/06/19 职场文书
村官2015年度工作总结
2015/10/14 职场文书