1. Turn on voice recognition (off by default)
2. Voice recognition
Please note that after enabling speech recognition, every time a user sends a voice message to an official account, WeChat will add a Recognition field to the pushed voice message XML packet (Note: Due to client caching, developers may enable or disable speech recognition. The function takes effect immediately for new followers and takes 24 hours for already followed users. Developers can re-follow this account for testing). The voice XML data packet after enabling voice recognition is as follows:
<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", "weixin"<span style="color: #000000;">); </span><span style="color: #008080;"> 8</span> <span style="color: #800080;">$wechatObj</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> wechatCallbackapiTest(); </span><span style="color: #008080;"> 9</span> <span style="color: #008000;">//</span><span style="color: #008000;">$wechatObj->valid();//接口验证 <span style="color: #008080;"> 10</span> <span style="color: #800080;">$wechatObj</span>->responseMsg();<span style="color: #008000;">//</span><span style="color: #008000;">调用回复消息方法</span> <span style="color: #008080;"> 11</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> wechatCallbackapiTest </span><span style="color: #008080;"> 12</span> <span style="color: #000000;">{ </span><span style="color: #008080;"> 13</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> valid() </span><span style="color: #008080;"> 14</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 15</span> <span style="color: #800080;">$echoStr</span> = <span style="color: #800080;">$_GET</span>["echostr"<span style="color: #000000;">]; </span><span style="color: #008080;"> 16</span> <span style="color: #008080;"> 17</span> <span style="color: #008000;">//</span><span style="color: #008000;">valid signature , option</span> <span style="color: #008080;"> 18</span> <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$this</span>-><span style="color: #000000;">checkSignature()){ </span><span style="color: #008080;"> 19</span> <span style="color: #0000ff;">echo</span> <span style="color: #800080;">$echoStr</span><span style="color: #000000;">; </span><span style="color: #008080;"> 20</span> <span style="color: #0000ff;">exit</span><span style="color: #000000;">; </span><span style="color: #008080;"> 21</span> <span style="color: #000000;"> } </span><span style="color: #008080;"> 22</span> <span style="color: #000000;"> } </span><span style="color: #008080;"> 23</span> <span style="color: #008080;"> 24</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> responseMsg() </span><span style="color: #008080;"> 25</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 26</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;"> 27</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;"> 28</span> <span style="color: #008080;"> 29</span> <span style="color: #008000;">//</span><span style="color: #008000;">extract post data</span> <span style="color: #008080;"> 30</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;"> 31</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;"> 32</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;"> 33</span> libxml_disable_entity_loader(<span style="color: #0000ff;">true</span><span style="color: #000000;">); </span><span style="color: #008080;"> 34</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;"> 35</span> <span style="color: #800080;">$fromUsername</span> = <span style="color: #800080;">$postObj</span>-><span style="color: #000000;">FromUserName; </span><span style="color: #008080;"> 36</span> <span style="color: #800080;">$toUsername</span> = <span style="color: #800080;">$postObj</span>-><span style="color: #000000;">ToUserName; </span><span style="color: #008080;"> 37</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;"> 38</span> <span style="color: #800080;">$time</span> = <span style="color: #008080;">time</span><span style="color: #000000;">(); </span><span style="color: #008080;"> 39</span> <span style="color: #800080;">$msgType</span> = <span style="color: #800080;">$postObj</span>->MsgType;<span style="color: #008000;">//</span><span style="color: #008000;">消息类型</span> <span style="color: #008080;"> 40</span> <span style="color: #800080;">$event</span> = <span style="color: #800080;">$postObj</span>->Event;<span style="color: #008000;">//</span><span style="color: #008000;">时间类型,subscribe(订阅)、unsubscribe(取消订阅)</span> <span style="color: #008080;"> 41</span> <span style="color: #008080;"> 42</span> <span style="color: #800080;">$textTpl</span> = "<span style="color: #000000;"><xml> </span><span style="color: #008080;"> 43</span> <span style="color: #000000;"> <ToUserName><![CDATA[%s]]></ToUserName> </span><span style="color: #008080;"> 44</span> <span style="color: #000000;"> <FromUserName><![CDATA[%s]]></FromUserName> </span><span style="color: #008080;"> 45</span> <span style="color: #000000;"> <CreateTime>%s</CreateTime> </span><span style="color: #008080;"> 46</span> <span style="color: #000000;"> <MsgType><![CDATA[%s]]></MsgType> </span><span style="color: #008080;"> 47</span> <span style="color: #000000;"> <Content><![CDATA[%s]]></Content> </span><span style="color: #008080;"> 48</span> <span style="color: #000000;"> <FuncFlag>0</FuncFlag> </span><span style="color: #008080;"> 49</span> </xml>"<span style="color: #000000;">; </span><span style="color: #008080;"> 50</span> <span style="color: #008080;"> 51</span> <span style="color: #0000ff;">switch</span>(<span style="color: #800080;">$msgType</span><span style="color: #000000;">){ </span><span style="color: #008080;"> 52</span> <span style="color: #0000ff;">case</span> "event": <span style="color: #008080;"> 53</span> <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$event</span>=="subscribe"<span style="color: #000000;">){ </span><span style="color: #008080;"> 54</span> <span style="color: #800080;">$contentStr</span> = "Hi,欢迎关注海仙日用百货!"."\n"."回复数字'1',了解店铺地址."."\n"."回复数字'2',了解商品种类."<span style="color: #000000;">; </span><span style="color: #008080;"> 55</span> <span style="color: #000000;"> } </span><span style="color: #008080;"> 56</span> <span style="color: #0000ff;">break</span><span style="color: #000000;">; </span><span style="color: #008080;"> 57</span> <span style="color: #0000ff;">case</span> "text":<span style="color: #008000;">//</span><span style="color: #008000;">文本消息</span> <span style="color: #008080;"> 58</span> <span style="color: #0000ff;">switch</span>(<span style="color: #800080;">$keyword</span><span style="color: #000000;">){ </span><span style="color: #008080;"> 59</span> <span style="color: #0000ff;">case</span> "1": <span style="color: #008080;"> 60</span> <span style="color: #800080;">$contentStr</span> = "店铺地址:"."\n"."杭州市江干区."<span style="color: #000000;">; </span><span style="color: #008080;"> 61</span> <span style="color: #0000ff;">break</span><span style="color: #000000;">; </span><span style="color: #008080;"> 62</span> <span style="color: #0000ff;">case</span> "2": <span style="color: #008080;"> 63</span> <span style="color: #800080;">$contentStr</span> = "商品种类:"."\n"."杯子、碗、棉签、水桶、垃圾桶、洗碗巾(刷)、拖把、扫把、" <span style="color: #008080;"> 64</span> ."衣架、粘钩、牙签、垃圾袋、保鲜袋(膜)、剪刀、水果刀、饭盒等."<span style="color: #000000;">; </span><span style="color: #008080;"> 65</span> <span style="color: #0000ff;">break</span><span style="color: #000000;">; </span><span style="color: #008080;"> 66</span> <span style="color: #0000ff;">default</span>: <span style="color: #008080;"> 67</span> <span style="color: #800080;">$contentStr</span> = "对不起,你的内容我会稍后回复"<span style="color: #000000;">; </span><span style="color: #008080;"> 68</span> <span style="color: #000000;"> } </span><span style="color: #008080;"> 69</span> <span style="color: #0000ff;">break</span><span style="color: #000000;">; </span><span style="color: #008080;"> 70</span> <span style="color: #0000ff;">case</span> "voice":<span style="color: #008000;">//</span><span style="color: #008000;">语音消息 </span><span style="color: #008080;"> 71</span> <span style="color: #008000;"> //语音识别</span> <span style="color: #008080;"> 72</span> <span style="color: #800080;">$recognition</span> = <span style="color: #800080;">$postObj</span>-><span style="color: #000000;">Recognition; </span><span style="color: #008080;"> 73</span> <span style="color: #800080;">$format</span> = <span style="color: #800080;">$postObj</span>-><span style="color: #000000;">Format; </span><span style="color: #008080;"> 74</span> <span style="color: #800080;">$contentStr</span> = "你发送的是语音消息"."\n"."语音格式为:"."\n".<span style="color: #800080;">$format</span>."\n"."语音内容为:"."\n".<span style="color: #800080;">$recognition</span><span style="color: #000000;">; </span><span style="color: #008080;"> 75</span> <span style="color: #0000ff;">break</span><span style="color: #000000;">; </span><span style="color: #008080;"> 76</span> <span style="color: #000000;"> } </span><span style="color: #008080;"> 77</span> <span style="color: #800080;">$msgType</span> = "text"<span style="color: #000000;">; </span><span style="color: #008080;"> 78</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;"> 79</span> <span style="color: #0000ff;">echo</span> <span style="color: #800080;">$resultStr</span><span style="color: #000000;">; </span><span style="color: #008080;"> 80</span> }<span style="color: #0000ff;">else</span><span style="color: #000000;"> { </span><span style="color: #008080;"> 81</span> <span style="color: #0000ff;">echo</span> ""<span style="color: #000000;">; </span><span style="color: #008080;"> 82</span> <span style="color: #0000ff;">exit</span><span style="color: #000000;">; </span><span style="color: #008080;"> 83</span> <span style="color: #000000;"> } </span><span style="color: #008080;"> 84</span> <span style="color: #000000;"> } </span><span style="color: #008080;"> 85</span> <span style="color: #008080;"> 86</span> <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> checkSignature() </span><span style="color: #008080;"> 87</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 88</span> <span style="color: #008000;">//</span><span style="color: #008000;"> you must define TOKEN by yourself</span> <span style="color: #008080;"> 89</span> <span style="color: #0000ff;">if</span> (!<span style="color: #008080;">defined</span>("TOKEN"<span style="color: #000000;">)) { </span><span style="color: #008080;"> 90</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;"> 91</span> <span style="color: #000000;"> } </span><span style="color: #008080;"> 92</span> <span style="color: #008080;"> 93</span> <span style="color: #800080;">$signature</span> = <span style="color: #800080;">$_GET</span>["signature"<span style="color: #000000;">]; </span><span style="color: #008080;"> 94</span> <span style="color: #800080;">$timestamp</span> = <span style="color: #800080;">$_GET</span>["timestamp"<span style="color: #000000;">]; </span><span style="color: #008080;"> 95</span> <span style="color: #800080;">$nonce</span> = <span style="color: #800080;">$_GET</span>["nonce"<span style="color: #000000;">]; </span><span style="color: #008080;"> 96</span> <span style="color: #008080;"> 97</span> <span style="color: #800080;">$token</span> =<span style="color: #000000;"> TOKEN; </span><span style="color: #008080;"> 98</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;"> 99</span> <span style="color: #008000;">//</span><span style="color: #008000;"> use SORT_STRING rule</span> <span style="color: #008080;">100</span> <span style="color: #008080;">sort</span>(<span style="color: #800080;">$tmpArr</span>,<span style="color: #000000;"> SORT_STRING); </span><span style="color: #008080;">101</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;">102</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;">103</span> <span style="color: #008080;">104</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;">105</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #000000;">; </span><span style="color: #008080;">106</span> }<span style="color: #0000ff;">else</span><span style="color: #000000;">{ </span><span style="color: #008080;">107</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">; </span><span style="color: #008080;">108</span> <span style="color: #000000;"> } </span><span style="color: #008080;">109</span> <span style="color: #000000;"> } </span><span style="color: #008080;">110</span> <span style="color: #000000;">} </span><span style="color: #008080;">111</span> <span style="color: #008080;">112</span> <span style="color: #008080;">113</span> ?>