微信公众号
相信大家对微信公众号都不陌生,本文就从开发者角度,简单说说目前微信公众号的状况。
分为三个类型:订阅号、服务号、企业号,一旦选定不可以修改。
微信公众平台测试账号
我们直接申请测试账号,减少很多麻烦,很多权限也可以直接使用,不需要认证。
申请链接:微信公众平台接口测试帐号申请页
微信公众号交互模型
如下图,用户给公众号发送消息后,通过“微信后台”转发给“我们开发的服务”,“我们开发的后台”根据请求进行响应,返回给“微信后台”,微信后台再转发给我们的用户。
接入微信公众号
接入微信时,微信服务器将发送 GET 请求到填写的服务器地址 URL 上,GET 请求携带四个参数:
参数 | 描述 |
---|---|
signature | 微信加密签名,signature 结合了开发者填写的 token 参数和请求中的 timestamp 参数、nonce 参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者通过检验 signature 对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回 echostr 参数内容,则接入生效,成为开发者成功,否则接入失败。
验证服务器地址的有效性
此代码仅适用于明文传输模式1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// 接口代码 ,采用 SpringMVC 框架
"/weixin", method = RequestMethod.GET) (value =
public void renzheng(HttpServletRequest request, HttpServletResponse response) throws IOException {
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
PrintWriter out = response.getWriter();
// 判断该请求是否来源于微信
if (WeChatCheckUtil.checkSignature(signature, timestamp, nonce)) {
out.print(echostr);
}
}
具体的校验方法
1 | private static final String token = "aaaaaaaa"; |
填写服务器配置
目前微信接口配置时仅支持以 http:// 或 https:// 开头,分别支持 80 端口和 443 端口。
我们大多数人开发环境都没有公网 80 端口,本次采用解决的方法是 ngrok 局域网穿透。
采用 ngrok 局域网穿透
ngrok 的官网 是 https://ngrok.com/,服务器在国外。个人比较推荐国内的 http://ngrok.cc/,自己申请一个账号,按照教程自己配置就行了。如果还是遇到困难可以给我留言或者发邮件。
有经济实力的可以赞助一下作者。
配置接口信息
假设已经配置 ngrok 了,并启动。在微信公众平台接口测试帐号里面填入”接口配置信息”,URL 和 Token。
没有意外就会提示配置成功。
消息的接收和响应
当普通微信用户向公众账号发消息时,微信服务器将 POST 消息的 XML 数据包到开发者填写的 URL 上。
文本消息
微信中推送的一条普通的文本格式如下:1
2
3
4
5
6
7
8<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
Mavem 引入 xml 解析相关依赖
1 | <!--XML 解析--> |
消息工具类代码
1 | public class MessageUtil { |
封装了消息的基本类型,提供了对象转成 xml 方法,以及 xml 转成 Map 集合。
响应服务器的代码
1 | "/weixin", method = RequestMethod.POST) (value = |
这样就简单的实现了,发送什么回复什么了。
参考资料
- Ngrok 穿透利器(国内版)http://ngrok.cc/
- 微信开发者文档 http://mp.weixin.qq.com/wiki
- 微信公众平台接口测试帐号申请页 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
- 微信公众平台接口调试工具 https://mp.weixin.qq.com/debug
- 初识 Java 微信公众号开发 http://www.imooc.com/learn/368
- Java 微信公众号开发进阶 http://www.imooc.com/learn/401
- 微信公众号、企业号Java SDK https://github.com/chanjarster/weixin-java-tools