之前用nodejs编写了一些关于微信公众平台的实现,但是由于时间原因,没有很好的继续下去。。但是基于对新技术的渴望,nodejs版还将继续下去。。


废话不多说了先进入正题。。首先进入微信公众平台,注册,验证。。这里过程忽略。。

一、功能配置

进入“功能”,“高级功能”,“开发模式”,填写接入接口和token。。(由于伟大的企鹅更新速度实在是很快,因此,这里只是做最验证页面的图片说明,此链接路径是2014年5月版本)。

java pdf 微信公众平台 java微信公众平台开发_java pdf 微信公众平台

这里填入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。

四、结束语

本节写到这里就结束,时间仓促,大家多多海涵。。

下次将简单介绍下消息的处理。