• .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

     
     
  • 相关阅读:
    加载页面(Loading)
    js判断手机连接网络类型
    combotree的加载方法
    jquery.util.easyui.dialog
    datagrid后台分页js.js
    安卓使用Canvas绘制工作日程表
    【Oracle】OGG数据初始化之RMAN
    怎样优雅的管理ActionBar
    openwrt undefined reference to ‘getpwent_r’
    通过文件对照工具Merge数据库
  • 原文地址:https://www.cnblogs.com/webenh/p/12168427.html
Copyright © 2020-2023  润新知