WeChat サブスクリプション アカウント開発のトークン検証後、自動返信メッセージのパフォーマンスは良好ですが、送信されたメッセージは返されません。

WBOY
リリース: 2016-06-13 12:28:04
オリジナル
1036 人が閲覧しました

WeChat サブスクリプション アカウント開発のトークン検証後、自動返信メッセージ機能が完了しましたが、メッセージが返されません

トークン検証後のメッセージは、多くの人が私と同じようになると思います。サブスクリプション アカウントに送信されましたが、メッセージは返されません。

次は私がハード デバッグを通じて得た解決策です:

まず第一に、トークンの検証:

私が書いたトークンは常に検証に失敗し、長い間探していましたが、バグは見つかりませんでした。仕方がないので公式のサンプルコードを使用しました。そして、サンプルコードのデバッグを通じて、血を吐くようなバグを発見しました(バグではありません):

トークンの検証には文字エンコード形式が必要なようです! ! ! !

公式サンプルコードをサーバーに直接アップロードし、トークンを直接渡します!

公式サンプルコードを UTF-8 形式に変更してアップロードし、トークンが失敗しました失敗しました!失敗!

その後、作成した内容を ANSI 形式に変更しましたが、トークンは依然として失敗しました。酔った、酔った!その場合は、公式のサンプルコードを使用する必要があります。ここで、トークンは 1 回限りのハンドシェイク検証 であり、一度検証すると不要になると言わせてください。

さて、話が逸れそうな話に戻りますが… orz

トークン検証後、公式のサンプルコードを直接使用して、サブスクリプション アカウントをすぐにテストしてください。その結果は... 送信されたメッセージは水が注がれたようなもので、何も戻ってきません...orz

はバグを探していて、さまざまなグループで質問し、検索しています。 .. このブロガーの後 99 回と 81 回の努力を経て、ついに問題を発見しました (ここではすべてではなく、私が自分で開発した問題について説明します。別のバグがある場合は、お気軽に連絡してください):

1. 最も脆弱なバグ 見落とされていたバグですが、公式サンプル コードは書かれた responseMsg() 関数をまったく呼び出していませんでした。

2. コード $wechatObj->valid(); の行である前のトークン コードをコメント化します。トークン検証コードには echo $echostr が含まれるため、responseMsg() 関数 の echo $resultStr; (行 56) は紛らわしい XML 形式になり、次の場合には認識されません。 WeChatサーバーに入力されます(xml形式とjson形式のみが認識されるようです)。 (トークン検証はハンドシェイク検証です。開発者を検証した後は必要なくなります。きれいなコードから消えてください orz...)

3. 最も嫌なバグはやはり 文字エンコーディングです。 問題! orz...xml では UTF-8 エンコードが必要です。そのため、サンプル コードを UTF-8 エンコードに戻します。このバグは私を崩壊させます! ! !

以下は私が修正したコードです。正常に実行でき、バグはありません。必要に応じて参照してください。

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート