{"id":29239,"date":"2024-11-25T17:09:20","date_gmt":"2024-11-25T09:09:20","guid":{"rendered":"https:\/\/fwq.ai\/blog\/29239\/"},"modified":"2024-11-25T17:09:20","modified_gmt":"2024-11-25T09:09:20","slug":"php%e5%be%ae%e4%bf%a1%e5%bc%80%e5%8f%91%e4%b9%8b%e5%be%ae%e4%bf%a1%e6%b6%88%e6%81%af%e8%87%aa%e5%8a%a8%e5%9b%9e%e5%a4%8d%e9%81%87%e5%88%b0%e7%9a%84%e9%97%ae%e9%a2%98","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/29239\/","title":{"rendered":"PHP\u5fae\u4fe1\u5f00\u53d1\u4e4b\u5fae\u4fe1\u6d88\u606f\u81ea\u52a8\u56de\u590d\u9047\u5230\u7684\u95ee\u9898"},"content":{"rendered":"<p>\u8fd9\u7bc7\u6587\u7ae0\u662f\u5c0f\u7f16\u7ed9\u5927\u5bb6\u4ecb\u7ecd\u7684\u5fae\u4fe1\u6d88\u606f\u81ea\u52a8\u56de\u590d\u4e0b\u6240\u9047\u5230\u7684\u5751\u7684\u76f8\u5173\u5185\u5bb9\uff0c\u5728\u65e5\u5e38\u9879\u76ee\u5f00\u53d1\u4e2d\u7ecf\u5e38\u9047\u5230\uff0c\u975e\u5e38\u5177\u6709\u53c2\u8003\u501f\u9274\u4ef7\u503c\uff0c\u611f\u5174\u8da3\u7684\u5c0f\u4f19\u4f34\u4e00\u8d77\u5b66\u4e60\u5427<\/p>\n<p>\u5fae\u4fe1\u56de\u590d\u539f\u7406\uff1a<\/p>\n<p>\u5f53\u666e\u901a\u5fae\u4fe1\u7528\u6237\u5411\u516c\u4f17\u8d26\u53f7\u65f6\uff0c\u5fae\u4fe1\u670d\u52a1\u5668\u9996\u5148\u6536\u5230\u7528\u6237\u53d1\u9001\u7684\u6d88\u606f\uff1b<\/p>\n<p>\u7136\u540e\u5c06\u7528\u6237\u4fe1\u606f\u548c\u6d88\u606f\u6253\u5305\u6210\u683c\u5f0f\u7684\u6570\u636e\u5305\uff0c\u518d\u5c06\u8fd9\u4e2aXML\u6570\u636e\u5305\u901a\u8fc7POST\u65b9\u6cd5\u63d0\u4ea4\u5230\u5f00\u53d1\u8005\u8bbe\u7f6e\u7684URL\u4e0a\u3002<\/p>\n<p>\u7591\u95ee\u4e00\uff1a\u4e3a\u4f55\u4f7f\u7528$GLOBALS[&#8220;HTTP_RAW_POST_DATA&#8221;]\u4fdd\u5b58POST\u8fc7\u6765\u7684\u6570\u636e\uff0c\u800c\u975e$_POST\uff1f<\/p>\n<p><span>\u7acb\u5373\u5b66\u4e60<\/span>\u201c\u201d\uff1b<\/p>\n<p>\u56de\u7b54\uff1a<\/p>\n<p>POST\u53ea\u80fd\u4fdd\u5b58\u6807\u51c6\u7684\uff0c\u5bf9\u4e8eXML\u3001\u6216Application\/Octet-steam\u4e4b\u7c7b\u7684\u5185\u5bb9\u5219\u65e0\u6cd5\u89e3\u6790\u3002<\/p>\n<p>\u800c$GLOBALS[&#8220;HTTP_RAW_POST_DATA&#8221;]\u548c$_POST\u662f\u4e00\u6837\u7684,\u5982\u679cPOST\u8fc7\u6765\u7684\u6570\u636ePHP\u80fd\u591f\u8bc6\u522b\uff0c\u5219\u53ef\u4ee5\u7528$GLOBALS[&#8220;HTTP_RAW_POST_DATA&#8221;]\u6765\u63a5\u6536\u3002<\/p>\n<p>\u7591\u95ee\u4e8c\uff1a_load_()\u5404\u53c2\u6570\u548c\u8fd4\u56de\u503c\u662f\u4ec0\u4e48\uff1f<\/p>\n<p>\u56de\u7b54\uff1a<\/p>\n<p>\u53c2\u6570\u542b\u4e49<\/p>\n<p>:\u9700\u8981\u5904\u7406\u7684XML\u3002<\/p>\n<p>:\u7528\u6765\u6307\u5b9a\u65b0\uff0c\u901a\u5e38\u8bbe\u7f6e\u4e3a&#8221;SimpleXMLElement&#8221;,\u751f\u6210\u4e00\u4e2a\u7b80\u5355XML\u5143\u7d20\u7684\u7c7b\u3002<\/p>\n<p>options:\u6307\u5b9a\u9644\u52a0\u7684Libxml\u53c2\u6570\uff0c\u901a\u5e38\u8bbe\u7f6e\u4e3aLIBXML_NOCDATA,\u8868\u793a\u628aCDATA\u8bbe\u7f6e\u4e3a\u6587\u672c\u8282\u70b9\u3002<\/p>\n<p>ns:\u4e00\u822c\u7701\u7565<\/p>\n<p>is_prefix:\u4e00\u822c\u7701\u7565<\/p>\n<p>\u6267\u884c\u5b8c\u6210\u540e\u8fd4\u56deSimpleXMLElement\u7c7b\u7684\u4e00\u4e2a\u5bf9\u8c61\u3002<\/p>\n<p>\u529f\u80fd\uff1a\u516c\u4f17\u53f7\u53ea\u63a5\u53d7\u6587\u5b57\u6d88\u606f\uff0c\u4e14\u505a\u51fa\u76f8\u5e94\u7684\u6587\u5b57\u56de\u590d\u3002<\/p>\n<pre>&lt;span style=\"font-family:Courier New;font-size:14px;\"&gt;&lt;?php \r\ndefine(\"TOKEN\",\"weixin\"); \r\n$weixinObj = new Wechat(); \r\n$weixinObj-&gt;valid(); \r\nclass Wechat{ \r\npublic function valid(){ \r\n$echoStr = $_GET['echostr']; \r\n\/\/\u5982\u679c\u662f\u7b2c\u4e00\u6b21\u63a5\u5165 \r\nif($this-&gt;checkSignature() &amp;&amp; $echoStr ){ \r\necho $echoStr; \r\nexit; \r\n}else{ \r\n$this-&gt;responseMsg(); \r\n} \r\n} \r\n\/\/\u6821\u9a8c\u65b9\u6cd5 \r\nprivate function checkSignature(){ \r\n$signature = $_GET['signature']; \r\n$timestamp = $_GET['timestamp']; \r\n$nonce = $_GET['nonce']; \r\n$token = TOKEN; \r\n$tmpArr = array($token, $timestamp, $nonce); \r\nsort($tmpArr); \r\n$tmpStr = implode($tmpArr); \r\n$tmpStr = sha1($tmpStr); \r\nif($tmpStr == $signature){ \r\nreturn true; \r\n}else{ \r\nreturn false; \r\n} \r\n} \r\n\/* \u666e\u901a\u6587\u672c\u6d88\u606f \r\n&lt;xml&gt; \r\n&lt;ToUserName&gt;&lt;![CDATA[toUser]]&gt;&lt;\/ToUserName&gt; \r\n&lt;FromUserName&gt;&lt;![CDATA[fromUser]]&gt;&lt;\/FromUserName&gt; \r\n&lt;CreateTime&gt;1348831860&lt;\/CreateTime&gt; \r\n&lt;MsgType&gt;&lt;![CDATA[text]]&gt;&lt;\/MsgType&gt; \r\n&lt;Content&gt;&lt;![CDATA[this is a test]]&gt;&lt;\/Content&gt; \r\n&lt;\/xml&gt; \r\n*\/ \r\npublic function responseMsg(){ \r\n\/\/\u83b7\u53d6\u5fae\u4fe1\u670d\u52a1\u5668POST\u8bf7\u6c42\u4e2d\u7684\u6570\u636e \r\n$postStr = $GLOBALS[\"HTTP_RAW_POST_DATA\"]; \r\nif( !empty($postStr) ){ \r\n$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); \r\n$fromUser = $postObj-&gt;FromUserName; \r\n$toUser = $postObj-&gt;ToUserName; \r\n$keyword = trim($postObj-&gt;Content); \r\n$time = time(); \r\n$template = \"&lt;xml&gt; \r\n&lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;\/ToUserName&gt; \r\n&lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;\/FromUserName&gt; \r\n&lt;CreateTime&gt;%s&lt;\/CreateTime&gt; \r\n&lt;MsgType&gt;&lt;![CDATA[%s]]&gt;&lt;\/MsgType&gt; \r\n&lt;Content&gt;&lt;![CDATA[%s]]&gt;&lt;\/Content&gt; \r\n&lt;\/xml&gt;\"; \r\nif( strtolower($postObj-&gt;MsgType)!='text' ){ \r\n$msgType = \"text\"; \r\n$content = \"\u6211\u53ea\u63a5\u53d7\u6587\u672c\u6d88\u606f\"; \r\n}else{ \r\n$msgType = \"text\"; \r\nif( !empty($keyword) ){ \r\n$content = \"\u60a8\u53d1\u9001\u7684\u6d88\u606f\u662f\uff1a\".$postObj-&gt;Content; \r\n}else{ \r\n$content = \"\u8bf7\u8f93\u5165\u5173\u952e\u5b57\";\/\/\u6d88\u606f\u4e3a\u7a7a \r\n} \r\n} \r\n$info = sprintf($template, $fromUser, $toUser, $time, $msgType, $content); \r\necho $info; \r\n}else{ \r\necho \"\"; \r\nexit; \r\n} \r\n} \r\n}&lt;\/span&gt;<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u529f\u80fd\uff1a\u516c\u4f17\u53f7\u53ea\u63a5\u53d7\u56fe\u7247\u6d88\u606f\uff0c\u4e14\u505a\u51fa\u76f8\u5e94\u7684\u6587\u5b57\u56de\u590d\u3002<\/p>\n<pre>&lt;span style=\"font-family:Courier New;font-size:14px;\"&gt;&lt;?php \r\ndefine(\"TOKEN\",\"weixin\"); \r\n$weixinObj = new Wechat(); \r\n$weixinObj-&gt;valid(); \r\nclass Wechat{ \r\npublic function valid(){ \r\n$echoStr = $_GET['echostr']; \r\n\/\/\u5982\u679c\u662f\u7b2c\u4e00\u6b21\u63a5\u5165 \r\nif($this-&gt;checkSignature() &amp;&amp; $echoStr ){ \r\necho $echoStr; \r\nexit; \r\n}else{ \r\n$this-&gt;responseMsg(); \r\n} \r\n} \r\n\/\/\u6821\u9a8c\u65b9\u6cd5 \r\nprivate function checkSignature(){ \r\n$signature = $_GET['signature']; \r\n$timestamp = $_GET['timestamp']; \r\n$nonce = $_GET['nonce']; \r\n$token = TOKEN; \r\n$tmpArr = array($token, $timestamp, $nonce); \r\nsort($tmpArr); \r\n$tmpStr = implode($tmpArr); \r\n$tmpStr = sha1($tmpStr); \r\nif($tmpStr == $signature){ \r\nreturn true; \r\n}else{ \r\nreturn false; \r\n} \r\n} \r\n\/* \u63a5\u6536\u56fe\u7247\u6d88\u606f\u683c\u5f0f \r\n&lt;xml&gt; \r\n&lt;ToUserName&gt;&lt;![CDATA[toUser]]&gt;&lt;\/ToUserName&gt; \r\n&lt;FromUserName&gt;&lt;![CDATA[fromUser]]&gt;&lt;\/FromUserName&gt; \r\n&lt;CreateTime&gt;1348831860&lt;\/CreateTime&gt; \r\n&lt;MsgType&gt;&lt;![CDATA[image]]&gt;&lt;\/MsgType&gt; \r\n&lt;PicUrl&gt;&lt;![CDATA[this is a url]]&gt;&lt;\/PicUrl&gt; \r\n&lt;MediaId&gt;&lt;![CDATA[media_id]]&gt;&lt;\/MediaId&gt; \r\n&lt;MsgId&gt;1234567890123456&lt;\/MsgId&gt; \r\n&lt;\/xml&gt; \r\n*\/ \r\npublic function responseMsg(){ \r\n\/\/\u83b7\u53d6\u5fae\u4fe1\u670d\u52a1\u5668POST\u8bf7\u6c42\u4e2d\u7684\u6570\u636e \r\n$postStr = $GLOBALS[\"HTTP_RAW_POST_DATA\"]; \r\nif( !empty($postStr) ){ \r\n$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); \r\n$fromUser = $postObj-&gt;FromUserName; \r\n$toUser = $postObj-&gt;ToUserName; \r\n$time = time(); \r\n$msgType= $postObj-&gt;MsgType; \r\n$picUrl = $postObj-&gt;PicUrl; \r\n$mediaId = $postObj-&gt;MediaId; \r\n$template = \"&lt;xml&gt; \r\n&lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;\/ToUserName&gt; \r\n&lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;\/FromUserName&gt; \r\n&lt;CreateTime&gt;%s&lt;\/CreateTime&gt; \r\n&lt;MsgType&gt;&lt;![CDATA[%s]]&gt;&lt;\/MsgType&gt; \r\n&lt;Content&gt;&lt;![CDATA[%s]]&gt;&lt;\/Content&gt; \r\n&lt;\/xml&gt;\"; \r\nif( strtolower($msgType)!='image' ){ \r\n$msgType = \"text\"; \r\n$content = \"\u6211\u53ea\u63a5\u53d7\u56fe\u7247\u6d88\u606f\"; \r\n}else{ \r\n$msgType = \"text\"; \r\nif( !empty( $picUrl ) ){ \r\n$content = \"\u56fe\u7247\u94fe\u63a5\u4e3a:\".$picUrl.\"\n\"; \r\n$content .= \"\u5a92\u4f53id:\".$mediaId; \r\n}else{ \r\n$content = \"\u8bf7\u53d1\u9001\u56fe\u7247\";\/\/\u6d88\u606f\u4e3a\u7a7a \r\n} \r\n} \r\n$info = sprintf($template, $fromUser, $toUser, $time, $msgType, $content); \r\necho $info; \r\n}else{ \r\necho \"\"; \r\nexit; \r\n} \r\n} \r\n}&lt;\/span&gt;<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u4ee5\u4e0a\u662f\u5c0f\u7f16\u7ed9\u5927\u5bb6\u5206\u4eab\u7684\u5fae\u4fe1\u6d88\u606f\u81ea\u52a8\u56de\u590d\u4e0b\u6240\u9047\u5230\u7684\u5751\u7684\u76f8\u5173\u77e5\u8bc6\uff0c\u5e0c\u671b\u5bf9\u5927\u5bb6\u6709\u6240\u5e2e\u52a9\uff01<\/p>\n<p>\u4ee5\u4e0a\u5c31\u662fPHP\u5fae\u4fe1\u5f00\u53d1\u4e4b\u5fae\u4fe1\u6d88\u606f\u81ea\u52a8\u56de\u590d\u9047\u5230\u7684\u95ee\u9898\u7684\u8be6\u7ec6\u5185\u5bb9\uff0c\u66f4\u591a\u8bf7\u5173\u6ce8\u7c73\u4e91\u5176\u5b83\u76f8\u5173\u6587\u7ae0\uff01<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8fd9\u7bc7\u6587\u7ae0\u662f\u5c0f\u7f16\u7ed9\u5927\u5bb6\u4ecb\u7ecd\u7684\u5fae\u4fe1\u6d88\u606f\u81ea\u52a8\u56de\u590d\u4e0b\u6240\u9047\u5230\u7684\u5751\u7684\u76f8\u5173\u5185\u5bb9\uff0c\u5728\u65e5\u5e38\u9879\u76ee\u5f00\u53d1\u4e2d\u7ecf\u5e38\u9047\u5230\uff0c\u975e\u5e38\u5177\u6709\u53c2\u8003\u501f\u9274\u4ef7\u503c\uff0c\u611f\u5174\u8da3\u7684\u5c0f\u4f19\u4f34\u4e00\u8d77\u5b66\u4e60\u5427 \u5fae\u4fe1\u56de\u590d\u539f\u7406\uff1a \u5f53\u666e\u901a\u5fae\u4fe1\u7528\u6237\u5411\u516c\u4f17\u8d26\u53f7\u65f6\uff0c\u5fae\u4fe1\u670d\u52a1\u5668\u9996\u5148\u6536\u5230\u7528\u6237\u53d1\u9001\u7684\u6d88\u606f\uff1b \u7136\u540e\u5c06\u7528\u6237\u4fe1\u606f\u548c\u6d88\u606f\u6253\u5305\u6210\u683c\u5f0f\u7684\u6570\u636e\u5305\uff0c\u518d\u5c06\u8fd9\u4e2aXML\u6570\u636e\u5305\u901a\u8fc7POST\u65b9\u6cd5\u63d0\u4ea4\u5230\u5f00\u53d1\u8005\u8bbe\u7f6e\u7684URL\u4e0a\u3002 \u7591\u95ee\u4e00\uff1a\u4e3a\u4f55\u4f7f\u7528$GLOBALS[&#8220;HTTP_RAW_POST_DATA&#8221;]\u4fdd\u5b58POST\u8fc7\u6765\u7684\u6570\u636e\uff0c\u800c\u975e$_POST\uff1f \u7acb\u5373\u5b66\u4e60\u201c\u201d\uff1b \u56de\u7b54\uff1a POST\u53ea\u80fd\u4fdd\u5b58\u6807\u51c6\u7684\uff0c\u5bf9\u4e8eXML\u3001\u6216Application\/Octet-steam\u4e4b\u7c7b\u7684\u5185\u5bb9\u5219\u65e0\u6cd5\u89e3\u6790\u3002 \u800c$GLOBALS[&#8220;HTTP_RAW_POST_DATA&#8221;]\u548c$_POST\u662f\u4e00\u6837\u7684,\u5982\u679cPOST\u8fc7\u6765\u7684\u6570\u636ePHP\u80fd\u591f\u8bc6\u522b\uff0c\u5219\u53ef\u4ee5\u7528$GLOBALS[&#8220;HTTP_RAW_POST_DATA&#8221;]\u6765\u63a5\u6536\u3002 \u7591\u95ee\u4e8c\uff1a_load_()\u5404\u53c2\u6570\u548c\u8fd4\u56de\u503c\u662f\u4ec0\u4e48\uff1f \u56de\u7b54\uff1a \u53c2\u6570\u542b\u4e49 :\u9700\u8981\u5904\u7406\u7684XML\u3002 :\u7528\u6765\u6307\u5b9a\u65b0\uff0c\u901a\u5e38\u8bbe\u7f6e\u4e3a&#8221;SimpleXMLElement&#8221;,\u751f\u6210\u4e00\u4e2a\u7b80\u5355XML\u5143\u7d20\u7684\u7c7b\u3002 options:\u6307\u5b9a\u9644\u52a0\u7684Libxml\u53c2\u6570\uff0c\u901a\u5e38\u8bbe\u7f6e\u4e3aLIBXML_NOCDATA,\u8868\u793a\u628aCDATA\u8bbe\u7f6e\u4e3a\u6587\u672c\u8282\u70b9\u3002 ns:\u4e00\u822c\u7701\u7565 is_prefix:\u4e00\u822c\u7701\u7565 \u6267\u884c\u5b8c\u6210\u540e\u8fd4\u56deSimpleXMLElement\u7c7b\u7684\u4e00\u4e2a\u5bf9\u8c61\u3002 \u529f\u80fd\uff1a\u516c\u4f17\u53f7\u53ea\u63a5\u53d7\u6587\u5b57\u6d88\u606f\uff0c\u4e14\u505a\u51fa\u76f8\u5e94\u7684\u6587\u5b57\u56de\u590d\u3002 &lt;span style=&#8221;font-family:Courier New;font-size:14px;&#8221;&gt;&lt;?php define(&#8220;TOKEN&#8221;,&#8221;weixin&#8221;); $weixinObj = new Wechat(); $weixinObj-&gt;valid(); class Wechat{ public function valid(){ $echoStr = $_GET[&#8216;echostr&#8217;]; \/\/\u5982\u679c\u662f\u7b2c\u4e00\u6b21\u63a5\u5165 if($this-&gt;checkSignature() &amp;&amp; $echoStr ){ echo $echoStr; exit; }else{ $this-&gt;responseMsg(); } } \/\/\u6821\u9a8c\u65b9\u6cd5 private function checkSignature(){ $signature = $_GET[&#8216;signature&#8217;]; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19],"tags":[],"class_list":["post-29239","post","type-post","status-publish","format-standard","hentry","category-19"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29239","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/comments?post=29239"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29239\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=29239"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=29239"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=29239"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}