zoukankan      html  css  js  c++  java
  • 微信公众平台入门开发教程.Net(C#)框架

    一、序言

      一直在想第一次写博客,应该写点什么好?正好最近在研究微信公众平台开发,索性就记录下,分享下自己的心得,也分享下本人简单模仿asp.net运行机制所写的通用的微信公众平台开发.Net(c#)框架吧。由于本人知识有限、文字组织能力有限,如有错误或不足,请多多指教!

    二、微信公众平台.Net(C#)框架介绍

     

      运行流程:WeiXinRequestHandler.ashx接收微信服务器post请求,创建WeiXinApplication实例,构造函数中设置WeiContext(WeiXinRequest,WeiXinResponse)请求上下文属性,执行WeiXinApplication的GetResponseXml()方法,使用WeiXinHandlerFactory工厂类动态加载程序集,遍历程序集里的Type集合,反射获取控制器中的WeiXinMsgType属性值判断是否与请求消息上下文WeiXinRequest的WeiXinMsgType属性值一致创建相对应的消息处理控制器实例,并返回这个实例,赋值给WeiXinApplication中IWeiXinHandler属性值,调用ProcessWeiXin(WeiXinContext context)方法,执行完毕后,返回WeiXinResponse对象中的响应消息。

    三、微信公众平台注册/接入相关事宜

    1、注册:

      填写基本信息,激活邮箱,登记信息......公众号信息。值得一提的是:目前个人只允许注册订阅号,公司单位才能注册服务号,服务号可以实现自定义菜单;公众号名称一经确认就无法修改!

    2、接入:(必须条件:拥有自己的公网可访问的服务器)

       ①、成为开发者:在公众平台网站的高级功能 – 开发模式页,点击“成为开发者”按钮,根据官方文档填写相关接口配置信息并提交。

       ②、验证url有效性:开发者提交信息后,微信服务器将发送GET请求到填写的URL上,GET请求携带四个参数:

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

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

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

    验证工具类:UtilityHelper

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #region 检查加密签名是否一致 - public static bool CheckSignature(string signature, string timestamp, string nonce)
     
       /// <summary>
       /// 检查加密签名是否一致
       /// </summary>
       /// <param name="signature">微信加密签名</param>
       /// <param name="timestamp">时间戳</param>
       /// <param name="nonce">随机数</param>
       /// <returns></returns>
       public static bool CheckSignature(string signature, string timestamp, string nonce)
       {
           List<string> stringList = new List<string> {Token, timestamp, nonce};
           // 字典排序
           stringList.Sort();
           return Sha1Encrypt(string.Join("", stringList)) == signature;
       }
     
       #endregion
     
       #region 对字符串SHA1加密 - public static string Sha1Encrypt(string targetString)
     
       /// <summary>
       /// 对字符串SHA1加密
       /// </summary>
       /// <param name="targetString">源字符串</param>
       /// <returns>加密后的十六进制字符串</returns>
       private static string Sha1Encrypt(string targetString)
       {
           byte[] byteArray = Encoding.Default.GetBytes(targetString);
           HashAlgorithm hashAlgorithm = new SHA1CryptoServiceProvider();
           byteArray = hashAlgorithm.ComputeHash(byteArray);
           StringBuilder stringBuilder = new StringBuilder();
           foreach (byte item in byteArray)
           {
               stringBuilder.AppendFormat("{0:x2}", item);
           }
           return stringBuilder.ToString();
       }
     
       #endregion
     
       #region 根据加密类型对字符串SHA1加密 - public static string Sha1Encrypt(string targetString, string encryptType)
     
       /// <summary>
       /// 根据加密类型对字符串SHA1加密
       /// </summary>
       /// <param name="targetString">源字符串</param>
       /// <param name="encryptType">加密类型:MD5/SHA1</param>
       /// <returns>加密后的字符串</returns>
       private static string Sha1Encrypt(string targetString, string encryptType)
       {
           return FormsAuthentication.HashPasswordForStoringInConfigFile(targetString, encryptType);
       }
     
       #endregion

      

    四、微信公众平台运行原理介绍

     

    五、结束

      字穷了...~~~!附源码吧。看web.config,打开Test.html进行测试。添加自己的消息控制器必须继承WeiXinHandlerType,程序集生成插件目录bin/WeiXinPlugins。

    源码下载:WeiXin.Framework

    等我有钱了我要买两支棒棒糖,一支你看我吃一支我吃给你看。
  • 相关阅读:
    java中goto语句
    随机产生一个小写字母
    java移位操作符注意的问题
    +号操作符
    类名引用static变量好处
    自己做题的简单的算法
    read()方法读取的是一个字节,为什么返回是int,而不是byte
    一道判断题
    关于继承中静态代码块,构造代码块,构造函数执行顺序
    比较好的Redux和React-Redux学习资料
  • 原文地址:https://www.cnblogs.com/Alex80/p/4252767.html
Copyright © 2011-2022 走看看