志远毅行行天下 發表於 2019-11-14 14:58:00

c#微信公众号开发一----基本设置,服务器配置token验证,获取timestamp/nonce/signature

<h1><strong>一、c#微信公众号开发----基本设置</strong></h1>
<p><strong>参考微信官方文档</strong></p>
<p><strong>https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html</strong></p>
<p>开发→基本配置</p>
<h2><strong>公众号开发信息</strong></h2>
<p><img src="https://img2018.cnblogs.com/i-beta/1221793/201911/1221793-20191114134807596-1090745780.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;注:1.记录好开发者密码,会在程序中验证过程中使用到。</p>
<p>2.通过appid和appsecret调用access_token时,至有在ip白名单的ip才能成功调用。</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/i-beta/1221793/201911/1221793-20191114134839366-855283600.png" alt=""></p>
<p>&nbsp;</p>
<h2><strong>服务器配置</strong></h2>
<p>&nbsp;<img src="https://img2018.cnblogs.com/i-beta/1221793/201911/1221793-20191114113434873-1193877613.png" alt=""></p>
<p>若此处开启服务器配置,设置的自动回复和自定义菜单将全部失效。必须在程序中重写相关方法。</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/i-beta/1221793/201911/1221793-20191114113443784-67382895.png" alt=""></p>
<p>&nbsp;</p>
<p>点击修改配置,token为随意填写的参数</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/i-beta/1221793/201911/1221793-20191114134729391-1076304759.png" alt=""></p>
<p>&nbsp;</p>
<p>我是用的是一般处理程序编写的微信接口token验证,参数参考官方文档。代码如下:</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1221793/201911/1221793-20191114141045138-1732523505.png" alt=""></p>
<p>&nbsp;</p>
<p>开发者通过检验signature对请求进行校验。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:</p>
<p>1)将token、timestamp、nonce三个参数进行字典序排序</p>
<p>2)将三个参数字符串拼接成一个字符串进行sha1加密</p>
<p>3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> ProcessRequest(HttpContext context){
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">验证token</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span>   <span style="color: rgba(0, 0, 255, 1)">string</span> postString = <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.Empty;
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>   <span style="color: rgba(0, 0, 255, 1)">string</span> token =<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">aabbcc</span><span style="color: rgba(128, 0, 0, 1)">"</span>;   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">验证token,随意填写</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.IsNullEmpty(token)){
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>         <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> ;
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>   <span style="color: rgba(0, 0, 255, 1)">string</span> echoString = HttpContext.Current.Request.QueryString[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">echoStr</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>   <span style="color: rgba(0, 0, 255, 1)">string</span> signature = HttpContext.Current.Request.QueryString[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">sianature</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 128, 128, 1)">10</span>   <span style="color: rgba(0, 0, 255, 1)">string</span> timestamp = HttpContext.Current.Request.QueryString[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">timestamp</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 128, 128, 1)">11</span>   <span style="color: rgba(0, 0, 255, 1)">string</span> nonce = HttpContext.Current.Request.QueryString[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">nonce</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 128, 128, 1)">12</span>   <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(CheckSignature(token,signature,timestamp,nonce)){
</span><span style="color: rgba(0, 128, 128, 1)">13</span>         <span style="color: rgba(0, 0, 255, 1)">if</span>(!<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.IsNullOrEmpty(echiString)){
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)">          HttpContext.Current.Response.Write(echoString);
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)">          HttpContext.Current.Response.End();
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 0, 1)">       }
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">18</span> }</pre>
</div>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span>          <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span>         <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 验证微信签名
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>         <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span>         <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="token"&gt;</span><span style="color: rgba(0, 128, 0, 1)">token</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>         <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="signature"&gt;</span><span style="color: rgba(0, 128, 0, 1)">签名</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span>         <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="timestamp"&gt;</span><span style="color: rgba(0, 128, 0, 1)">时间戳</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span>         <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="nonce"&gt;</span><span style="color: rgba(0, 128, 0, 1)">随机数</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span>         <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>         <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">bool</span> CheckSignature(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> token,
</span><span style="color: rgba(0, 128, 128, 1)">10</span><span style="color: rgba(0, 0, 255, 1)">string</span> signature, <span style="color: rgba(0, 0, 255, 1)">string</span> timestamp, <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> nonce)
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)">12</span>             <span style="color: rgba(0, 0, 255, 1)">string</span>[] ArrTmp =<span style="color: rgba(0, 0, 0, 1)"> { token, timestamp, nonce };
</span><span style="color: rgba(0, 128, 128, 1)">13</span>             <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">字典排序</span>
<span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)">            Array.Sort(ArrTmp);
</span><span style="color: rgba(0, 128, 128, 1)">15</span>             <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">拼接</span>
<span style="color: rgba(0, 128, 128, 1)">16</span>             <span style="color: rgba(0, 0, 255, 1)">string</span> tmpStr = <span style="color: rgba(0, 0, 255, 1)">string</span>.Join(<span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">, ArrTmp);
</span><span style="color: rgba(0, 128, 128, 1)">17</span>             <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">sha1验证</span>
<span style="color: rgba(0, 128, 128, 1)">18</span>             tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">SHA1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">19</span>             <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">tmpStr = Membership.CreateUser(tmpStr, "SHA1");</span>
<span style="color: rgba(0, 128, 128, 1)">20</span>             tmpStr =<span style="color: rgba(0, 0, 0, 1)"> tmpStr.ToLower();
</span><span style="color: rgba(0, 128, 128, 1)">21</span>
<span style="color: rgba(0, 128, 128, 1)">22</span>             <span style="color: rgba(0, 0, 255, 1)">if</span> (tmpStr ==<span style="color: rgba(0, 0, 0, 1)"> signature)
</span><span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 0, 0, 1)">            {
</span><span style="color: rgba(0, 128, 128, 1)">24</span>               <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)">26</span>             <span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(0, 0, 0, 1)">            {
</span><span style="color: rgba(0, 128, 128, 1)">28</span>               <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">29</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)">30</span>         }</pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;将编写的代码路径,填写到url里,前面填写的“aabbcc”,此时token里填写的也必须为“aabbcc”。</p>
<p>token必须保持一致,若不一致会弹出提示。</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1221793/201911/1221793-20191114141530005-156215232.png" alt=""></p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/i-beta/1221793/201911/1221793-20191114141420514-1327453343.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1>二、<strong>获取timestamp/nonce/signature</strong></h1>
<h2><strong>timestamp时间戳</strong></h2>
<div class="cnblogs_code">
<pre>public static string<span> timestamp(){
   TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0<span>);
   return<span> Convert.ToInt64(ts.TotalSeconds).ToString();
}</span></span></span></pre>
</div>
<p><strong>nonce随机数</strong></p>
<div class="cnblogs_code">
<pre>public static string<span> getNoncestr(){
   Random random = new<span> Random();
   return Md5Util.GetMD5(random.Next(1000<span>).ToString(),”GBK”).ToLower().Replace(“s”,”S”);
}</span></span></span></pre>
</div>
<p><strong>signature随机数</strong></p>
<div class="cnblogs_code">
<pre>public static string Signature(string token, string timestamp, string<span> nonce){
   string[] ArrTmp =<span> { token, timestamp, nonce };
   //字典排序
<span>   Array.Sort(ArrTmp);
   //拼接
   string tmpStr = string.Join(""<span>, ArrTmp);
   //sha1验证
   tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1"<span>);
   tmpStr =<span> tmpStr.ToLower();
   return<span> tmpStr;
}</span></span></span></span></span></span></span></pre>
</div>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    若一蓑烟雨 任平生
倒是也无晴 也无风<br><br>
来源:https://www.cnblogs.com/luvian/p/11856569.html
頁: [1]
查看完整版本: c#微信公众号开发一----基本设置,服务器配置token验证,获取timestamp/nonce/signature