微信公众号开发时的一些笔记,防止忘记
公众号类型
- 服务号
- 订阅号
- 企业号
区别可以看公众平台服务号、订阅号、企业微信、小程序的相关说明
开发模式与编辑模式
微信公众号有两种模式:
- 开发模式
- 编辑模式
两者是互斥的,开启了开发模式,就不能使用编辑模式的功能,开启了编辑模式就不能使用开发模式的功能。作为开发人员,编辑模式用不着,都是使用开发模式
数据流向
在数据的流动过程中,涉及三个角色:
- 用户
- 微信服务器
- 开发者服务器
数据在这三个角色之间流动。一张图来说明
- 用户在微信的手机客户端向公众号发送一条消息,这条消息会发送到微信服务器
- 微信服务器接收到这条消息之后,再把它转发到开发者的服务器
- 开发者服务器根据消息内容,执行一些业务逻辑,然后生成一条回复消息再发送到微信服务器
- 微信服务器收到了回复消息,再返回给用户的手机
外网映射工具
为了开发时方便调试,需要一个外网映射工具,把微信服务器的请求转发到自己的开发电脑上,这样就可以方便地调试代码了
工具目前推荐使用natapp,官网有一个一分钟快速使用教程可以看,看了就会用了
公众平台测试账号
如果没有公众号的话,可以申请一个测试用的公众号,这个公众号的权限是最全的,什么功能都能用
文档看这里:微信公众平台技术文档-开始开发-接口测试号申请
开发模式接入
在微信公众平台技术文档-开发开发-接入指南有具体说明
在配置的时候,微信服务器会发送一个 HTTP GET 请求到我们的服务器,携带 4 个参数
参数 | 描述 |
---|---|
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
需要对这些参数进行校验,步骤如下:
token
、timestamp
、nonce
进行字典排序得到一个字符串- 再把字符串进行 SHA1 加密得到一个新的字符串
- 判断新的字符串和
signature
是否相等。如果相等,说明这个请求是来自微信服务器的请求,不是非法请求,于是把echostr
原样返回
验证参数合法性的的工具类
1 | import org.apache.commons.codec.digest.DigestUtils; |
SpringMVC 的 Controler 层
1 |
|
接收用户消息
当用户发送消息到微信服务器时,微信服务器会使用 HTTP POST 转发消息到我们的服务器,URL 和“接入微信服务器”中配置的 URL 时一样的,只是 HTTP 请求方法从 GET 变成了 POST
目前可以接收的用户消息有:
- 文本消息
- 图片消息
- 语音消息
- 视频消息
- 小视频消息
- 地理位置消息
- 链接消息
可以看这篇文档微信公众平台技术文档-消息管理-接收普通消息
回复用户消息
用户发来消息,我们的服务器就需要回复消息,目前可以回复的消息有:
- 文本消息
- 图片消息
- 语音消息
- 视频消息
- 音乐消息
- 图文消息
可以看这篇文档微信公众平台技术文档-消息管理-被动回复用户消息
一个接收用户文字消息并原样返回的例子
用户给公众号发送一条“Hello”的文字,公众号回复“我收到了你的消息:Hello”
微信服务器会把用户发送的消息使用 HTTP POST 的方式转发到开发者的服务器,所以 Controller 层监听一下 POST 请求就行。同时不要忘了对请求进行合法性验证
1 |
|
接受到了微信服务器转发的消息,于是对这条消息解析,然后做一些业务逻辑,最后再返回消息。业务逻辑根据不同的场景有不同的实现,要做的工作是:
- 消息解析
- 封装返回的消息
微信服务器传过来的消息都是 XML 格式,公众号服务器传回去的消息也是 XML 格式。用户发送一条文字消息是,微信服务器会发过来一条这样的消息
1 | <xml> |
可以以此写一个 Jave Bean
1 | public class TextMessage { |
借助 dom4j 实现消息解析
1 | public class MessageUtil { |
返回的消息,微信也有格式要求,比如
1 | <xml> |
借助 xtream 实现一个消息封装
1 | public class MessageUtil { |
现在就可以写 Controller 层的代码了
1 | "application/xml;charset=UTF-8") (produces = |
要注意的是 ToUserName
、FromUserName
接收和发送时,两者是相反的
接收事件推送
用户和公众号交互时,会产生一些事件,比如用户关注了这公众号,微信服务器就会发送一个消息到我们的服务器;用户对公众号取消关注,微信服务器也会发送一个消息到我们的服务器
目前会推送的事件有:
- 关注/取消关注事件
- 扫描带参数二维码事件
- 上报地理位置事件
- 自定义菜单事件
- 点击菜单拉取消息时的事件推送
- 点击菜单跳转链接时的事件推送
可以看这篇文档微信公众平台技术文档-消息管理-接收事件推送
获取access_token
公众号服务器要想主动调用微信的服务器的话,先要获取到 access_token (接口访问凭证)才能调用。因为每时每刻都有请求在调用微信服务器,微信服务器通过 access_token 才能判断这个请求是哪一个公众号发来的请求。同时为了安全,access_token 有时间限制,一般是 7200 秒,超过了这个时间,access_token 就失效了
可以看这篇文档微信公众平台技术文档-开始开发-获取access_token
可以利用一个定时任务来获取 access_token,然后把获取到的 access_token 保存到内存或者数据库中
1 |
|
不要忘了在启动类加上 @EnableScheduling
注解开启定时任务
自定义菜单
文档看这里:微信公众平台技术文档-自定义菜单
个数限制
菜单最多 2 级。一级菜单最多 3 个,二级菜单最多 5 个
类型
目前支持 3 种类型的菜单:
- view:网页类型
- click:点击类型
- miniprogram:小程序类型
用户点击 view 类型的菜单,会调用微信内置的浏览器打开指定的网页。点击 click 类型的菜单,微信会把菜单的 key 值传给开发者服务器,开发者根据 key 值做操作并返回数据。点击 miniprogram 类型的菜单,会打开指定的小程序页面