http://www.cnblogs.com/zskbll/p/4093954.html

此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可直接跳过,也欢迎大神吐槽。

目录

C#微信公众号开发系列教程一(调试环境部署)

C#微信公众号开发系列教程一(调试环境部署续:vs远程调试)

C#微信公众号开发系列教程二(新手接入指南)

微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流程是这样的,用户发送消息到微信服务器,微信服务器将接收到的消息post到用户接入时填写的url中,在url处理程序中,首先判断消息的合法性,判断成功后根据消息体的内容做相应的相应。原理很容易理解,接触过socket的可能理解起来更容易。

然而,微信的文档有的时候确实有点让人摸不着头脑,关于微信接入的文档写的确实不敢恭维啊。官方文档写的第一步是“申请消息接口”,这里是需要填写一个url的,此url用来处理微信发送的消息的,但微信把url中相关的配置写在了第二步,一不小心就把新手给坑了。下面我按照我的理解来进行解释。

首先,开发者在接入时,微信服务器将发送get请求到你填写的url上,此请求携带四个参数,分别signature(微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。),timestamp(时间戳),nonce(随机数),echostr(随机字符串).用 HttpContext.Current.Request.RawUrl可以获取当前请求的原始url,如下图所示:

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

加密/校验流程如下:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
下面是代码实现。
首先,在你的处理程序中(我是新建了一个一般处理程序wx.ashx),判断当前请求的类型,因为接入时,是发送的GET请求,消息处理是发送的POST请求。如下图:
这里我对验证url的方法进行封装。
/// <summary>
/// 验证url权限, 接入服务器
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
public static bool ValidUrl(string token)
{
string echoStr = VqiRequest.GetQueryString("echoStr");
if (CheckSignature(token))
{
if (!string.IsNullOrEmpty(echoStr))
{
Utils.ResponseWrite(echoStr);
return true;
} }
return false;
} /// <summary>
/// 验证微信签名
/// </summary>
/// * 将token、timestamp、nonce三个参数进行字典序排序
/// * 将三个参数字符串拼接成一个字符串进行sha1加密
/// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
/// <returns></returns>
public static bool CheckSignature(string token)
{
string signature = VqiRequest.GetQueryString("signature");
string timestamp = VqiRequest.GetQueryString("timestamp");
string nonce = VqiRequest.GetQueryString("nonce");
string[] ArrTmp = { token, timestamp, nonce };
Array.Sort(ArrTmp); //字典排序
string tmpStr = string.Join("", ArrTmp);
tmpStr = Utils.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
tmpStr = tmpStr.ToLower();
if (tmpStr == signature)
{
return true;
}
else
{
return false;
}
}

注:代码VqiRequest.GetQueryString是封装的QueryString请求的方法,使用的时候可以改成QueryString[“”]

处理过程如图:

将signature,timestamp,nonce三个参数放在数组中,

排序后的ArrTmp:

将三个将三个参数字符串拼接成一个字符串:

将tmpStr进行sha1加密,加密后的字符串转换成小写:

然后和签名进行对比,相同则表示验证成功。

验证成功将echoStr返回给微信。

/// <summary>
/// 根据指定的密码和哈希算法生成一个适合于存储在配置文件中的哈希密码
/// </summary>
/// <param name="str">要进行哈希运算的密码</param>
/// <param name="type"> 要使用的哈希算法</param>
/// <returns>经过哈希运算的密码</returns>
public static string HashPasswordForStoringInConfigFile(string str, string type)
{
return FormsAuthentication.HashPasswordForStoringInConfigFile(str, type);
} public static void ResponseWrite(string str)
{
HttpContext.Current.Response.Write(str);
HttpContext.Current.Response.End();
}

处理程序编写完毕后,部署到iis(方法请参照教程一),登录微信管理后台https://mp.weixin.qq.com/在开发者中心页,点击“修改配置按钮”填写URL、Token和EncodingAESKey,其中URL是开发者用来接收微信服务器数据的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效。加解密方式的默认状态为明文模式。加解密模式将在后期的系列中与大家共享,敬请期待。

如图所示:

点击提交后,微信服务器将get请求到上文中编写的url中。验证成功,则绑定成功。

END

如有疑问加群一起交流,我需要广大屌丝小伙伴的反馈与建议,   

如果觉得本文对你有帮助,请点击文章下面的推荐哦,去帮助更多的小伙伴了解微信开发的流程。

