当前位置: 首页 > news >正文

微信公众平台开发学习笔记1--验证服务器地址的有效性

1、首先,微信公众平台开发前期准备,需要注册一个微信公众平台账号。(参考微信公众平台)

2、注册完成后,会得到开发者ID,如下图:

3、修改服务器配置,如下图:

4、服务器配置完成后,点击提交,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数:

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

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。(具体说明阅读微信开发者文档)

5、服务器代码部分:

Controller

        /// <summary>
        /// HttpGet请求
        /// </summary>
        /// <param name="signature">微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数</param>
        /// <param name="timestamp">时间戳</param>
        /// <param name="nonce">随机数</param>
        /// <param name="echostr">随机字符串</param>
        /// <returns></returns>
        [HttpGet]
        [ActionName("Index")]
        public ActionResult Get(string signature, string timestamp, string nonce, string echostr)
        {
            string token = string.Empty;//公众平台上,开发者设置的Token;必须为英文或数字,长度为3-32字符
            if (string.IsNullOrEmpty(token))
                return Content("请在服务器设置Token!");

            if (WeiXinBasic.CheckSignature(token, timestamp, nonce, signature) != 0)
                return Content("参数设置错误!");

            return Content(echostr);
        }

Core

        #region 验证signature是否合法
        /// <summary>
        /// 验证signature是否合法
        /// </summary>
        /// <param name="token">公众平台上,开发者设置的Token</param>
        /// <param name="timestamp">时间戳,对应URL参数的timestamp</param>
        /// <param name="nonce">随机串,对应URL参数的nonce</param>
        /// <param name="signature">加密签名,对应URL参数的signature</param>
        /// <returns></returns>
        public static int CheckSignature(string token, string timestamp, string nonce, string signature)
        {
            string hash = "";
            int ret = 0;
            ret = GenarateSinature(token, timestamp, nonce, signature, ref hash);
            if (ret != 0)
                return ret;
            //System.Console.WriteLine(hash);
            if (hash == signature)
                return 0;
            else
            {
                return 40001;//获取access_token时AppSecret错误,或者access_token无效。请开发者认真比对AppSecret的正确性,或查看是否正在为恰当的公众号调用接口
            }
        }

        private static int GenarateSinature(string token, string timestamp, string nonce, string signature, ref string sMsgSignature)
        {
            ArrayList AL = new ArrayList();
            AL.Add(token);
            AL.Add(timestamp);
            AL.Add(nonce);
            AL.Sort(new DictionarySort());
            string raw = "";
            for (int i = 0; i < AL.Count; ++i)
            {
                raw += AL[i];
            }

            SHA1 sha;
            ASCIIEncoding enc;
            string hash = "";
            try
            {
                sha = new SHA1CryptoServiceProvider();
                enc = new ASCIIEncoding();
                byte[] dataToHash = enc.GetBytes(raw);
                byte[] dataHashed = sha.ComputeHash(dataToHash);
                hash = BitConverter.ToString(dataHashed).Replace("-", "");
                hash = hash.ToLower();
            }
            catch (Exception)
            {
                return 40003;//不合法的OpenID,请开发者确认OpenID(该用户)是否已关注公众号,或是否是其他公众号的OpenID
            }
            sMsgSignature = hash;
            return 0;
        }

        public class DictionarySort : System.Collections.IComparer
        {
            public int Compare(object oLeft, object oRight)
            {
                string sLeft = oLeft as string;
                string sRight = oRight as string;
                int iLeftLength = sLeft.Length;
                int iRightLength = sRight.Length;
                int index = 0;
                while (index < iLeftLength && index < iRightLength)
                {
                    if (sLeft[index] < sRight[index])
                        return -1;
                    else if (sLeft[index] > sRight[index])
                        return 1;
                    else
                        index++;
                }
                return iLeftLength - iRightLength;

            }
        }
        #endregion

  

转载于:https://www.cnblogs.com/zxcnn/p/4274873.html

相关文章:

  • jquery uploadify上传文件插件导致浏览器崩溃问题解决方法
  • Swift语言实战晋级-第9章 游戏实战-跑酷熊猫-5-6 踩踏平台是怎么炼成的
  • FireDAC 之FDMetaInfoQuery
  • GIT操作笔记
  • DevExpress随笔系列
  • 4.2 HTML Canvas标签
  • java对象占用内存大小计算方式
  • iOS开发之oc(六)--点语法
  • Sample SecondarySort 浅析
  • 导入项目时Loading descriptor ...
  • 【BZOJ】【2940】【POI2000】条纹
  • IOS开发基础知识--碎片8
  • 远程debug WebSphere 和 Watch时提示error(s)_during_the_evaluation
  • javascirpt怎样模仿块级作用域(js高程笔记)
  • python 多线程编程
  • 2017-09-12 前端日报
  • Android框架之Volley
  • ESLint简单操作
  • javascript 总结(常用工具类的封装)
  • Koa2 之文件上传下载
  • MySQL QA
  • Mysql优化
  • React组件设计模式(一)
  • sessionStorage和localStorage
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 搭建gitbook 和 访问权限认证
  • 检测对象或数组
  • 前嗅ForeSpider中数据浏览界面介绍
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 如何在GitHub上创建个人博客
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 实现菜单下拉伸展折叠效果demo
  • 首页查询功能的一次实现过程
  • 详解移动APP与web APP的区别
  • 用mpvue开发微信小程序
  • 正则表达式
  • Java性能优化之JVM GC(垃圾回收机制)
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #14vue3生成表单并跳转到外部地址的方式
  • (145)光线追踪距离场柔和阴影
  • (6)设计一个TimeMap
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (一)为什么要选择C++
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • ***通过什么方式***网吧
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .Net Core和.Net Standard直观理解
  • .net Signalr 使用笔记