距离第一讲又已经过去了一个多星期了,本打算一周更新一讲的,奈何实在太忙。最近也在群里发现有一部分人已经可以熟练调用微信的部分接口但却不是很清楚微信公众平台接收消息的一个处理机制。本讲就来介绍下怎么接入开发者的服务器。
接入微信公众平台开发,开发者需要按照如下步骤完成:
1、填写服务器配置 2、验证服务器地址的有效性 3、依据接口文档实现业务逻辑
举个形象的例子:比如在抗战时期,各个军队之间需要进行通讯,在战场上军情的保密是很重要的。所以A、B两个军队事先约定好了接头的暗号(token),所有的书信都是需要使用密文的(加密方式也已经约定好了)。假如现在A(微信服务器)收到上级(用户)命令需要和B(开发者服务器)联合作战,但上级与B军队之间无法进行直接的沟通,那么现在就由A将指令告诉给B,B收到指定后,根据事先约定好的解密方式和暗号(token)解密成功后,派个通讯兵告诉A,说已经收到他们的信息了,那么A和B之间的通讯就建立起来了。假如A和B之间的加密方式被敌军C窃取到了,但C不知道他们之间的暗号,所以C就算知道了加密方式也无法冒充A与B进行通讯。所以,在整个通讯的过程中,token是至关重要的。
填写服务器配置
此操作的目的就是告诉微信服务器开发者的服务器在哪儿,已经他们之间的通讯口令。
校验服务器地址的有效性
开发者在接入时,微信服务器将发送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对比,标识该请求来源于微信。
下面我们一步步来实现这个流程
1、获取token、timestamp、nonce,并字典序排序
var signature = context.Request.QueryString["signature"]; var timestamp = context.Request.QueryString["timestamp"]; var nonce = context.Request.QueryString["nonce"]; var echostr = context.Request.QueryString["echostr"]; var arr = new[] {token, timestamp, nonce}; Array.Sort(arr);
2. 将三个参数字符串拼接成一个字符串进行sha1加密
var tempstr = string.Join("", arr); var tempsign = FormsAuthentication.HashPasswordForStoringInConfigFile(tempstr, "sha1").ToLower();
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
if (signature == tempsign) { context.Response.Write(echostr); }
由于接入的时候,微信服务器发送的是get请求,接入之后转发的消息是post的请求,所以可以根据请求的方式来判断当前是接入还是接入后的消息推送。
完整的代码如下所示:
public void ProcessRequest(HttpContext context) { string token = "qqq"; if (context.Request.HttpMethod == "GET") { //说明是接入请求 var signature = context.Request.QueryString["signature"]; var timestamp = context.Request.QueryString["timestamp"]; var nonce = context.Request.QueryString["nonce"]; var echostr = context.Request.QueryString["echostr"]; var arr = new[] {token, timestamp, nonce}; Array.Sort(arr); var tempstr = string.Join("", arr); var tempsign = FormsAuthentication.HashPasswordForStoringInConfigFile(tempstr, "sha1").ToLower(); if (signature == tempsign) { context.Response.Write(echostr); } } else { //接收消息处理 }
注:可能由于微信服务器的缓存问题,接入成功后,现在不会立即生效。
附视频教程:http://pan.baidu.com/s/1GwsVk
本人才疏学浅,人丑钱少脸皮薄,所以文章或视频中有错误或不妥之处,欢迎各位同仁指教。
如果觉得本文对你有帮助,请点击文章下面的推荐哦,去帮助更多的小伙伴了解微信开发的流程。
如果你是土豪,想支持笔者继续更新本系列教程,可以扫描下面的二维码悬赏一下,你的支持是笔者继续更新下去的动力。
如果你司需求微信开发项目合作,可以私聊我QQ。