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

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

Jul 12, 2016 am 09:03 AM
開發者

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
天貓精靈雲端存取服務升級:免費開發者收費 天貓精靈雲端存取服務升級:免費開發者收費 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 的內容運作。微軟也已經終止對 Adob​​​​e Flash Player 的支持,並禁止其在任何 Microsoft 瀏覽器上運行。 Adobe Flash Player 元件於 2021 年 7 月透過 Windows 更新永久刪除。當 Flash

PyCharm是什麼工具?適合哪些開發者使用? PyCharm是什麼工具?適合哪些開發者使用? Feb 20, 2024 am 08:29 AM

PyCharm是一款由JetBrains公司開發的Python整合開發環境(IDE)。它為Python開發者提供了豐富的功能和工具,幫助他們更有效率地編寫、偵錯和部署Python程式碼。 PyCharm具有許多強大的功能,包括智慧程式碼補全、語法高亮、偵錯器、單元測試工具、版本控制整合、程式碼重構等。這些功能使開發者能夠快速定位程式碼問題、提高程式碼質量,並加快開發週期。

Go語言的跨平台能力為開發者帶來了更多的創新和發展機會 Go語言的跨平台能力為開發者帶來了更多的創新和發展機會 Jul 04, 2023 am 08:03 AM

Go語言的跨平台能力為開發者帶來了更多的創新和發展機會隨著科技的不斷發展,軟體開發已成為各行各業的重要組成部分。而跨平台能力在軟體開發中扮演著至關重要的角色。 Go語言作為一種現代化的程式語言,具備強大的跨平台能力,為開發者提供了更多的創新和發展機會。本文將以程式碼範例的方式,介紹Go語言的跨平台特性及其應用。首先,Go語言具備與多個作業系統和平台的良好相容性

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類型允許函數的參數

PHP開發者必備技能-學會如何呼叫並使用外部API介面。 PHP開發者必備技能-學會如何呼叫並使用外部API介面。 Sep 05, 2023 pm 06:22 PM

PHP開發者必備技能-學會如何呼叫並使用外部API介面隨著網路的發展,越來越多的應用程式和網站需要與外部的API介面進行交互,以獲得更多的資料和功能。身為PHP開發者,學會如何呼叫並使用外部API介面是必不可少的技能。本文將介紹一些基本的知識和程式碼範例,幫助PHP開發者更好地理解和應用API介面。什麼是API介面? API(ApplicationPr

Golang:AI 開發者的首選 Golang:AI 開發者的首選 Sep 09, 2023 pm 12:10 PM

Golang:AI開發者的首選摘要:人工智慧(ArtificialIntelligence,AI)正逐漸成為我們日常生活中不可或缺的一部分。 AI技術的快速發展使得越來越多的開發者開始探索如何利用AI來解決各種問題。而在AI開發中,選擇合適的程式語言尤其重要。在眾多程式語言中,Golang(又稱Go)因其獨特的優勢而成為越來越多AI開發者的

See all articles