{"id":29791,"date":"2024-11-25T11:02:05","date_gmt":"2024-11-25T03:02:05","guid":{"rendered":"https:\/\/fwq.ai\/blog\/29791\/"},"modified":"2024-11-25T11:02:05","modified_gmt":"2024-11-25T03:02:05","slug":"c%e5%bc%80%e5%8f%91%e5%be%ae%e4%bf%a1%e5%85%ac%e4%bc%97%e5%8f%b7%e4%b8%8e%e8%ae%a2%e9%98%85%e5%8f%b7%e6%8e%a5%e5%8f%a3%e7%9a%84%e5%ae%9e%e4%be%8b%e8%af%a6%e8%a7%a3","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/29791\/","title":{"rendered":"C#\u5f00\u53d1\u5fae\u4fe1\u516c\u4f17\u53f7\u4e0e\u8ba2\u9605\u53f7\u63a5\u53e3\u7684\u5b9e\u4f8b\u8be6\u89e3"},"content":{"rendered":"<p>\u672c\u6587\u5b9e\u4f8b\u8bb2\u8ff0\u4e86\u5fae\u4fe1\u516c\u4f17\u53f7\u4e0e\u8ba2\u9605\u53f7\u63a5\u53e3\u5f00\u53d1\u793a\u4f8b\u4ee3\u7801\u3002\u5206\u4eab\u7ed9\u5927\u5bb6\u4f9b\u5927\u5bb6\u53c2\u8003\uff0c\u5177\u4f53\u5982\u4e0b\uff1a<\/p>\n<pre>using&nbsp;System;\r\nusing&nbsp;System.Web;\r\nusing&nbsp;System.IO;\r\nusing&nbsp;System.Text;\r\nusing&nbsp;System.Web.Security;\r\nusing&nbsp;weixin_api;\r\npublic&nbsp;class&nbsp;wxgz_api&nbsp;:&nbsp;IHttpHandler\r\n{\r\n&nbsp;&nbsp;public&nbsp;void&nbsp;ProcessRequest(HttpContext&nbsp;context)\r\n&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;context.Response.ContentType&nbsp;=&nbsp;\"text\/plain\";\r\n&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;postString&nbsp;=&nbsp;string.Empty;\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(HttpContext.Current.Request.HttpMethod.ToUpper()&nbsp;==&nbsp;\"POST\")\r\n&nbsp;&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u5fae\u4fe1\u670d\u52a1\u5668\u5bf9\u63a5\u53e3\u6d88\u606f\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;(Stream&nbsp;stream&nbsp;=&nbsp;HttpContext.Current.Request.InputStream)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Byte[]&nbsp;postBytes&nbsp;=&nbsp;new&nbsp;Byte[stream.Length];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stream.Read(postBytes,&nbsp;0,&nbsp;(Int32)stream.Length);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;postString&nbsp;=&nbsp;Encoding.UTF8.GetString(postBytes);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Handle(postString);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;else\r\n&nbsp;&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u5fae\u4fe1\u8fdb\u884c\u7684Get\u6d4b\u8bd5(\u5f00\u53d1\u8005\u8ba4\u8bc1)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WxAuth();\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;}\r\n&nbsp;&nbsp;\/\/\/&nbsp;&lt;summary&gt;\r\n&nbsp;&nbsp;\/\/\/&nbsp;\u5904\u7406\u4fe1\u606f\u5e76\u5e94\u7b54\r\n&nbsp;&nbsp;\/\/\/&nbsp;&lt;\/summary&gt;\r\n&nbsp;&nbsp;private&nbsp;void&nbsp;Handle(string&nbsp;postStr)\r\n&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;messageHelp&nbsp;help&nbsp;=&nbsp;new&nbsp;messageHelp();\r\n&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;responseContent&nbsp;=&nbsp;help.ReturnMessage(postStr);\r\n&nbsp;&nbsp;&nbsp;&nbsp;HttpContext.Current.Response.ContentEncoding&nbsp;=&nbsp;Encoding.UTF8;\r\n&nbsp;&nbsp;&nbsp;&nbsp;HttpContext.Current.Response.Write(responseContent);\r\n&nbsp;&nbsp;}\r\n&nbsp;&nbsp;#region&nbsp;\u5fae\u4fe1\u9a8c\u8bc1\r\n&nbsp;&nbsp;public&nbsp;void&nbsp;WxAuth()\r\n&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;token&nbsp;=&nbsp;\"xxxxxxxx\";\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(string.IsNullOrEmpty(token))\r\n&nbsp;&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;echoString&nbsp;=&nbsp;HttpContext.Current.Request.QueryString[\"echostr\"];\r\n&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;signature&nbsp;=&nbsp;HttpContext.Current.Request.QueryString[\"signature\"];\r\n&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;timestamp&nbsp;=&nbsp;HttpContext.Current.Request.QueryString[\"timestamp\"];\r\n&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;nonce&nbsp;=&nbsp;HttpContext.Current.Request.QueryString[\"nonce\"];\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(CheckSignature(token,&nbsp;signature,&nbsp;timestamp,&nbsp;nonce))\r\n&nbsp;&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!string.IsNullOrEmpty(echoString))\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpContext.Current.Response.Write(echoString);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpContext.Current.Response.End();\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;}\r\n&nbsp;&nbsp;\/\/\/&nbsp;&lt;summary&gt;\r\n&nbsp;&nbsp;\/\/\/&nbsp;\u9a8c\u8bc1\u5fae\u4fe1\u7b7e\u540d\r\n&nbsp;&nbsp;\/\/\/&nbsp;&lt;\/summary&gt;\r\n&nbsp;&nbsp;public&nbsp;bool&nbsp;CheckSignature(string&nbsp;token,&nbsp;string&nbsp;signature,&nbsp;string&nbsp;timestamp,&nbsp;string&nbsp;nonce)\r\n&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;string[]&nbsp;ArrTmp&nbsp;=&nbsp;{&nbsp;token,&nbsp;timestamp,&nbsp;nonce&nbsp;};\r\n&nbsp;&nbsp;&nbsp;&nbsp;Array.Sort(ArrTmp);\r\n&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;tmpStr&nbsp;=&nbsp;string.Join(\"\",&nbsp;ArrTmp);\r\n&nbsp;&nbsp;&nbsp;&nbsp;tmpStr&nbsp;=&nbsp;FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr,&nbsp;\"SHA1\");\r\n&nbsp;&nbsp;&nbsp;&nbsp;tmpStr&nbsp;=&nbsp;tmpStr.ToLower();\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(tmpStr&nbsp;==&nbsp;signature)\r\n&nbsp;&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;else\r\n&nbsp;&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;}\r\n&nbsp;&nbsp;#endregion\r\n&nbsp;&nbsp;public&nbsp;bool&nbsp;IsReusable\r\n&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;get\r\n&nbsp;&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;}\r\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u4ee5\u4e0a\u5c31\u662fC#\u5f00\u53d1\u5fae\u4fe1\u516c\u4f17\u53f7\u4e0e\u8ba2\u9605\u53f7\u63a5\u53e3\u7684\u5b9e\u4f8b\u8be6\u89e3\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>\u672c\u6587\u5b9e\u4f8b\u8bb2\u8ff0\u4e86\u5fae\u4fe1\u516c\u4f17\u53f7\u4e0e\u8ba2\u9605\u53f7\u63a5\u53e3\u5f00\u53d1\u793a\u4f8b\u4ee3\u7801\u3002\u5206\u4eab\u7ed9\u5927\u5bb6\u4f9b\u5927\u5bb6\u53c2\u8003\uff0c\u5177\u4f53\u5982\u4e0b\uff1a using&nbsp;System; using&nbsp;System.Web; using&nbsp;System.IO; using&nbsp;System.Text; using&nbsp;System.Web.Security; using&nbsp;weixin_api; public&nbsp;class&nbsp;wxgz_api&nbsp;:&nbsp;IHttpHandler { &nbsp;&nbsp;public&nbsp;void&nbsp;ProcessRequest(HttpContext&nbsp;context) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;context.Response.ContentType&nbsp;=&nbsp;&#8220;text\/plain&#8221;; &nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;postString&nbsp;=&nbsp;string.Empty; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(HttpContext.Current.Request.HttpMethod.ToUpper()&nbsp;==&nbsp;&#8220;POST&#8221;) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u5fae\u4fe1\u670d\u52a1\u5668\u5bf9\u63a5\u53e3\u6d88\u606f &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;(Stream&nbsp;stream&nbsp;=&nbsp;HttpContext.Current.Request.InputStream) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Byte[]&nbsp;postBytes&nbsp;=&nbsp;new&nbsp;Byte[stream.Length]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stream.Read(postBytes,&nbsp;0,&nbsp;(Int32)stream.Length); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;postString&nbsp;=&nbsp;Encoding.UTF8.GetString(postBytes); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Handle(postString); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u5fae\u4fe1\u8fdb\u884c\u7684Get\u6d4b\u8bd5(\u5f00\u53d1\u8005\u8ba4\u8bc1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WxAuth(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;\/\/\/&nbsp;&lt;summary&gt; &nbsp;&nbsp;\/\/\/&nbsp;\u5904\u7406\u4fe1\u606f\u5e76\u5e94\u7b54 &nbsp;&nbsp;\/\/\/&nbsp;&lt;\/summary&gt; &nbsp;&nbsp;private&nbsp;void&nbsp;Handle(string&nbsp;postStr) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;messageHelp&nbsp;help&nbsp;=&nbsp;new&nbsp;messageHelp(); &nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;responseContent&nbsp;=&nbsp;help.ReturnMessage(postStr); &nbsp;&nbsp;&nbsp;&nbsp;HttpContext.Current.Response.ContentEncoding&nbsp;=&nbsp;Encoding.UTF8; &nbsp;&nbsp;&nbsp;&nbsp;HttpContext.Current.Response.Write(responseContent); &nbsp;&nbsp;} &nbsp;&nbsp;#region&nbsp;\u5fae\u4fe1\u9a8c\u8bc1 &nbsp;&nbsp;public&nbsp;void&nbsp;WxAuth() &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;token&nbsp;=&nbsp;&#8220;xxxxxxxx&#8221;; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(string.IsNullOrEmpty(token)) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;echoString&nbsp;=&nbsp;HttpContext.Current.Request.QueryString[&#8220;echostr&#8221;]; &nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;signature&nbsp;=&nbsp;HttpContext.Current.Request.QueryString[&#8220;signature&#8221;]; &nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;timestamp&nbsp;=&nbsp;HttpContext.Current.Request.QueryString[&#8220;timestamp&#8221;]; &nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;nonce&nbsp;=&nbsp;HttpContext.Current.Request.QueryString[&#8220;nonce&#8221;]; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(CheckSignature(token,&nbsp;signature,&nbsp;timestamp,&nbsp;nonce)) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!string.IsNullOrEmpty(echoString)) [&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-29791","post","type-post","status-publish","format-standard","hentry","category-19"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29791","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=29791"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29791\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=29791"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=29791"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=29791"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}