关于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中使用Imagick实现图像直方图的实现代码
Aug 30 PHP
php_screw 1.5:php加密: 安装与使用详解
Jun 20 PHP
深入解析Session是否必须依赖Cookie
Aug 02 PHP
zf框架的Filter过滤器使用示例
Mar 13 PHP
PDO预处理语句PDOStatement对象使用总结
Nov 20 PHP
PHP中文编码小技巧
Dec 25 PHP
PHP getallheaders无法获取自定义头(headers)的问题
Mar 23 PHP
PHP MSSQL 分页实例
Apr 13 PHP
php实现将base64格式图片保存在指定目录的方法
Oct 13 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
Aug 07 PHP
php之可变变量的实例详解
Sep 12 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 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
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
PHP随机数 C扩展随机数
2016/05/04 PHP
php求数组全排列,元素所有组合的方法
2016/05/05 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
2017/03/28 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
js使用for循环查询数组中是否存在某个值
2014/08/12 Javascript
在浏览器中实现图片粘贴的jQuery插件-- pasteimg使用指南
2014/12/29 Javascript
javascript同步服务器时间和同步倒计时小技巧
2015/09/24 Javascript
跟我学习javascript的最新标准ES6
2015/11/20 Javascript
javascript定义类和类的实现实例详解
2015/12/01 Javascript
轻松实现javascript图片轮播特效
2016/01/13 Javascript
JavaScript登录验证码的实现
2016/10/27 Javascript
微信小程序技巧之show内容展示,上传文件编码问题
2017/01/23 Javascript
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
2020/05/15 Javascript
Python实现从百度API获取天气的方法
2015/03/11 Python
python 3.7.0 下pillow安装方法
2018/08/27 Python
浅谈python函数调用返回两个或多个变量的方法
2019/01/23 Python
python 用pandas实现数据透视表功能
2020/12/21 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
马来西亚最好的婴儿商店:Motherhood
2017/09/14 全球购物
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
北美女性服装零售连锁店:maurices
2019/06/12 全球购物
彪马法国官网:PUMA法国
2019/12/15 全球购物
Bitiba意大利:在线宠物商店
2020/10/31 全球购物
Kingsoft金山公司C/C++笔试题
2016/05/10 面试题
电信专业毕业生推荐信
2013/11/18 职场文书
卫校中专生的自我评价
2014/01/15 职场文书
求职面试个人自我评价
2014/02/28 职场文书
平安家庭示范户事迹
2014/06/02 职场文书
2014年公务员个人工作总结
2014/11/22 职场文书
导游词欢迎词
2015/02/02 职场文书
小爸爸观后感
2015/06/15 职场文书
【海涛教你打dota】体验一超神发条:咱是抢盾专业户
2022/04/01 DOTA