关于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之变量、常量学习笔记
Mar 27 PHP
PHP设置图片文件上传大小的具体实现方法
Oct 11 PHP
php中数字0和空值的区别分析
Jun 05 PHP
php生成excel列名超过26列大于Z时的解决方法
Dec 29 PHP
smarty内置函数section的用法
Jan 22 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
Dec 15 PHP
PHP中字符串长度的截取用法示例
Jan 12 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
Feb 20 PHP
PHP中危险的file_put_contents函数详解
Nov 04 PHP
一次因composer错误使用引发的问题与解决
Mar 06 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
May 02 PHP
PHP unset函数原理及使用方法解析
Aug 14 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
星际中一些鲜为人知的详细资料
2020/03/04 星际争霸
百度地图API应用之获取用户的具体位置
2014/06/10 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
php检查日期函数checkdate用法实例
2015/03/19 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
php文件上传的两种实现方法
2016/04/04 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
2017/06/15 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
javascript 的Document属性和方法集合
2010/01/25 Javascript
一个简单的JS鼠标悬停特效具体方法
2013/06/17 Javascript
Vue.js每天必学之指令系统与自定义指令
2016/09/07 Javascript
微信小程序手势操作之单触摸点与多触摸点
2017/03/10 Javascript
ES6基础之数组和对象的拓展实例详解
2019/08/22 Javascript
Javascript如何实现双指控制图片功能
2020/02/25 Javascript
使用Python脚本将绝对url替换为相对url的教程
2015/04/24 Python
Python下载网络小说实例代码
2018/02/03 Python
transform python环境快速配置方法
2018/09/27 Python
Windows下Python3.6安装第三方模块的方法
2018/11/22 Python
python django框架中使用FastDFS分布式文件系统的安装方法
2019/06/10 Python
Django 重写用户模型的实现
2019/07/29 Python
python 实现矩阵填充0的例子
2019/11/29 Python
python实现指定ip端口扫描方式
2019/12/17 Python
Python批量启动多线程代码实例
2020/02/18 Python
浅谈ROC曲线的最佳阈值如何选取
2020/02/28 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
2021/01/09 Python
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
Kickers鞋英国官网:男士、女士和儿童鞋
2021/03/08 全球购物
初一体育教学反思
2014/01/29 职场文书
学习决心书
2014/03/11 职场文书
委托代理人授权委托书范本
2014/09/24 职场文书
党员“四风”问题批评与自我批评思想汇报
2014/10/06 职场文书
加强作风建设演讲稿
2014/10/24 职场文书
幼儿园个人总结
2015/02/28 职场文书
2015年七一建党节慰问信
2015/03/23 职场文书