Asp.net Core 微信公众号开发教程(4)——微信签名认证微信接入

 微信接入签名认证微信服务号开发

简介:Asp.net Core 微信公众号开发教程(4)——微信签名认证微信接入

    要开发微信公众号,获取公众号中用户、发送模版消息、自定义菜单等操作首先要进行微信签名认证。

下面我们来看一下微信签名认证的方法:

一.简单介绍官网接入逻辑

第一步:填写服务器配置

      登录微信公众平台官网后,在公众平台官网的开发-基本设置页面,勾选协议成为开发者,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。

同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效,请开发者谨慎填写及选择。加解密方式的默认状态为明文模式,选择兼容模式和安全模式需要提前配置好相关加解密代码。

第二步:验证消息的确来自微信服务器

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:

参数描述signature微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。timestamp时间戳nonce随机数echostr随机字符串

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:

1)将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

第三步:依据接口文档实现业务逻辑

二.通过Asp.net Core 代码来演示具体操作

1.首先在appsettings.json文件中定义微信的相关常量信息

{

  // 日志处理

  "Logging": {

    "LogLevel": {

      "Default": "Information",

      "Microsoft": "Warning",

      "Microsoft.Hosting.Lifetime": "Information"

    },

    "LOG_LEVENL": "1"

  },

  "AllowedHosts": "*",

  // 数据库连接

  "ConnectionStrings": {

    "MySqlContext": "Server=localhost;port=3306;Database=tendb;user=root;password=root;SslMode=None;CharSet=utf8;"

  },

  // 微信相关配置

  "WeChatSetting": {

    "appid": "开发者ID(AppID)",

    "appsecret": "开发者密码(AppSecret)",

    // 后期自定义菜单用

    "menuUrl": "",

    // 后期发送模版消息用

    "TemplateId": ""

  }

}

2.写一个工具类Config.cs用来获取配置文件的参数

    public class Config

    {

        #region 根据Key取Value值

        /// <summary>

        /// 根据Key取Value值

        /// </summary>

        /// <param name="key"></param>

        public static string GetValue(string key)

        {

            var configJson = GetJsonConfig();

            return configJson[key];

        }

        #endregion

        #region json配置文件读取

        /// <summary>

        /// json配置文件读取

        /// </summary>

        /// <param name="configFileName"></param>

        /// <param name="basePath"></param>

        /// <returns></returns>

        public static IConfigurationRoot GetJsonConfig(string configFileName = "appsettings.json", string basePath = "")

        {

            basePath = string.IsNullOrWhiteSpace(basePath) ? Directory.GetCurrentDirectory() : basePath;

            var builder = new ConfigurationBuilder().SetBasePath(basePath).AddJsonFile(configFileName);

            return builder.Build();

        }

        #endregion

    }

  3.定义一个验证签名的方法我是把所有的微信接口方法集成到一个方法里定义为baseApi.cs

    public class BasicApi

    {

        public BasicApi() { }

        #region 验证微信签名

        /// <summary>

        /// 验证微信签名

        /// </summary>

        /// <param name="token">AccessToken</param>

        /// <param name="signature"></param>

        /// <param name="timestamp"></param>

        /// <param name="nonce"></param>

        /// <returns></returns>

        public static bool CheckSignature(string token, string signature, string timestamp, string nonce)

        {

            string[] ArrTmp = { token, timestamp, nonce };

            //字典排序

            Array.Sort(ArrTmp);

            string tmpStr = string.Join("", ArrTmp);

            //字符加密

            //tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");

            tmpStr = HmacSha1Sign(tmpStr);

            //tmpStr = tmpStr.ToLower();

            if (tmpStr == signature)

            {

                return true;

            }

            else

            {

                return false;

            }

        }

        #endregion

        }

4.新建一个API控制器类WeiChatController并添加一个get的方法

    [Route("api/[controller]")]

    public class WeiChatController : Controller

    {

        const string Token = "weixin";//定义一个局部变量不可以被修改,这里定义的变量要与接口配置信息中填写的Token一致

        #region 校验微信签名

        /// <summary>

        ///  校验微信签名

        /// </summary>

        /// <param name="signature">微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。</param>

        /// <param name="timestamp">时间戳</param>

        /// <param name="nonce">随机数</param>

        /// <param name="echostr"></param>

        /// <param name="token">随机字符串</param>

        /// <returns></returns>       

        [Route("WeChatCheck")]

        [HttpGet]

        public ActionResult WeChatCheck(string signature, string timestamp, string nonce, string echostr, string token)

        {

            if (BasicApi.CheckSignature(Token, signature, timestamp, nonce) && !string.IsNullOrEmpty(echostr))

            {

                return Content(echostr);

            }

            else

            {

                return null;

            }

        }

        #endregion

    }

5.方法添加完之后使用ngrok反射外网ip,然后在微信公众号的基本配置菜单中进行验证。验证之前需要配置IP白名单,这个是你服务器的ip。不过我个人开发用的时候一般用测试号来测试开发微信公众号,不需要配置,不过正式的微信服务号中需要配置ip白名单。

基本上验证微信接入签名是这样来实现的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352

推荐阅读更多精彩内容