微信订阅号开发之token验证后,自动回复消息功能做好,发送消息没有返回

相信很多人会跟我一样,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,需要的可以参考一下

 1 <?php
 2 /**
 3   * wechat php test
 4   */
 5
 6 //define your token
 7 define("TOKEN", "codcodog");
 8
 9 $wechatObj = new wechatCallbackapiTest();
10 //$wechatObj->valid();
11 $wechatObj->responseMsg();
12
13 class wechatCallbackapiTest
14 {
15     public function valid()
16     {
17         $echoStr = $_GET["echostr"];
18
19         //valid signature , option
20         if($this->checkSignature()){
21         header(‘content-type:text‘);
22             echo $echoStr;
23             exit;
24         }
25     }
26
27     public function responseMsg()
28     {
29         //get post data, May be due to the different environments
30         $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
31         //$postStr = file_get_contents("php://input");
32         file_put_contents("log.txt",$postStr,FILE_APPEND );
33           //extract post data
34         if (!empty($postStr)){
35                 /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
36                    the best way is to check the validity of xml by yourself */
37                 libxml_disable_entity_loader(true);
38                   $postObj = simplexml_load_string($postStr, ‘SimpleXMLElement‘, LIBXML_NOCDATA);
39                 $fromUsername = $postObj->FromUserName; //用户
40                 $toUsername = $postObj->ToUserName;     //公众平台
41                 $keyword = trim($postObj->Content);
42                 $time = time();
43                 $textTpl = "<xml>
44                             <ToUserName><![CDATA[%s]]></ToUserName>
45                             <FromUserName><![CDATA[%s]]></FromUserName>
46                             <CreateTime>%s</CreateTime>
47                             <MsgType><![CDATA[%s]]></MsgType>
48                             <Content><![CDATA[%s]]></Content>
49                             <FuncFlag>0</FuncFlag>
50                             </xml>";
51                 if(!empty( $keyword ))
52                 {
53                       $msgType = "text";
54                     $contentStr = "Welcome to wechat world!";
55                     $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
56                     echo $resultStr;
57                 }else{
58                     echo "Input something...";
59                 }
60
61         }else {
62             echo "";
63             exit;
64         }
65     }
66
67     private function checkSignature()
68     {
69         // you must define TOKEN by yourself
70         if (!defined("TOKEN")) {
71             throw new Exception(‘TOKEN is not defined!‘);
72         }
73
74         $signature = $_GET["signature"];
75         $timestamp = $_GET["timestamp"];
76         $nonce = $_GET["nonce"];
77
78         $token = TOKEN;
79         $tmpArr = array($token, $timestamp, $nonce);
80         // use SORT_STRING rule
81         sort($tmpArr, SORT_STRING);
82         $tmpStr = implode( $tmpArr );
83         $tmpStr = sha1( $tmpStr );
84
85         if( $tmpStr == $signature ){
86             return true;
87         }else{
88             return false;
89         }
90     }
91 }
92
93
94 ?>
时间: 2024-10-09 21:26:57

微信订阅号开发之token验证后,自动回复消息功能做好,发送消息没有返回的相关文章

微信公众号开发之js-sdk开发

公司最近项目需要使用微信进行分享,对微信的jssdk研究了下,由于研究过程并不顺利,遇到的坑比较多,所以特意将研究结果记录下来,供大家批评和参考! 官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 微信的jssdk是面向网页开发者提供的基于微信内的网页开发工具包,提供了诸如分享朋友圈,分享微信好友,分享QQ好友 and so on,具体支持的文档参考上述官方文档; 在进行微信jssdk开发之前,首先你得拥

微信公众号开发之VS远程调试

前言 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流程是这样的,用户发送消息到微信服务器,微信服务器将接收到的消息post到用户接入时填写的url中,在url处理程序中,首先判断消息的合法性,判断成功后根据消息体的内容做相应的相应.原理很容易理解,接触过socket的可能理解起来更容易. 其实微信开发并不是很麻烦或者很难,官方给的文档也还算过的去(至少比微信支付的文档好上百倍),最让人痛苦的就是调试,因为微信开发的过程中,用户接收微信发送过来的消息的处理程序对于微信来说

