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

本站1月9日消息,天猫精灵日前发布云云接入服务升级的公告,升级后的云云接入服务从1月1日起从免费模式变更为付费。本站附新增功能和优化:优化云端协议,提升设备连接的稳定性;优化重点品类的语音控制;账号授权升级:新增天猫精灵中开发者三方App的展示功能,帮助用户更快更方便进行账号绑定,同时新增开发者三方App账号授权支持一键绑定天猫精灵账号;新增终端屏显交互能力,除语音交互外,用户可通过app、带屏音箱控制设备、获取设备状态;新增智能场景联动能力,新建产品的属性、事件,可作为状态或事件上报,定义天猫

两年多前,Adobe 发布了一则引人关注的公告 —— 将在 2020 年 12 月 31 日终止支持 Flash,宣告了一个时代的结束。一晃两年过去了,Adobe 早已从官方网站中删除了 Flash Player 早期版本的所有存档,并阻止基于 Flash 的内容运行。微软也已经终止对 Adobe Flash Player 的支持,并禁止其在任何 Microsoft 浏览器上运行。Adobe Flash Player 组件于 2021 年 7 月通过 Windows 更新永久删除。当 Flash

PHP是一种开源的服务器端编程语言,是Web应用程序开发中最流行的语言之一。随着技术的不断发展,PHP也在不断更新和改进。最新的PHP版本是8.3,这个版本带来了一些重要的更新和改进,本文将介绍一些开发者必知的重要更新。类型和属性改进PHP8.3引入了一些对类型和属性的改进,其中最受欢迎的是在类型声明中引入了新的union类型。Union类型允许函数的参数

Webman:一个开发者的完美伙伴随着互联网的发展,Web开发已经成为了一个非常重要的领域。在这个领域,开发者需要掌握多种技术和工具来构建高效、可靠的Web应用程序。而作为一个开发者的完美伙伴,Webman提供了许多有用的功能和工具,极大地简化了开发过程,并提高了效率。Webman是一个基于Python语言的Web开发框架,它结合了许多常用的工具和库,给开发

解放开发者的选择困难症:五个让你眼花缭乱的kafka可视化工具引言:Kafka是一种高性能、分布式的流数据平台,被广泛应用于构建实时数据管道和流处理应用。作为开发者,处理Kafka中的消息队列是一项关键任务。然而,直接通过命令行或API来操作Kafka可能会令开发者感到繁琐,因此,为了方便开发者管理和监控Kafka,出现了各种可视化工具。本文将介绍五个引人注

Golang:AI开发者的首选摘要:人工智能(ArtificialIntelligence,AI)正逐渐成为我们日常生活中不可或缺的一部分。AI技术的快速发展使得越来越多的开发者开始探索如何利用AI来解决各种问题。而在AI开发中,选择合适的编程语言尤为重要。在众多编程语言中,Golang(又称Go)因其独特的优势而成为越来越多AI开发者的

Canvas的独特之处:为何成为开发者的首选?随着技术的不断发展,开发者们在构建丰富、交互性强的Web应用程序时,面临了越来越多的选择。其中,HTML5的Canvas元素因其强大的绘图功能,成为众多开发者的首选工具。Canvas是HTML5中新增的一个元素,它提供了一种面向像素的绘图环境。与传统的基于DOM的方法相比,Canvas使用JavaScript绘制

Go语言的跨平台能力为开发者带来了哪些好处和机会随着各种操作系统和平台的出现,开发者在选择编程语言时需要考虑跨平台能力。而Go语言作为一门现代化的编程语言,以其出色的跨平台能力而备受开发者的青睐。本文将探讨Go语言的跨平台能力带来的好处和机会。跨平台开发的好处Go语言的跨平台能力意味着开发者可以采用一套代码同时运行在不同的操作系统和平台上,大大降低了开发和维


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음
