微信公众平台开发-java
微信公众平台是运营者通过公众号为微信用户提供资讯和服务的平台,首先我们登录微信公众平台,通过其后台可以设置一些基础服务,如菜单设置、消息自动回复,但由于企业服务具有复杂性。通过微信公众平台后台设置一般无法满足自己的业务需求。所以,我们需要通过自己的服务器灵活的去控制微信服务。
在开发之前有个概念我们要弄清楚,微信用户属于微信公众平台(腾讯公司),我们无法直接与用户进行直接交互,我们的微信用户与我们的服务器(我们公司用的是阿里云)之间永远隔着一层微信公众平台服务器。在开发中我们是通过与微信公众平台之间的交互来控制微信公众平台与用户之间交互。
我们与微信公众平台会话方式有两种:
1、公众号消息会话(后端开发)
1). 接收微信推送的交易报文(需要在微信公众平台后台设置我们自己的服务器地址)
2). 调用微信接口发送请求
2、公众号内网页(前端开发)
1). 微信授权(获取用户基本信息)
2). 微信JS-SDK(微信分享、上传图片、拍照)
重要参数说明:
AppID:微信公众号标识,可在微信后台查看;
access_token:公众平台以access_token为接口调用凭据,所有接口的调用需要先获取access_token,它是通过AppID(唯一凭证)和AppSecret(唯一凭证**)获取,access_token在2小时内有效,过期需要重新获取,但1天内获取次数有限,开发者需自行存储。我们需要有中控服务器去主动刷新access_token并进行缓存。(AppID和AppSecret可以在微信公众平台基本配置里面查看)
OpenID:微信公众号用户唯一标识,与 AppID是多对一的关系。在微信公众平台后台设置好我们自己的服务器地址后,用户与公众号的每次交易,公众号服务器都会把OpendID发送过来。
在微信开发服务架构设计中 应该把微信服务分为核心接口层、服务接口层、控制中心。核心接口要绝对稳定,要脱离与业务的耦合度;业务接口层调用核心接口层给用户提供服务。控制中心负责调用核心接口层刷新数据到缓存服务供业务接口层使用。请参考下图
今天,我们先不讲页面相关的东西
1:接收微信推送的交易报文
我们先实现第一种(接收微信推送的报文) ,首先我们要在微信公众平台设置我们的服务器地址(要不然我们到哪里去讨http报文啊);
配置步骤请见官方文档
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319
配置的这个地址请注意一下,由于微信要往这个地址推送交易报文之前要进行服务器校验
服务器验证的时候发送的get请求
推送交易报文时发送的是post请求
我们要根据请求类型来分别处理。
这样,当验证通过以后。用户的一举一动微信公众平台都会推送相应的报文到我们的服务器上,你可以在你的微信公众号随便玩几下,发送一些信息,你可以在后台看到响应的信息。
一般我们对这步的处理是 :
1.先保存所有的交易日志
2.然后根据报文进行异步处理(例如通过消息队列保存OpenID,同步影响消息回复速度哦)
3.最后有选择性的进行消息回复 (例如判断是关注事件回复消息【你好,欢迎关注!】)
接收消息又分为两种:
普通消息:文本消息、图片消息、语音消息、视频消息 ...
事件消息:关注、取消关注、自定义菜单事件 ...
消息回复:
普通消息:文本消息、图片消息、语音消息、视频消息 ...
这里的消息接收与回复是多对多的关系 : 接收文本消息 可以回复 图片消息 、接收 关注事件可以回复文本消息
示例报文
文本消息:<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>
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | text |
Content | 文本消息内容 |
MsgId | 消息id,64位整型 |
回复文本消息:
<xml> <ToUserName>< ![CDATA[toUser] ]></ToUserName> <FromUserName>< ![CDATA[fromUser] ]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType>< ![CDATA[text] ]></MsgType> <Content>< ![CDATA[你好] ]></Content> </xml>
参数 | 是否必须 | 描述 |
---|---|---|
ToUserName | 是 | 接收方帐号(收到的OpenID) |
FromUserName | 是 | 开发者微信号 |
CreateTime | 是 | 消息创建时间 (整型) |
MsgType | 是 | text |
Content | 是 | 回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示) |
所有的报文里都有OpenID,这里我们一般在回复消息的同时,要对接受到报文做消息做异步处理,来抓取用户的OpenID。
这里举两个典型例子
1. 获取access_token
2. 发送模板消息
前面已经讲到access_token是所有接口的通行证,所以先获取access_token(这个注意要在控制中心获取,并放到缓存中。
),并且微信业务服务器发现access_token失效,要有刷新access_token缓存的功能。
1.获取access_token
https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
参数 | 是否必须 | 说明 |
---|---|---|
grant_type | 是 | 获取access_token填写client_credential |
appid | 是 | 第三方用户唯一凭证 |
secret | 是 | 第三方用户唯一凭证**,即appsecret |
2.发送模板消息
这步需要你先到缓存中去获取access_token,然后还记得在第一步【接收微信推送的交易报文】获取的OpenID吗,现在派上用场了,你终于可以对这个客户形成特殊的服务了。
http请求方式: POST
https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN
POST数据示例如下:
{
"touser":"OPENID",
"template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
"url":"http://weixin.qq.com/download",
"miniprogram":{
"appid":"xiaochengxuappid12345",
"pagepath":"index?foo=bar"
},
"data":{
"first": {
"value":"恭喜你购买成功!",
"color":"#173177"
},
"keyword1":{
"value":"巧克力",
"color":"#173177"
},
"keyword2": {
"value":"39.8元",
"color":"#173177"
},
"keyword3": {
"value":"2014年9月22日",
"color":"#173177"
},
"remark":{
"value":"欢迎再次购买!",
"color":"#173177"
}
}
}
参数说明
参数 | 是否必填 | 说明 |
---|---|---|
touser | 是 | 接收者openid |
template_id | 是 | 模板ID |
url | 否 | 模板跳转链接 |
miniprogram | 否 | 跳小程序所需数据,不需跳小程序可不用传该数据 |
appid | 是 | 所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系) |
pagepath | 否 | 所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar) |
data | 是 | 模板数据 |
color | 否 | 模板内容字体颜色,不填默认为黑色 |
欣赏一下效果
至此,希望你已经了解微信后台相关开发。
本章内容结合自身实战经验编写,理念为主。