關於java對接微信模板消息推送

 

最近項目中有個功能,用戶在下單支付成功後需要對微信提供服務通知。在網上找了資料結合自己實際應用,故寫一篇博客記錄一下操作。

微信官方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;
	}

以上,關於對微信模板消息推送完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章