搜尋
首頁後端開發php教程微信订阅号开发之token验证后,自动回复消息功能做好,发送消息没有返回,token自动回复_PHP教程

微信订阅号开发之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> ?>

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1082307.htmlTechArticle微信订阅号开发之token验证后,自动回复消息功能做好,发送消息没有返回,token自动回复 相信很多人会跟我一样,token验证之后,发送消息...
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
天猫精灵云云接入服务升级:免费开发者收费天猫精灵云云接入服务升级:免费开发者收费Jan 09, 2024 pm 10:06 PM

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

为拯救童年回忆,开发者决定采用古法编程:用Flash高清重制了一款游戏为拯救童年回忆,开发者决定采用古法编程:用Flash高清重制了一款游戏Apr 11, 2023 pm 10:16 PM

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

Webman:一个开发者的完美伙伴Webman:一个开发者的完美伙伴Aug 13, 2023 pm 02:25 PM

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

PHP 8.3:开发者必知的重要更新PHP 8.3:开发者必知的重要更新Nov 27, 2023 am 10:19 AM

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

Golang:AI 开发者的首选Golang:AI 开发者的首选Sep 09, 2023 pm 12:10 PM

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

Go语言的跨平台能力为开发者带来了哪些好处和机会Go语言的跨平台能力为开发者带来了哪些好处和机会Jul 04, 2023 pm 11:45 PM

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

战胜选择困难症:五个令你眼花缭乱的kafka可视化工具,助力开发者解放战胜选择困难症:五个令你眼花缭乱的kafka可视化工具,助力开发者解放Jan 05, 2024 pm 07:43 PM

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

Canvas的独特之处:为何成为开发者的首选?Canvas的独特之处:为何成为开发者的首选?Jan 07, 2024 am 11:02 AM

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

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),