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