如果你是土豪,想支持笔者继续更新本系列教程,可以扫描下面的二维码悬赏一下,你的支持是笔者继续更新下去的动力。

C#微信公众号开发系列教程二(新手接入指南)的更多相关文章

  1. C#微信公众号开发系列教程三(消息体签名及加解密)

    http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...

  2. 微信公众号开发系列教程一(调试环境部署续:vs远程调试)

    http://www.cnblogs.com/zskbll/p/4080328.html 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试 ...

  3. C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  4. C#微信公众号开发系列教程五(接收事件推送与消息排重)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  5. C#微信公众号开发系列教程四(接收普通消息)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  6. C#微信公众号开发系列教程(接收事件推送与消息排重)

    微信服务器在5秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.这样的话,问题就来了.有这样一个场景:当用户关注微信账号时,获取当前用户信息,然后将信息写到数据库中.类似于pc端网站的注册.可 ...

  7. C#微信公众号开发入门教程

    首先打开开发文档: 微信公众号开发者文档:http://mp.weixin.qq.com/wiki/home/index.html 一.创建测试账号 可以先申请一个开发者测试账号

  8. 微信公众号开发系列-13、基于RDIFramework.NET框架整合微信开发应用效果展示

    1.前言 通过前面一系列文章的学习,我们对微信公众号开发已经有了一个比较深入和全面的了解. 微信公众号开发为企业解决那些问题呢? 我们经常看到微信公众号定制开发.微信公众平台定制开发,都不知道这些能给 ...

  9. 微信公众号开发系列-获取微信OpenID

    在微信开发时候在做消息接口交互的时候须要使用带微信加密ID(OpenId),下面讲讲述2中类型方式获取微信OpenID.接收事件推送方式和网页授权获取用户基本信息方式获取. 1.通过接收被动消息方式获 ...

随机推荐

  1. JAVA设计模式之3-抽象工厂模式

    书接上文,简单工厂模式解决的是可以枚举种类的类的问题,但是带来了高耦合的问题,并且对类系列繁多无从下手,那么我们想起了一种方法,那就是抽象类,建一个抽象工厂,抽象工厂里的方法都是根据系列类的差异区分出 ...

  2. [LeetCode] Range Addition 范围相加

    Assume you have an array of length n initialized with all 0's and are given k update operations. Eac ...

  3. KD-tree(2维)

    用于动态插入以及求某点的最近点的距离(BZOJ2648,BZOJ2716) #include <cstdio> #include <cmath> #include <al ...

  4. 初探Socket

    使用Socket Socket是两台主机之间的一个连接,它可以完成7个操作. 连接远程机器 发送数据 接收数据 关闭连接 绑定端口 监听入站数据 在绑定端口上接受来自远程机器的连接 Java中的Soc ...

  5. jquery 监听常用监听方法

    最近在做网站开发,需要用到不少js的知识.之前学过现在重新来看,发现还真忘了不少~~ 在使用基于bootstrap,或者基于 jquery 的插件时,如过没有出现预期效果 请最先检查下是否优先载入的 ...

  6. jq.validate隐藏元素忽略验证

    jq.validate隐藏元素忽略验证 现在有这样一个需求,当触发某类事件时候,需要在页面中显示input框,但是当不需要加载页面中的元素时候,进行隐藏.在这个需求的前提下,程序中对于input中的输 ...

  7. Java各种数据结构实现

    1.单向链表 实现思路:创建Node类,包括自己的数据和指向下一个:创建Node类,包括头尾节点,实现添加.删除.输出等功能. tips:n = n.next不破坏链表结果,而n.next = n.n ...

  8. wordpress默认index主页选择Your Projects提示无法找到项目解决办法?

    wordpress_4.5.3默认index主页选择Your Projects下部署的项目发现报错无法找到目标解决办法: 1.其实细心的小伙伴已经发现问题出在哪里,跳转后链接地址发生了错误没有加loc ...

  9. UltralEdit 替换tips

    UltralEdit的字符串替换,简直是编辑器的神来之笔! 可以通过 搜索--〉替换 菜单调出,也可以使用 Ctrl+R 快捷键 下面来看字符的表示吧: tab可以直接Tab键(可能不成功,因为被用作 ...

  10. ASCII码而已

    题目: \u5927\u5bb6\u597d\uff0c\u6211\u662f\u0040\u65e0\u6240\u4e0d\u80fd\u7684\u9b42\u5927\u4eba\uff01 ...