java微信公众号开发,token验证

import java.io.IOException; import java.util.Arrays; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.binjoo.utils.SH

微信公众号开发之LBS

百度地图Web服务api:http://lbsyun.baidu.com/index.php?title=webapi 1.测距 Route Matrix API v2.0:http://lbsyun.baidu.com/index.php?title=webapi/route-matrix-api-v2 1 case "location"://地理位置信息 2 $location_X = $postObj->Location_X; 3 $location_Y = $postOb

微信订阅号和服务号的区别

微信公众平台现在已分成订阅公众号和服务公众号两种类型.许多商家都会不知道微信订阅号和服务号的区别,下面我们就来和大家具体说说. 一.服务号的功能 公众平台服务号,是公众平台的一种帐号类型,旨在为用户提供服务. 1.1个月(30天)内仅可以发送1条群发消息. 2.发给订阅用户(粉丝)的消息,会显示在对方的聊天列表中. 3.在发送消息给用户时,用户将收到即时的消息提醒. 4.服务号会在订阅用户(粉丝)的通讯录中. 5.可申请自定义菜单.这时,如果不清楚怎么申请,可联系微信第三方机构“美基营销”帮忙.

腾讯员工内部培训:微信订阅号运营从入门到精通

这篇文章算是对微信运营的小小总结了,说不上是经验,毕竟一万个哈姆雷特有一万种活法.这篇文章从定位.运营(内容运营.用户运营.微信元素拆解).推广.工具.公众号推荐几个方面来总结微信运营的一些规律. 1.定位 在开始运营一个微信公众号之前可以从以下三个维度来思考定位 1.1.用户定位:搞清楚目标用户是谁,目标用户的特征是什么,做用户画像 1.2.服务定位:提供什么服务,是否有差异化 1.3.平台定位:结合用户定位与服务定位来决定平台的基调,学术型?恶搞型?创意型?……平台的基调将决定内容运营与用户

微信订阅号开发-1

前天申请了个微信订阅号,准备试试php开发微商场. 今天中午去bae搞了个服务器,然后就开始验证token,到晚上才弄完.别人的服务器用着就是麻烦,更新一下代码就要push到git上,对接口不熟悉真的是太浪费时间了.下面是终于测试成功的token验证代码. 1 class Main 2 { 3 private $sign; //微信加密签名 4 private $time; //时间戳 5 private $nonce; //随机数 6 private $echostr; //随机字符串 7 p

微信订阅号开发笔记(二)

微信开发的流程其实很简单 o(∩_∩)o 哈哈!在微信网站的编辑操作 额,就不说了.虽然有人问过.下面是我的微信开发过程,简单记录下. 成为开发者 材料:1.自己的服务器资源,百度的BAE,新浪的SAE都不错. 2.懂那么点编程语言. 3.注册微信公众号. 上面的都有了之后,就可以自己动手开发了.哇咔咔,好兴奋.有木有. 在登录进去之后,怎么成为开发者?不知道,自己看去. 开始coding吧. 1.验证 if (! empty ( $_GET ['echostr'] ) && ! empt

[原创] ASP.NET WEBAPI 接入微信公众平台 总结,Token验证失败解决办法

首先,请允许我说一句:shit! 因为这个问题不难,但是网上有关 ASP.NET WEBAPI的资料太少.都是PHP等等的. 我也是在看了某位大神的博客后有启发,一点点研究出来的. 来看正题! 1.微信公众平台的接入方法,无非4个参数(signature, timestamp, nonce, echostr)加1个Token(两边对应) 2.Token, timestamp, nonce字典排序后,按照字符串“SHA1”加密.得出一串字符串 tmpStr(转化为小写) 3.然后比对 tmpStr