{"id":29825,"date":"2024-11-25T10:10:21","date_gmt":"2024-11-25T02:10:21","guid":{"rendered":"https:\/\/fwq.ai\/blog\/29825\/"},"modified":"2024-11-25T10:10:21","modified_gmt":"2024-11-25T02:10:21","slug":"asp-net-mvc-%e5%be%ae%e4%bf%a1js-sdk%e8%ae%a4%e8%af%81%e7%9a%84%e5%ae%9e%e4%be%8b%e6%95%99%e7%a8%8b","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/29825\/","title":{"rendered":"ASP.NET MVC \u5fae\u4fe1JS-SDK\u8ba4\u8bc1\u7684\u5b9e\u4f8b\u6559\u7a0b"},"content":{"rendered":"<p>asp.net mvcjs-sdk\u8ba4\u8bc1\uff0c\u5177\u4f53\u5185\u5bb9\uff1a<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/article\/000\/001\/505\/f4911f324dc20b5fb5a9c6dfc72e17ab-0.jpg\" class=\"aligncenter\" title=\"ASP.NET MVC \u5fae\u4fe1JS-SDK\u8ba4\u8bc1\u7684\u5b9e\u4f8b\u6559\u7a0b\u63d2\u56fe\" alt=\"ASP.NET MVC \u5fae\u4fe1JS-SDK\u8ba4\u8bc1\u7684\u5b9e\u4f8b\u6559\u7a0b\u63d2\u56fe\" \/><\/p>\n<p><strong>\u5199\u5728\u524d\u9762<\/strong><\/p>\n<p>\u524d\u9635\u5b50\u56e0\u4e3a\u6709\u4e2a\u9879\u76ee\u9700\u8981\u505a\u5fae\u4fe1\u81ea\u5b9a\u4e49\u5206\u4eab\u529f\u80fd\uff0c\u56e0\u800c\u53bb\u7814\u7a76\u4e86\u4e0b\u5fae\u4fe1JS-SDK\u76f8\u5173\u77e5\u8bc6\u3002<\/p>\n<p>\u6b64\u6587\u505a\u4e2a\u7b80\u5355\u7684\u8bb0(tu)\u5f55(cao)&#8230;<\/p>\n<p><strong>\u5f00\u59cb<br \/><\/strong>\u6240\u6709\u7684\u4e1c\u897f\u90fd\u4ece\u6587\u6863\u5f00\u59cb:\u5fae\u4fe1JSSDK\u8bf4\u660e\u6587\u6863<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/article\/000\/001\/505\/f4911f324dc20b5fb5a9c6dfc72e17ab-1.jpg\" class=\"aligncenter\" title=\"ASP.NET MVC \u5fae\u4fe1JS-SDK\u8ba4\u8bc1\u7684\u5b9e\u4f8b\u6559\u7a0b\u63d2\u56fe1\" alt=\"ASP.NET MVC \u5fae\u4fe1JS-SDK\u8ba4\u8bc1\u7684\u5b9e\u4f8b\u6559\u7a0b\u63d2\u56fe1\" \/><\/p>\n<p>\u9879\u76ee\u9700\u8981\u7528\u5230\u7684\u662f\u5206\u4eab\u63a5\u53e3 \u4e0d\u8fc7\u4f7f\u7528\u5fae\u4fe1JS-SDK\u4e4b\u524d\uff0c\u9700\u8981\u505aJS\u63a5\u53e3\u8ba4\u8bc1\u3002<\/p>\n<p><strong>\u8ba4\u8bc1\u5982\u4e0b\uff1a<\/strong><\/p>\n<p>\u6b65\u9aa4\u4e00\uff1a\u7ed1\u5b9a\u57df\u540d<\/p>\n<p>\u6b65\u9aa4\u4e8c\uff1a\u5f15\u5165JS\u6587\u4ef6<\/p>\n<p>\u6b65\u9aa4\u4e09\uff1a\u901a\u8fc7config\u63a5\u53e3\u6ce8\u5165\u6743\u9650\u9a8c\u8bc1\u914d\u7f6e<\/p>\n<p>\u6b65\u9aa4\u56db\uff1a\u901a\u8fc7ready\u63a5\u53e3\u5904\u7406\u6210\u529f\u9a8c\u8bc1<\/p>\n<p>\u6b65\u9aa4\u4e94\uff1a\u901a\u8fc7error\u63a5\u53e3\u5904\u7406\u5931\u8d25\u9a8c\u8bc1<\/p>\n<p><strong>\u5177\u4f53\u89e3\u91ca\uff1a<\/strong><\/p>\n<p>\u6b65\u9aa4\u4e00\u4e2d\u5141\u8bb8\u4f7f\u7528\u57df\u540d\/\u5b50\u57df\u540d\uff0c\u53ea\u8981xx.com\/xxx.txt\u6216\u8005xx.com\/mp\/xxx.txt\u80fd\u8bbf\u95ee\u5c31\u597d\u3002\u57df\u540d\u8ba4\u8bc1\u901a\u8fc7\u4e4b\u540e\uff0c\u6b64\u57df\u540d\u4e0b\u7684\u6240\u6709\u7aef\u53e3\u7684\u7f51\u7ad9\u90fd\u53ef\u4ee5\u4f7f\u7528JS-SDK\u3002<\/p>\n<p>\u6b65\u9aa4\u4e8c\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u7565\u8fc7\u3002<\/p>\n<p>\u6b65\u9aa4\u4e09\u6700\u78e8\u4eba\uff0c\u4e0b\u9762\u5355\u72ec\u8bb2\u89e3\u3002<\/p>\n<p><strong><span style=\"color: #800000\">config\u63a5\u53e3\u6ce8\u5165\u6743\u9650\u9a8c\u8bc1\u914d\u7f6e<\/span><\/strong><\/p>\n<p>\u5148\u6765\u4e00\u6bb5\u8bf4\u660e\uff1a<\/p>\n<p>\u6240\u6709\u9700\u8981\u4f7f\u7528JS-SDK\u7684\u9875\u9762\u5fc5\u987b\u5148\u6ce8\u5165\u914d\u7f6e\u4fe1\u606f\uff0c\u5426\u5219\u5c06\u65e0\u6cd5\u8c03\u7528\uff08\u540c\u4e00\u4e2aurl\u4ec5\u9700\u8c03\u7528\u4e00\u6b21\uff0c\u5bf9\u4e8e\u53d8\u5316url\u7684SPA\u7684web app\u53ef\u5728\u6bcf\u6b21url\u53d8\u5316\u65f6\u8fdb\u884c\u8c03\u7528\uff0c\u76ee\u524dAndroid\u5fae\u4fe1\u5ba2\u6237\u7aef\u4e0d\u652f\u6301pushState\u7684H5\u65b0\u7279\u6027\uff0c\u6240\u4ee5\u4f7f\u7528pushState\u6765\u5b9e\u73b0web app\u7684\u9875\u9762\u4f1a\u5bfc\u81f4\u7b7e\u540d\u5931\u8d25\uff0c\u6b64\u95ee\u9898\u4f1a\u5728Android6.2\u4e2d\u4fee\u590d\uff09\u3002<\/p>\n<pre>wx.config({\r\n&nbsp;debug:&nbsp;true,&nbsp;\/\/&nbsp;\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f,\u8c03\u7528\u7684\u6240\u6709api\u7684\u8fd4\u56de\u503c\u4f1a\u5728\u5ba2\u6237\u7aefalert\u51fa\u6765\uff0c\r\n&nbsp;\/\/\u82e5\u8981\u67e5\u770b\u4f20\u5165\u7684\u53c2\u6570\uff0c\u53ef\u4ee5\u5728pc\u7aef\u6253\u5f00\uff0c\u53c2\u6570\u4fe1\u606f\u4f1a\u901a\u8fc7log\u6253\u51fa\uff0c\u4ec5\u5728pc\u7aef\u65f6\u624d\u4f1a\u6253\u5370\u3002\r\n&nbsp;appId:&nbsp;'',&nbsp;\/\/&nbsp;\u5fc5\u586b\uff0c\u516c\u4f17\u53f7\u7684\u552f\u4e00\u6807\u8bc6\r\n&nbsp;timestamp:&nbsp;,&nbsp;\/\/&nbsp;\u5fc5\u586b\uff0c\u751f\u6210\u7b7e\u540d\u7684\u65f6\u95f4\u6233\r\n&nbsp;nonceStr:&nbsp;'',&nbsp;\/\/&nbsp;\u5fc5\u586b\uff0c\u751f\u6210\u7b7e\u540d\u7684\u968f\u673a\u4e32\r\n&nbsp;signature:&nbsp;'',\/\/&nbsp;\u5fc5\u586b\uff0c\u7b7e\u540d\uff0c\u89c1\u9644\u5f551\r\n&nbsp;jsApiList:&nbsp;[]&nbsp;\/\/&nbsp;\u5fc5\u586b\uff0c\u9700\u8981\u4f7f\u7528\u7684JS\u63a5\u53e3\u5217\u8868\uff0c\u6240\u6709JS\u63a5\u53e3\u5217\u8868\u89c1\u9644\u5f552\r\n});<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u770b\u5230\u8fd9\u91cc\u80af\u5b9a\u61f5\u903c\u4e86\uff0c\u8fd9\u662f\u90fd\u4ec0\u4e48\u9b3c&#8230;\u600e\u4e48\u73a9\u554a\u3002<\/p>\n<p>\u63d0\u793a\u6211\u4eec\u53bb\u770b\u9644\u5f551&#8230;\u770b\u5b8c\u4e4b\u540e\u603b\u7ed3\u5982\u4e0b\uff1a<\/p>\n<p>1.\u4f7f\u7528config\u63a5\u53e3\u6ce8\u5165\u6743\u9650\u9a8c\u8bc1\u914d\u7f6e\uff0c\u91cd\u70b9\u662f\u751f\u6210\u5408\u6cd5\u7684signatrue<br \/>2.\u751f\u6210signature\u9700\u8981\u901a\u8fc7appid\u548csecret\u83b7\u53d6token<br \/>3.\u65f6\u95f4\u6233\u548c\u8c03\u7528\u63a5\u53e3URL\u5fc5\u4e0d\u53ef\u5c11<br \/>4.\u6b64\u64cd\u4f5c\u9700\u8981\u670d\u52a1\u7aef\u5b8c\u6210\uff0c\u4e0d\u80fd\u4f7f\u7528\u5ba2\u6237\u7aef\u5b9e\u73b0<\/p>\n<p>\u6574\u4e2a\u8fc7\u7a0b\u53d8\u6210\uff1a<\/p>\n<p>1.\u901a\u8fc7appid\u548csecret\u83b7\u53d6access_token\uff0c\u63a5\u7740\u4f7f\u7528token\u83b7\u53d6jsapi_ticket\uff1b<\/p>\n<p>2.\u62ff\u5230jsapi_ticket\u4e4b\u540e\uff0c\u628ajsapi_ticket\u3001\u65f6\u95f4\u6233\u3001\u968f\u673a\u5b57\u7b26\u4e32\u3001\u63a5\u53e3\u8c03\u7528\u9875\u9762URL \u62fc\u63a5\u6210\u5b8c\u6574\u5b57\u7b26\u4e32\uff0c\u4f7f\u7528sha1\u7b97\u6cd5\u52a0\u5bc6\u5f97\u5230signature\u3002<\/p>\n<p>3.\u6700\u540e\u8fd4\u56de\u81f3\u9875\u9762\uff0c\u5728wx.config\u91cc\u9762\u586b\u5165appid\uff0c\u4e0a\u4e00\u6b65\u7684\u65f6\u95f4\u6233timestamp\uff0c\u4e0a\u4e00\u90e8\u7684\u968f\u673a\u5b57\u7b26\u4e32\u3001sha1\u62ff\u5230\u7684signature\uff0c\u60f3\u8981\u4f7f\u7528\u7684JS\u63a5\u53e3\u3002<\/p>\n<p>\u5e9f\u8bdd\u5c11\u8bf4\uff0c\u76f4\u63a5\u4e0a\u4ee3\u7801\u5427\u3002<\/p>\n<p><span style=\"color: #800000\"><strong>\u4ee3\u7801\u65f6\u95f4<\/strong><\/span><\/p>\n<pre>&nbsp;public&nbsp;class&nbsp;WeiXinController&nbsp;:&nbsp;Controller\r\n&nbsp;{\r\n&nbsp;public&nbsp;static&nbsp;readonly&nbsp;string&nbsp;appid&nbsp;=\r\n&nbsp;System.Web.Configuration.WebConfigurationManager.AppSettings[\"wxappid\"];\r\n\r\n&nbsp;public&nbsp;static&nbsp;readonly&nbsp;string&nbsp;secret&nbsp;=\r\n&nbsp;System.Web.Configuration.WebConfigurationManager.AppSettings[\"wxsecret\"];\r\n\r\n&nbsp;public&nbsp;static&nbsp;readonly&nbsp;bool&nbsp;isDedug&nbsp;=\r\n&nbsp;System.Web.Configuration.WebConfigurationManager.AppSettings[\"IsDebug\"]&nbsp;==\"true\";\r\n\r\n\r\n&nbsp;public&nbsp;static&nbsp;string&nbsp;_ticket&nbsp;=&nbsp;\"\";\r\n&nbsp;public&nbsp;static&nbsp;DateTime&nbsp;_lastTimestamp;\r\n\r\n&nbsp;public&nbsp;ActionResult&nbsp;Info(string&nbsp;url,string&nbsp;noncestr)\r\n&nbsp;{\r\n&nbsp;&nbsp;if&nbsp;(string.IsNullOrEmpty(_ticket)&nbsp;||&nbsp;\r\n&nbsp;&nbsp;_lastTimestamp&nbsp;==&nbsp;null&nbsp;||&nbsp;(_lastTimestamp&nbsp;-&nbsp;DateTime.Now).Milliseconds&nbsp;&amp;gt;&nbsp;7200)\r\n&nbsp;&nbsp;{\r\n&nbsp;&nbsp;var&nbsp;resultString&nbsp;=&nbsp;HTTPHelper.GetHTMLByURL(\"https:\/\/api.weixin.qq.com\/cgi-bin\/token?grant_type=client_credential&amp;amp;appid=\"\r\n&nbsp;&nbsp;&nbsp;+&nbsp;appid&nbsp;+&nbsp;\"&amp;amp;secret=\"&nbsp;+&nbsp;secret);\r\n&nbsp;&nbsp;dynamic&nbsp;resultValue&nbsp;=&nbsp;JsonConvert.DeserializeObject&lt;dynamic&gt;(resultString);\r\n&nbsp;&nbsp;if&nbsp;(resultValue&nbsp;==&nbsp;null&nbsp;||&nbsp;resultValue.access_token&nbsp;==&nbsp;null&nbsp;\r\n&nbsp;&nbsp;||&nbsp;resultValue.access_token.Value&nbsp;==&nbsp;null)\r\n&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;return&nbsp;Json(new&nbsp;{&nbsp;issuccess&nbsp;=&nbsp;false,&nbsp;\r\n&nbsp;&nbsp;&nbsp;error&nbsp;=&nbsp;\"\u83b7\u53d6token\u5931\u8d25\"&nbsp;});\r\n&nbsp;&nbsp;}\r\n&nbsp;&nbsp;var&nbsp;token&nbsp;=&nbsp;resultValue.access_token.Value;\r\n\r\n&nbsp;&nbsp;resultString&nbsp;=&nbsp;HTTPHelper.GetHTMLByURL\r\n&nbsp;&nbsp;(\"https:\/\/api.weixin.qq.com\/cgi-bin\/ticket\/getticket?access_token=\"&nbsp;+&nbsp;\r\n&nbsp;&nbsp;token&nbsp;+&nbsp;\"&amp;amp;type=jsapi\");\r\n&nbsp;&nbsp;dynamic&nbsp;ticketValue&nbsp;=&nbsp;JsonConvert.DeserializeObject&lt;dynamic&gt;(resultString);\r\n&nbsp;&nbsp;if&nbsp;(ticketValue&nbsp;==&nbsp;null&nbsp;||&nbsp;ticketValue.errcode&nbsp;==&nbsp;null\r\n&nbsp;&nbsp;||&nbsp;ticketValue.errcode.Value&nbsp;!=&nbsp;0&nbsp;||&nbsp;ticketValue.ticket&nbsp;==&nbsp;null)\r\n&nbsp;&nbsp;&nbsp;return&nbsp;Json(new&nbsp;{&nbsp;issuccess&nbsp;=&nbsp;false,\r\n&nbsp;&nbsp;&nbsp;error&nbsp;=&nbsp;\"\u83b7\u53d6ticketValue\u5931\u8d25\"&nbsp;});\r\n&nbsp;&nbsp;_ticket&nbsp;=&nbsp;ticketValue.ticket.Value;\r\n&nbsp;&nbsp;_lastTimestamp&nbsp;=&nbsp;DateTime.Now;\r\n&nbsp;&nbsp;var&nbsp;timestamp&nbsp;=&nbsp;GetTimeStamp();\r\n&nbsp;&nbsp;var&nbsp;hexString&nbsp;=&nbsp;string.Format(\"jsapi_ticket={0}&amp;amp;noncestr={3}&amp;amp;timestamp={1}&amp;amp;url={2}\",\r\n&nbsp;&nbsp;_ticket,&nbsp;timestamp,&nbsp;url,noncestr);\r\n\r\n&nbsp;&nbsp;return&nbsp;Json(new&nbsp;{\r\n&nbsp;&nbsp;&nbsp;issuccess&nbsp;=&nbsp;true,&nbsp;\r\n&nbsp;&nbsp;&nbsp;sha1value&nbsp;=&nbsp;GetSHA1Value(hexString),&nbsp;\r\n&nbsp;&nbsp;&nbsp;timestamp&nbsp;=&nbsp;timestamp,&nbsp;\r\n&nbsp;&nbsp;&nbsp;url&nbsp;=&nbsp;url,&nbsp;\r\n&nbsp;&nbsp;&nbsp;appid&nbsp;=&nbsp;appid,&nbsp;\r\n&nbsp;&nbsp;&nbsp;debug=isDedug,\r\n&nbsp;&nbsp;&nbsp;tiket=_ticket\r\n&nbsp;&nbsp;});\r\n&nbsp;&nbsp;\r\n&nbsp;&nbsp;}\r\n&nbsp;&nbsp;else\r\n&nbsp;&nbsp;{\r\n&nbsp;&nbsp;var&nbsp;timestamp&nbsp;=&nbsp;GetTimeStamp();\r\n&nbsp;&nbsp;var&nbsp;hexString&nbsp;=&nbsp;string.Format(\"jsapi_ticket={0}&amp;amp;noncestr=1234567890123456&amp;amp;timestamp={1}&amp;amp;url={2}\",\r\n&nbsp;&nbsp;&nbsp;_ticket,&nbsp;timestamp,&nbsp;url);\r\n&nbsp;&nbsp;return&nbsp;Json(new&nbsp;{&nbsp;\r\n&nbsp;&nbsp;&nbsp;issuccess&nbsp;=&nbsp;true,&nbsp;sha1value&nbsp;=&nbsp;GetSHA1Value(hexString),\r\n&nbsp;&nbsp;&nbsp;timestamp&nbsp;=&nbsp;timestamp,&nbsp;url&nbsp;=&nbsp;url,\r\n&nbsp;&nbsp;&nbsp;appid&nbsp;=&nbsp;appid,&nbsp;debug&nbsp;=&nbsp;isDedug,tiket&nbsp;=&nbsp;_ticket\r\n&nbsp;&nbsp;});\r\n&nbsp;&nbsp;}\r\n&nbsp;}\r\n\r\n\r\n&nbsp;private&nbsp;string&nbsp;GetSHA1Value(string&nbsp;sourceString)\r\n&nbsp;{\r\n&nbsp;&nbsp;var&nbsp;hash&nbsp;=&nbsp;SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(sourceString));\r\n&nbsp;&nbsp;return&nbsp;string.Join(\"\",&nbsp;\r\n&nbsp;&nbsp;hash.Select(b&nbsp;=&amp;gt;&nbsp;b.ToString(\"x2\")).ToArray());\r\n&nbsp;}\r\n\r\n&nbsp;private&nbsp;static&nbsp;string&nbsp;GetTimeStamp()\r\n&nbsp;{\r\n\r\n&nbsp;&nbsp;TimeSpan&nbsp;ts&nbsp;=&nbsp;DateTime.Now&nbsp;-&nbsp;new&nbsp;DateTime(1970,&nbsp;1,&nbsp;1,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;0);\r\n\r\n&nbsp;&nbsp;return&nbsp;Convert.ToInt64(ts.TotalSeconds).ToString();\r\n\r\n&nbsp;}\r\n\r\n&nbsp;}\r\n&nbsp;\r\n&nbsp;public&nbsp;class&nbsp;HTTPHelper\r\n&nbsp;{\r\n&nbsp;public&nbsp;static&nbsp;string&nbsp;GetHTMLByURL(string&nbsp;url)\r\n&nbsp;{\r\n&nbsp;&nbsp;string&nbsp;htmlCode&nbsp;=&nbsp;string.Empty;\r\n&nbsp;&nbsp;try\r\n&nbsp;&nbsp;{\r\n&nbsp;&nbsp;HttpWebRequest&nbsp;webRequest&nbsp;=&nbsp;(System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);\r\n&nbsp;&nbsp;webRequest.Timeout&nbsp;=&nbsp;30000;\r\n&nbsp;&nbsp;webRequest.Method&nbsp;=&nbsp;\"GET\";\r\n&nbsp;&nbsp;webRequest.UserAgent&nbsp;=&nbsp;\"Mozilla\/4.0\";\r\n&nbsp;&nbsp;webRequest.Headers.Add(\"Accept-Encoding\",&nbsp;\"gzip,&nbsp;deflate\");\r\n&nbsp;&nbsp;HttpWebResponse&nbsp;webResponse&nbsp;=&nbsp;(System.Net.HttpWebResponse)webRequest.GetResponse();\r\n&nbsp;&nbsp;\/\/\u83b7\u53d6\u76ee\u6807\u7f51\u7ad9\u7684\u7f16\u7801\u683c\u5f0f\r\n&nbsp;&nbsp;string&nbsp;contentype&nbsp;=&nbsp;webResponse.Headers[\"Content-Type\"];\r\n&nbsp;&nbsp;Regex&nbsp;regex&nbsp;=&nbsp;new&nbsp;Regex(\"charset\\s*=\\s*[\\W]?\\s*([\\w-]+)\",&nbsp;RegexOptions.IgnoreCase);\r\n&nbsp;&nbsp;if&nbsp;(webResponse.ContentEncoding.ToLower()&nbsp;==&nbsp;\"gzip\")\/\/\u5982\u679c\u4f7f\u7528\u4e86GZip\u5219\u5148\u89e3\u538b\r\n&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;using&nbsp;(System.IO.Stream&nbsp;streamReceive&nbsp;=&nbsp;webResponse.GetResponseStream())\r\n&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;using&nbsp;(var&nbsp;zipStream&nbsp;=&nbsp;new&nbsp;System.IO.Compression.GZipStream(streamReceive,&nbsp;System.IO.Compression.CompressionMode.Decompress))\r\n&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u5339\u914d\u7f16\u7801\u683c\u5f0f\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(regex.IsMatch(contentype))\r\n&nbsp;&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;Encoding&nbsp;ending&nbsp;=&nbsp;Encoding.GetEncoding\r\n&nbsp;&nbsp;&nbsp;&nbsp;(regex.Match(contentype).Groups[1].Value.Trim());\r\n&nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;(StreamReader&nbsp;sr&nbsp;=&nbsp;new&nbsp;System.IO.StreamReader(zipStream,&nbsp;ending))\r\n&nbsp;&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;htmlCode&nbsp;=&nbsp;sr.ReadToEnd();\r\n&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;using&nbsp;(StreamReader&nbsp;sr&nbsp;=&nbsp;new&nbsp;System.IO.StreamReader(zipStream,&nbsp;Encoding.UTF8))\r\n&nbsp;&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;htmlCode&nbsp;=&nbsp;sr.ReadToEnd();\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;}\r\n&nbsp;&nbsp;else\r\n&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;using&nbsp;(System.IO.Stream&nbsp;streamReceive&nbsp;=&nbsp;webResponse.GetResponseStream())\r\n&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;var&nbsp;encoding&nbsp;=&nbsp;Encoding.Default;\r\n&nbsp;&nbsp;&nbsp;if&nbsp;(contentype.Contains(\"utf\"))\r\n&nbsp;&nbsp;&nbsp;&nbsp;encoding&nbsp;=&nbsp;Encoding.UTF8;\r\n&nbsp;&nbsp;&nbsp;using&nbsp;(System.IO.StreamReader&nbsp;sr&nbsp;=&nbsp;new&nbsp;System.IO.StreamReader(streamReceive,&nbsp;encoding))\r\n&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;htmlCode&nbsp;=&nbsp;sr.ReadToEnd();\r\n&nbsp;&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;}\r\n&nbsp;&nbsp;return&nbsp;htmlCode;\r\n&nbsp;&nbsp;}\r\n&nbsp;&nbsp;catch&nbsp;(Exception&nbsp;ex)\r\n&nbsp;&nbsp;{\r\n&nbsp;&nbsp;return&nbsp;\"\";\r\n&nbsp;&nbsp;}\r\n&nbsp;}\r\n&nbsp;}&lt;\/dynamic&gt;&lt;\/dynamic&gt;<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>PS\uff1a\u8fd9\u91cc\u8981\u6ce8\u610f\u7f13\u5b58\u4e00\u4e0b_ticket\uff08\u5373access_token\uff09\uff0c\u7167\u5fae\u4fe1\u6587\u6863\u8bf4\u7684\uff0caccess_token\u4e24\u4e2a\u5c0f\u65f6\u5185\u6709\u6548\uff0c\u4e0d\u9700\u8981\u9891\u7e41\u8c03\u7528\u3002\u800c\u4e14\u83b7\u53d6access_token\u7684\u63a5\u53e3\u6709\u8c03\u7528\u6b21\u6570\u7684\u9650\u5236\uff0c\u5982\u679c\u8d85\u8fc7\u4e86\u6b21\u6570\uff0c\u5c31\u4e0d\u5141\u8bb8\u8c03\u7528\u4e86\u3002<\/p>\n<p>PPS:\u5efa\u8baenoncestr\u548cURL\u7531\u524d\u53f0\u4f20\u5165\u6bd4\u8f83\u9002\u5408\uff0c\u4f7f\u7528 var theWebUrl = window.location.href.split(&#8216;#&#8217;)[0] \u83b7\u53d6URL\uff0cnoncestr\u5c31\u968f\u610f\u4e86\u3002<\/p>\n<p>PPPS:\u9047\u5230\u8be1\u5f02\u7684invalid signature\u7684\u65f6\u5019\uff0c\u9996\u5148\u68c0\u67e5url\u53c2\u6570\uff0c\u7136\u540e\u68c0\u67e5noncestr\uff0c\u518d\u4e0d\u884c\u91cd\u542f\u4e00\u4e0b\u7a0b\u5e8f\u83b7\u53d6\u4e00\u4e2a\u65b0\u7684token\u56de\u6765\u7ee7\u7eed\u73a9\u3002<\/p>\n<p>\u4ee5\u4e0a\u5c31\u662fASP.NET MVC JS-SDK\u8ba4\u8bc1\u7684\u5b9e\u4f8b\u6559\u7a0b\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>asp.net mvcjs-sdk\u8ba4\u8bc1\uff0c\u5177\u4f53\u5185\u5bb9\uff1a \u5199\u5728\u524d\u9762 \u524d\u9635\u5b50\u56e0\u4e3a\u6709\u4e2a\u9879\u76ee\u9700\u8981\u505a\u5fae\u4fe1\u81ea\u5b9a\u4e49\u5206\u4eab\u529f\u80fd\uff0c\u56e0\u800c\u53bb\u7814\u7a76\u4e86\u4e0b\u5fae\u4fe1JS-SDK\u76f8\u5173\u77e5\u8bc6\u3002 \u6b64\u6587\u505a\u4e2a\u7b80\u5355\u7684\u8bb0(tu)\u5f55(cao)&#8230; \u5f00\u59cb\u6240\u6709\u7684\u4e1c\u897f\u90fd\u4ece\u6587\u6863\u5f00\u59cb:\u5fae\u4fe1JSSDK\u8bf4\u660e\u6587\u6863 \u9879\u76ee\u9700\u8981\u7528\u5230\u7684\u662f\u5206\u4eab\u63a5\u53e3 \u4e0d\u8fc7\u4f7f\u7528\u5fae\u4fe1JS-SDK\u4e4b\u524d\uff0c\u9700\u8981\u505aJS\u63a5\u53e3\u8ba4\u8bc1\u3002 \u8ba4\u8bc1\u5982\u4e0b\uff1a \u6b65\u9aa4\u4e00\uff1a\u7ed1\u5b9a\u57df\u540d \u6b65\u9aa4\u4e8c\uff1a\u5f15\u5165JS\u6587\u4ef6 \u6b65\u9aa4\u4e09\uff1a\u901a\u8fc7config\u63a5\u53e3\u6ce8\u5165\u6743\u9650\u9a8c\u8bc1\u914d\u7f6e \u6b65\u9aa4\u56db\uff1a\u901a\u8fc7ready\u63a5\u53e3\u5904\u7406\u6210\u529f\u9a8c\u8bc1 \u6b65\u9aa4\u4e94\uff1a\u901a\u8fc7error\u63a5\u53e3\u5904\u7406\u5931\u8d25\u9a8c\u8bc1 \u5177\u4f53\u89e3\u91ca\uff1a \u6b65\u9aa4\u4e00\u4e2d\u5141\u8bb8\u4f7f\u7528\u57df\u540d\/\u5b50\u57df\u540d\uff0c\u53ea\u8981xx.com\/xxx.txt\u6216\u8005xx.com\/mp\/xxx.txt\u80fd\u8bbf\u95ee\u5c31\u597d\u3002\u57df\u540d\u8ba4\u8bc1\u901a\u8fc7\u4e4b\u540e\uff0c\u6b64\u57df\u540d\u4e0b\u7684\u6240\u6709\u7aef\u53e3\u7684\u7f51\u7ad9\u90fd\u53ef\u4ee5\u4f7f\u7528JS-SDK\u3002 \u6b65\u9aa4\u4e8c\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u7565\u8fc7\u3002 \u6b65\u9aa4\u4e09\u6700\u78e8\u4eba\uff0c\u4e0b\u9762\u5355\u72ec\u8bb2\u89e3\u3002 config\u63a5\u53e3\u6ce8\u5165\u6743\u9650\u9a8c\u8bc1\u914d\u7f6e \u5148\u6765\u4e00\u6bb5\u8bf4\u660e\uff1a \u6240\u6709\u9700\u8981\u4f7f\u7528JS-SDK\u7684\u9875\u9762\u5fc5\u987b\u5148\u6ce8\u5165\u914d\u7f6e\u4fe1\u606f\uff0c\u5426\u5219\u5c06\u65e0\u6cd5\u8c03\u7528\uff08\u540c\u4e00\u4e2aurl\u4ec5\u9700\u8c03\u7528\u4e00\u6b21\uff0c\u5bf9\u4e8e\u53d8\u5316url\u7684SPA\u7684web app\u53ef\u5728\u6bcf\u6b21url\u53d8\u5316\u65f6\u8fdb\u884c\u8c03\u7528\uff0c\u76ee\u524dAndroid\u5fae\u4fe1\u5ba2\u6237\u7aef\u4e0d\u652f\u6301pushState\u7684H5\u65b0\u7279\u6027\uff0c\u6240\u4ee5\u4f7f\u7528pushState\u6765\u5b9e\u73b0web app\u7684\u9875\u9762\u4f1a\u5bfc\u81f4\u7b7e\u540d\u5931\u8d25\uff0c\u6b64\u95ee\u9898\u4f1a\u5728Android6.2\u4e2d\u4fee\u590d\uff09\u3002 wx.config({ &nbsp;debug:&nbsp;true,&nbsp;\/\/&nbsp;\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f,\u8c03\u7528\u7684\u6240\u6709api\u7684\u8fd4\u56de\u503c\u4f1a\u5728\u5ba2\u6237\u7aefalert\u51fa\u6765\uff0c &nbsp;\/\/\u82e5\u8981\u67e5\u770b\u4f20\u5165\u7684\u53c2\u6570\uff0c\u53ef\u4ee5\u5728pc\u7aef\u6253\u5f00\uff0c\u53c2\u6570\u4fe1\u606f\u4f1a\u901a\u8fc7log\u6253\u51fa\uff0c\u4ec5\u5728pc\u7aef\u65f6\u624d\u4f1a\u6253\u5370\u3002 &nbsp;appId:&nbsp;&#8221;,&nbsp;\/\/&nbsp;\u5fc5\u586b\uff0c\u516c\u4f17\u53f7\u7684\u552f\u4e00\u6807\u8bc6 &nbsp;timestamp:&nbsp;,&nbsp;\/\/&nbsp;\u5fc5\u586b\uff0c\u751f\u6210\u7b7e\u540d\u7684\u65f6\u95f4\u6233 &nbsp;nonceStr:&nbsp;&#8221;,&nbsp;\/\/&nbsp;\u5fc5\u586b\uff0c\u751f\u6210\u7b7e\u540d\u7684\u968f\u673a\u4e32 &nbsp;signature:&nbsp;&#8221;,\/\/&nbsp;\u5fc5\u586b\uff0c\u7b7e\u540d\uff0c\u89c1\u9644\u5f551 &nbsp;jsApiList:&nbsp;[]&nbsp;\/\/&nbsp;\u5fc5\u586b\uff0c\u9700\u8981\u4f7f\u7528\u7684JS\u63a5\u53e3\u5217\u8868\uff0c\u6240\u6709JS\u63a5\u53e3\u5217\u8868\u89c1\u9644\u5f552 }); \u767b\u5f55\u540e\u590d\u5236 \u770b\u5230\u8fd9\u91cc\u80af\u5b9a\u61f5\u903c\u4e86\uff0c\u8fd9\u662f\u90fd\u4ec0\u4e48\u9b3c&#8230;\u600e\u4e48\u73a9\u554a\u3002 \u63d0\u793a\u6211\u4eec\u53bb\u770b\u9644\u5f551&#8230;\u770b\u5b8c\u4e4b\u540e\u603b\u7ed3\u5982\u4e0b\uff1a 1.\u4f7f\u7528config\u63a5\u53e3\u6ce8\u5165\u6743\u9650\u9a8c\u8bc1\u914d\u7f6e\uff0c\u91cd\u70b9\u662f\u751f\u6210\u5408\u6cd5\u7684signatrue2.\u751f\u6210signature\u9700\u8981\u901a\u8fc7appid\u548csecret\u83b7\u53d6token3.\u65f6\u95f4\u6233\u548c\u8c03\u7528\u63a5\u53e3URL\u5fc5\u4e0d\u53ef\u5c114.\u6b64\u64cd\u4f5c\u9700\u8981\u670d\u52a1\u7aef\u5b8c\u6210\uff0c\u4e0d\u80fd\u4f7f\u7528\u5ba2\u6237\u7aef\u5b9e\u73b0 \u6574\u4e2a\u8fc7\u7a0b\u53d8\u6210\uff1a 1.\u901a\u8fc7appid\u548csecret\u83b7\u53d6access_token\uff0c\u63a5\u7740\u4f7f\u7528token\u83b7\u53d6jsapi_ticket\uff1b 2.\u62ff\u5230jsapi_ticket\u4e4b\u540e\uff0c\u628ajsapi_ticket\u3001\u65f6\u95f4\u6233\u3001\u968f\u673a\u5b57\u7b26\u4e32\u3001\u63a5\u53e3\u8c03\u7528\u9875\u9762URL \u62fc\u63a5\u6210\u5b8c\u6574\u5b57\u7b26\u4e32\uff0c\u4f7f\u7528sha1\u7b97\u6cd5\u52a0\u5bc6\u5f97\u5230signature\u3002 3.\u6700\u540e\u8fd4\u56de\u81f3\u9875\u9762\uff0c\u5728wx.config\u91cc\u9762\u586b\u5165appid\uff0c\u4e0a\u4e00\u6b65\u7684\u65f6\u95f4\u6233timestamp\uff0c\u4e0a\u4e00\u90e8\u7684\u968f\u673a\u5b57\u7b26\u4e32\u3001sha1\u62ff\u5230\u7684signature\uff0c\u60f3\u8981\u4f7f\u7528\u7684JS\u63a5\u53e3\u3002 \u5e9f\u8bdd\u5c11\u8bf4\uff0c\u76f4\u63a5\u4e0a\u4ee3\u7801\u5427\u3002 \u4ee3\u7801\u65f6\u95f4 &nbsp;public&nbsp;class&nbsp;WeiXinController&nbsp;:&nbsp;Controller &nbsp;{ &nbsp;public&nbsp;static&nbsp;readonly&nbsp;string&nbsp;appid&nbsp;= &nbsp;System.Web.Configuration.WebConfigurationManager.AppSettings[&#8220;wxappid&#8221;]; &nbsp;public&nbsp;static&nbsp;readonly&nbsp;string&nbsp;secret&nbsp;= &nbsp;System.Web.Configuration.WebConfigurationManager.AppSettings[&#8220;wxsecret&#8221;]; &nbsp;public&nbsp;static&nbsp;readonly&nbsp;bool&nbsp;isDedug&nbsp;= &nbsp;System.Web.Configuration.WebConfigurationManager.AppSettings[&#8220;IsDebug&#8221;]&nbsp;==&#8221;true&#8221;; &nbsp;public&nbsp;static&nbsp;string&nbsp;_ticket&nbsp;=&nbsp;&#8220;&#8221;; &nbsp;public&nbsp;static&nbsp;DateTime&nbsp;_lastTimestamp; &nbsp;public&nbsp;ActionResult&nbsp;Info(string&nbsp;url,string&nbsp;noncestr) &nbsp;{ [&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-29825","post","type-post","status-publish","format-standard","hentry","category-19"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29825","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=29825"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29825\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=29825"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=29825"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=29825"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}