关于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 相关文章推荐
一个SQL管理员的web接口
Oct 09 PHP
经典的PHPer为什么被认为是草根?
Apr 02 PHP
优化使用mysql存储session的php代码
Jan 10 PHP
php循环输出数据库内容的代码
May 24 PHP
仿AS3实现PHP 事件机制实现代码
Jan 27 PHP
通过PHP修改Linux或Unix口令的方法分享
Jan 30 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
Nov 14 PHP
PHP框架自动加载类文件原理详解
Jun 06 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
Nov 20 PHP
php支付宝APP支付功能
Jul 29 PHP
php简单检测404页面的方法示例
Aug 23 PHP
laravel 解决路由除了根目录其他都404的问题
Oct 18 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实现用已经过去多长时间的方式显示时间
2015/06/05 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
2015/12/01 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
innerhtml用法 innertext用法 以及innerHTML与innertext的区别
2009/10/26 Javascript
javascript 动态设置已知select的option的value值的代码
2009/12/16 Javascript
javascript 保存文件到本地实现方法
2012/11/29 Javascript
appendChild() 或 insertBefore()使用与区别介绍
2013/10/11 Javascript
jquery实现侧边弹出的垂直导航
2014/12/09 Javascript
JavaScript中字符串拼接的基本方法
2015/07/07 Javascript
JS实现浏览器状态栏文字闪烁效果的方法
2015/10/27 Javascript
jquery+json实现动态商品内容展示的方法
2016/01/14 Javascript
easyui取消表单实时验证,提交时统一验证的简单实例
2016/11/07 Javascript
基于Vue制作组织架构树组件
2017/12/06 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
express express-session的使用小结
2018/12/12 Javascript
微信小程序 Storage更新详解
2019/07/16 Javascript
python访问系统环境变量的方法
2015/04/29 Python
以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
2016/01/20 Python
Python3.6正式版新特性预览
2016/12/15 Python
python实现字符串和字典的转换
2018/09/29 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
2018/10/29 Python
Python解决两个整数相除只得到整数部分的实例
2018/11/10 Python
python time.sleep()是睡眠线程还是进程
2019/07/09 Python
使用Python实现分别输出每个数组
2019/12/06 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
欧洲品牌瓷器餐具网上商店:Porzellantreff.de
2018/04/04 全球购物
最新结婚典礼主持词
2014/03/14 职场文书
小学母亲节活动方案
2014/03/14 职场文书
《桂花雨》教学反思
2014/04/12 职场文书
学生退学证明
2015/06/23 职场文书
创业计划书之零食店(进口)
2019/09/24 职场文书
python实战之90行代码写个猜数字游戏
2021/04/22 Python
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA