最近项目中有个功能,用户在下单支付成功后须要对微信提供服务通知。在网上找了资料结合本身实际应用,故写一篇博客记录一下操做。html
微信官方API文档:https://developers.weixin.qq.com/miniprogram/dev/api/notice.htmljava
注:需登陆微信公众平台。json
1,绑定消息推送api
登陆微信公众平台。服务器
启动消息推送。微信
URL:用url访问文件名地址(这个咱们指某个接口便可)app
token:本身随便起个名字就行英文数字3-32个字符微信公众平台
EncodingAESKey(消息加密密匙):直接用服务器生成便可post
消息加密方式:这里我选择的是兼容模式this
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; }
以上,关于对微信模板消息推送完成。