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

핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

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

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

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

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











9일 이 사이트의 소식에 따르면 티몰 엘프는 최근 윈윈 접속 서비스 업그레이드를 발표했다. 업그레이드된 윈윈 접속 서비스가 1월 1일부터 무료 모드에서 유료 모드로 변경된다. 이 사이트에는 새로운 기능과 최적화가 포함되어 있습니다. 클라우드 프로토콜을 최적화하여 장치 연결의 안정성을 향상합니다. 주요 카테고리에 대한 음성 제어를 최적화합니다. 계정 인증 업그레이드: 사용자가 더 빠르게 업데이트할 수 있도록 Tmall Genie에 개발자 타사 앱의 표시 기능을 추가합니다. 계정 바인딩에 편리합니다. 동시에 Tmall Elf 계정의 원클릭 바인딩을 지원하는 타사 앱 계정 인증이 추가되었습니다. , 사용자는 앱과 화면 스피커를 통해 장치를 제어하고 정보를 얻을 수 있습니다. 장비 상태, 새로운 제품 속성 및 이벤트는 Tmall을 정의하는 상태 또는 이벤트로 보고될 수 있습니다.

2년여 전, Adobe는 2020년 12월 31일에 Flash 지원을 종료하고 시대의 종말을 알린다는 주목할만한 발표를 했습니다. 2년이 지난 지금, Adobe는 이미 공식 웹사이트에서 Flash Player 초기 버전의 모든 아카이브를 제거하고 Flash 기반 컨텐츠 실행을 차단했습니다. 또한 Microsoft는 Adobe Flash Player에 대한 지원을 종료하고 모든 Microsoft 브라우저에서 실행을 금지했습니다. Adobe Flash Player 구성 요소는 2021년 7월 Windows 업데이트를 통해 영구적으로 제거되었습니다. 플래시할 때

PyCharm은 JetBrains에서 개발한 Python 통합 개발 환경(IDE)입니다. Python 개발자에게 Python 코드를 보다 효율적으로 작성, 디버그 및 배포하는 데 도움이 되는 풍부한 기능과 도구를 제공합니다. PyCharm에는 지능형 코드 완성, 구문 강조, 디버거, 단위 테스트 도구, 버전 제어 통합, 코드 리팩토링 등을 포함한 많은 강력한 기능이 있습니다. 이러한 기능을 통해 개발자는 코드 문제를 빠르게 찾고, 코드 품질을 개선하고, 개발 주기를 가속화할 수 있습니다.

Webman: 개발자의 완벽한 파트너 인터넷의 발달과 함께 웹 개발은 매우 중요한 분야가 되었습니다. 이 분야에서 개발자는 효율적이고 안정적인 웹 애플리케이션을 구축하기 위해 다양한 기술과 도구를 숙지해야 합니다. 개발자의 완벽한 파트너인 Webman은 개발 프로세스를 크게 단순화하고 효율성을 향상시키는 많은 유용한 기능과 도구를 제공합니다. Webman은 Python 언어를 기반으로 하는 웹 개발 프레임워크로, 일반적으로 사용되는 많은 도구와 라이브러리를 결합하여 개발자에게 제공합니다.

PHP는 오픈 소스 서버 측 프로그래밍 언어이며 웹 애플리케이션 개발에 가장 널리 사용되는 언어 중 하나입니다. 기술이 계속 발전함에 따라 PHP는 지속적으로 업데이트되고 개선됩니다. 최신 PHP 버전은 8.3입니다. 이 버전에서는 개발자가 알아야 할 몇 가지 중요한 업데이트를 소개합니다. 유형 및 속성 개선 PHP 8.3에는 유형 및 속성에 대한 여러 가지 개선 사항이 도입되었으며, 그 중 가장 인기 있는 것은 유형 선언에 새로운 공용체 유형이 도입된 것입니다. Union 유형은 함수에 대한 매개변수를 허용합니다.

Golang: AI 개발자를 위한 첫 번째 선택 요약: 인공 지능(AI)은 점차 우리 일상 생활에서 없어서는 안 될 부분이 되어가고 있습니다. AI 기술의 급속한 발전으로 인해 점점 더 많은 개발자가 AI를 사용하여 다양한 문제를 해결하는 방법을 모색하고 있습니다. AI 개발에서는 올바른 프로그래밍 언어를 선택하는 것이 특히 중요합니다. 많은 프로그래밍 언어 중에서 Golang(Go라고도 함)은 고유한 장점으로 인해 점점 더 많은 AI 개발자가 선택하고 있습니다.

Go 언어의 크로스 플랫폼 기능은 개발자에게 어떤 이점과 기회를 제공합니까? 다양한 운영 체제와 플랫폼의 출현으로 개발자는 프로그래밍 언어를 선택할 때 크로스 플랫폼 기능을 고려해야 합니다. 최신 프로그래밍 언어인 Go 언어는 뛰어난 크로스 플랫폼 기능으로 인해 개발자들이 선호합니다. 이 기사에서는 Go 언어의 크로스 플랫폼 기능이 가져오는 이점과 기회를 살펴보겠습니다. 크로스 플랫폼 개발의 이점 Go 언어의 크로스 플랫폼 기능은 개발자가 코드 세트를 사용하여 다양한 운영 체제 및 플랫폼에서 동시에 실행할 수 있음을 의미하므로 개발 및 유지 관리 비용이 크게 절감됩니다.

PHP 개발자를 위한 필수 기술 - 외부 API 인터페이스를 호출하고 사용하는 방법을 배우십시오. 인터넷이 발전함에 따라 점점 더 많은 응용 프로그램과 웹 사이트가 더 많은 데이터와 기능을 얻기 위해 외부 API 인터페이스와 상호 작용해야 합니다. PHP 개발자로서 외부 API 인터페이스를 호출하고 사용하는 방법을 배우는 것은 필수적인 기술입니다. 이 기사에서는 PHP 개발자가 API 인터페이스를 더 잘 이해하고 적용하는 데 도움이 되는 몇 가지 기본 지식과 코드 예제를 소개합니다. API 인터페이스란 무엇입니까? API(애플리케이션Pr
