.NET CORE 微信小程序消息验证的坑

进入微信小程序,点击开发-》选择消息推送-》扫码授权,填写必要参数

进入接口开发:

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/// <summary>
       /// 验证小程序
       /// </summary>
       /// <returns></returns>
       [HttpGet("checksign")]
       public dynamic CheckSignature()
       {
           /// 1、将token、timestamp、nonce三个参数进行字典序排序
           /// 2、将三个参数字符串拼接成一个字符串进行sha1加密
           /// 3、开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
           var _signature = Request.Query["signature"].ToString();
           var _timestamp = Request.Query["timestamp"].ToString();
           var _nonce = Request.Query["nonce"].ToString();
       <br>       //参数排序
           SortedDictionary<stringstring> keyValuePairs = new SortedDictionary<stringstring>();
           keyValuePairs.Add("token""xxxxxxxx");  //设定的token
           keyValuePairs.Add("timestamp", _timestamp);
           keyValuePairs.Add("_nonce", _nonce);
           StringBuilder sb = new StringBuilder();
           foreach (var item in keyValuePairs)
           {
               sb.Append(item.Value);
           }
           var signature = StringHelper.Sha1(sb.ToString()).ToLower();  //sha1加密,注意,必须是小写的
 
           if (signature.Equals(_signature))
           {
               return Request.Query["echostr"].ToString();  //注意:坑,官方文档上提示返回true和false,其实返回的是echostr参数
           }
           else
           {
               return "非法請求";
           }
       }

  sha1加密:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/// <summary>
       /// 基于Sha1的自定义加密字符串方法:输入一个字符串,返回一个由40个字符组成的十六进制的哈希散列(字符串)。
       /// </summary>
       /// <param name="str">要加密的字符串</param>
       /// <returns>加密后的十六进制的哈希散列(字符串)</returns>
       public static string Sha1(this string str)
       {
           var buffer = Encoding.UTF8.GetBytes(str);
           var data = SHA1.Create().ComputeHash(buffer);
 
           var sb = new StringBuilder();
           foreach (var in data)
           {
               sb.Append(t.ToString("X2"));
           }
 
           return sb.ToString();
       }

  然后把上述接口发布到服务器上,必须绑定域名,而且直接指定到对应的接口上,如:http://api.xylove.net/lee/WX/checksign

 
 
原文地址:https://www.cnblogs.com/webenh/p/12168427.html