最近項目中有個功能,用戶在下單支付成功後需要對微信提供服務通知。在網上找了資料結合自己實際應用,故寫一篇博客記錄一下操作。
微信官方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;
}
以上,關於對微信模板消息推送完成。