最近项目中有个功能,用户在下单支付成功后需要对微信提供服务通知。在网上找了资料结合自己实际应用,故写一篇博客记录一下操作。
微信官方API文档:https://developers.weixin.qq.com/miniprogram/dev/api/notice.html
注:需登录微信公众平台。
1,绑定消息推送
登录微信公众平台。
启动消息推送。
URL:用url访问文件名地址(这个我们指某个接口即可)
token:自己随便起个名字就行英文数字3-32个字符
EncodingAESKey(消息加密密匙):直接用服务器生成即可
消息加密方式:这里我选择的是兼容模式
2,设置消息模板
这里我设置的是“订单支付成功通知”,选用的是模板库中ID为AT0002的模板。添加三个关键字,下面是模板详细信息。
以上,关于微信公众平台设置完成。
3,获取接口调用凭证(access_token)
接口地址(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
{
"access_token": "12_1QmRzOe6at4sYB-UwRDxC2XI6zoOFQikcohs4U9HLE7fYQyFh1MjYDiTiRVRAl9e_ZlfbjrPqrrCUjQFMpn2UFZoTD8ykkHgKmmoco8yj2FALk2puNr9tQB57hIESCgAEAWKU",
"expires_in": 7200
}
注:目前access_token有效时长默认2个小时,访问接口一次access_token重置。
4,获取模板ID
这里获取模板ID有两种方式:
第一种:在微信公众平台中-模板消息中即可获得模板id
第二种:接口访问,以下是接口地址
https://api.weixin.qq.com/cgi-bin/wxopen/template/list?access_token=12_1QmRzOe6at4sYB-UwRDxC2XI6zoOFQikcohs4U9HLE7fYQyFh1MjYDiTiRVRAl9e_ZlfbjrPqrrCUjQFMpn2UFZoTD8ykkHgKmmoco8yj2FALk2puNr9tQB57hIESCgAEAWKU
返回信息:
{
"errcode": 0,
"errmsg": "ok",
"list": [
{
"template_id": "86FE7106Gfce1HLf7T45LCSkxlWdFcttSsqDALaeCxo",
"title": "订单发货提醒",
"content": "快递公司{{keyword1.DATA}}\n发货时间{{keyword2.DATA}}\n购买时间{{keyword3.DATA}}\n物品名称{{keyword4.DATA}}\n",
"example": "快递公司:TIT造舰快递\n发货时间:2016年8月9日\n购买时间:2016年8月8日\n物品名称:电风扇\n"
},
{
"template_id": "5JddhfNLDT0DYcKaroXC9drFPfNfiuo4nZKrkZFtFS0",
"title": "订单支付成功通知",
"content": "订单号码{{keyword1.DATA}}\n订单金额{{keyword2.DATA}}\n支付时间{{keyword3.DATA}}\n",
"example": "订单号码:123456789\n订单金额:200元\n支付时间:2104-12-09 16:00\n"
}
]
}
5,发送模板消息
接口地址:
6,后台代码实现
(1获取access_token
根据微信API文档返回信息,写一个对象来接收返回值
/*
* AccessToken 对象
*/
public class AccessToken {
// 获取到的凭证
private String access_token;
// 凭证有效时间,单位:秒
private Integer expires_in;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public Integer getExpires_in() {
return expires_in;
}
public void setExpires_in(Integer expires_in) {
this.expires_in = expires_in;
}
}
具体获取access_token代码实现:
/**
* 根据微信id,secret获取access_token
*
*/
public String getAccessToken() {
String tmpUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId
+ "&secret=" + appSecret + "";
CloseableHttpClient httpCilent = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(tmpUrl);
try {
HttpResponse httpResponse = httpCilent.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
String entity = EntityUtils.toString(httpResponse.getEntity());
AccessToken accessToken = JSONObject.parseObject(entity, AccessToken.class);
return accessToken.getAccess_token();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 释放资源
httpCilent.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return "";
}
2)发送消息模板
根据微信API文档返回模板信息,写一个对象来接收返回值
/**
* 模板返回消息
*
*/
public class ResultTemplateDate {
private String errcode;
private String errmsg;
public String getErrcode() {
return errcode;
}
public void setErrcode(String errcode) {
this.errcode = errcode;
}
public String getErrmsg() {
return errmsg;
}
public void setErrmsg(String errmsg) {
this.errmsg = errmsg;
}
}
具体业务代码实现
/**
* 发送微信消息模板
*
*/
public String sendTemplate(String touser, String formId, String templateId, String clickurl, String[] fillData) {
String tepUrl = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token="
+ getAccessToken();
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(tepUrl);
// 装配post请求参数
JSONObject json = new JSONObject();
json.put("touser", touser);
json.put("template_id", templateId);
json.put("form_id", formId);
json.put("emphasis_keyword", "keyword1.DATA");
JSONObject dataJson = new JSONObject();
for (int i = 0; i < fillData.length; i++) {
JSONObject sonDateJson = new JSONObject();
sonDateJson.put("value", fillData[i]);
dataJson.put("keyword" + (i + 1), sonDateJson);
}
json.put("data", dataJson);
String resultStr = "发送失败";
try {
StringEntity myEntity = new StringEntity(json.toJSONString(), ContentType.APPLICATION_JSON);
// 设置post求情参数
httpPost.setEntity(myEntity);
HttpResponse httpResponse = httpClient.execute(httpPost);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// 发送成功
String resutlEntity = EntityUtils.toString(httpResponse.getEntity());
ResultTemplateDate resultTemplateDate = JSONObject.parseObject(resutlEntity, ResultTemplateDate.class);
if (resultTemplateDate.getErrcode().equals("40037")) {
resultStr = "template_id不正确";
}
if (resultTemplateDate.getErrcode().equals("41028")) {
resultStr = "form_id不正确,或者过期";
}
if (resultTemplateDate.getErrcode().equals("41029")) {
resultStr = "form_id已被使用";
}
if (resultTemplateDate.getErrcode().equals("41030")) {
resultStr = "page不正确";
}
if (resultTemplateDate.getErrcode().equals("45009")) {
resultStr = "接口调用超过限额(目前默认每个帐号日调用限额为100万)";
}
resultStr = "ok";
return resultStr;
} else {
// 发送失败
return resultStr;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (httpClient != null) {
// 释放资源
httpClient.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return resultStr;
}
以上,关于对微信模板消息推送完成。