之前用nodejs编写了一些关于微信公众平台的实现,但是由于时间原因,没有很好的继续下去。。但是基于对新技术的渴望,nodejs版还将继续下去。。
废话不多说了先进入正题。。首先进入微信公众平台,注册,验证。。这里过程忽略。。
一、功能配置
进入“功能”,“高级功能”,“开发模式”,填写接入接口和token。。(由于伟大的企鹅更新速度实在是很快,因此,这里只是做最验证页面的图片说明,此链接路径是2014年5月版本)。
这里填入URL和Token,URL为接收微信服务器推送消息的地址。token为自定义的一个字符串。
二、消息类型介绍
微信服务器消息分几种类型:
- token:就是现在需要用的,token消息
- text:文本消息
- image:图片消息
- voice:语音消息
- video:视频消息
- location:位置消息
- link:链接消息
- event:事件消息
这些消息类型被定义在消息报文中,但是token消息比较特殊,所有的推送消息都作为事件消息进行推送。
Event消息(主要用于推送)类型:
- subscribe/unsubscribe:关注/取消关注事件
- scan:扫描带参数二维码事件
- location:上报地理位置事件
- click:自定义菜单事件
- view:点击菜单跳转链接时的事件
先看看关注时的消息报文:
1 <xml>
2 <ToUserName><![CDATA[toUser]]></ToUserName>
3 <FromUserName><![CDATA[FromUser]]></FromUserName>
4 <CreateTime>123456789</CreateTime>
5 <MsgType><![CDATA[event]]></MsgType>
6 <Event><![CDATA[subscribe]]></Event>
7 </xml>
这个是一个很标准的推送报文,其中,MsgType描述了消息的推送类型。Event描述了是那种事件。
微信的消息简单介绍完了,也算闲篇儿,下面进入正正题。
三、Token验证
token验证算是推送消息中比较特殊的一种,因为推送的消息中,并没有报文。也就是http请求中,没有body部分。token的信息是通过直接传参数post到指定url中去的。注意这里是post,是的,只有token消息是通过post传递的,其他消息是通过get方式传递的。
下面来看代码:
1 Map<String, String> params = req.getParams();
2 String[] sortKey = { TOKEN, params.get("timestamp"), params.get("nonce") };
3 Arrays.sort(sortKey);
4 StringBuffer sb = new StringBuffer();
5 for (String key : sortKey) {
6 sb.append(key);
7 }
8 String signature = params.get("signature");
9 if (signature.equals(CipherUtil.SHA1(sb.toString()))) {
10 return params.get("echostr");
11 }
12 return "";
第一行,从httpRequest中获取所有参数,因为这里使用我自己写的一套框架,所以第一行获取参数的方法参看servlet或者其他框架。
通过官方的文档可以看出:
加密/校验流程如下: 1. 将token、timestamp、nonce三个参数进行字典序排序 2. 将三个参数字符串拼接成一个字符串进行sha1加密 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
流程包括三个,首先排序,然后sha1,然后跟签名比对。
如果微信的sha1签名,与你自己计算出来的签名相同,验证通过,否则不通过。如果通过,返回echostr。
四、结束语
本节写到这里就结束,时间仓促,大家多多海涵。。
下次将简单介绍下消息的处理。