您好,登錄后才能下訂單哦!
這篇文章主要介紹Java怎么實現微信公眾號發送模版消息,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
微信公眾號發送模版消息 背景:如下圖,當用戶發布需求的時候,公眾號自定推送消息。例如:微信支付的時候,公眾號會推送支付成功消息
前提:發送模版消息,顧名思義,前提就是需要有模版,那么在哪里配置模版呢?
微信公眾號平臺–>廣告與服務–>模版消息–>我的模版
模版消息是已經申請過的模版,如果里面的模版都不符合自己業務的話,可以到模版庫里找,然后添加到「我的模版」。也可以按照自己的需求申請新的模版,一般第二個工作日會審核通過。
在模版詳情可以查看模版的格式,下圖左邊紅框是消息最終展示的效果,
右邊紅框是需要傳的參數。
有了模版之后,模版ID就是我們要放進代碼里的,復制出來。
消息模版準備好之后,暫時不要寫代碼奧,查看微信開發文檔,看看發送模版都需要哪些參數。
微信開發文檔–>基礎消息能力–>模版消息接口–「發送模版消息」
查看微信開發文檔
發送模版消息
http請求方式: POST https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN注:url和miniprogram都是非必填字段,若都不傳則模板無跳轉;若都傳,會優先跳轉至小程序。開發者可根據實際需要選擇其中一種跳轉方式即可。當用戶的微信客戶端版本不支持跳小程序時,將會跳轉至url。
返回碼說明
在調用模板消息接口后,會返回JSON數據包。
正常時的返回JSON數據包示例:
{
“errcode”:0,
“errmsg”:“ok”,
“msgid”:200228332
}
發送模版所需參數:
模版ID和openId是必須有的,剩下的就是和自己業務有關了。
上面的內容都搞定之后,就可以開始擼代碼了
發送模版微信返回Dto
@Data public class TemplateMsgResultDto extends ResultState { /** * 消息id(發送模板消息) */ private String msgid; }
發送模版微信返回狀態
@Data public class ResultState implements Serializable { /** * 狀態 */ private int errcode; /** * 信息 */ private String errmsg; }
微信模版消息請求參數實體類
@Data public class WxTemplateMsg { /** * 接收者openId */ private String touser; /** * 模板ID */ private String template_id; /** * 模板跳轉鏈接 */ private String url; // "miniprogram":{ 未加入 // "appid":"xiaochengxuappid12345", // "pagepath":"index?foo=bar" // }, /** * data數據 */ private TreeMap<String, TreeMap<String, String>> data; /** * 參數 * * @param value 值 * @param color 顏色 可不填 * @return params */ public static TreeMap<String, String> item(String value, String color) { TreeMap<String, String> params = new TreeMap<String, String>(); params.put("value", value); params.put("color", color); return params; } }
Java封裝模版信息代碼
public TemplateMsgResultDto noticeTemplate(TemplateMsgVo templateMsgVo) { // 模版ID String templateId="XXX"; TreeMap<String, TreeMap<String, String>> params = new TreeMap<>(); //根據具體模板參數組裝 params.put("first", WxTemplateMsg.item("恭喜!您的需求已發布成功", "#000000")); params.put("keyword1", WxTemplateMsg.item(templateMsgVo.getTaskName(), "#000000")); params.put("keyword2", WxTemplateMsg.item("需求已發布", "#000000")); params.put("remark", WxTemplateMsg.item("請耐心等待審核", "#000000")); WxTemplateMsg wxTemplateMsg = new WxTemplateMsg(); // 模版ID wxTemplateMsg.setTemplate_id(templateId); // openId wxTemplateMsg.setTouser(templateMsgVo.getOpenId()); // 關鍵字賦值 wxTemplateMsg.setData(params); String data = JsonUtils.ObjectToString(wxTemplateMsg); return handleSendMsgLog(data); }
發送模版代碼
private TemplateMsgResultDto handleSendMsgLog(String data) { TemplateMsgResultDto resultDto = new TemplateMsgResultDto(); try { resultDto = sendTemplateMsg(data); } catch (Exception exception) { log.error("發送模版失敗", exception); } // TODO 可以記錄一下發送記錄的日志 return resultDto; } public TemplateMsgResultDto sendTemplateMsg(String data) throws Exception { // 獲取token String accessToken = getAccessToken(); // 發送消息 HttpResult httpResult = HttpUtils.stringPostJson(ConstantsPath.SEND_MESSAGE_TEMPLATE_URL + accessToken, data); return IMJsonUtils.getObject(httpResult.getBody(), TemplateMsgResultDto.class); } /** * 獲取全局token */ public String getAccessToken() { String key = ConstantsRedisKey.ADV_WX_ACCESS_TOKEN; // 從redis緩存中獲取token if (redisCacheManager.get(key) != null) { return (String) redisCacheManager.get(key); } // 獲取access_token String url = String.format(ConstantsPath.WX_ACCESS_TOKEN_URL, appid, secret); ResponseEntity<String> result = restTemplate.getForEntity(url, String.class); if (result.getStatusCode() == HttpStatus.OK) { JSONObject jsonObject = JSON.parseObject(result.getBody()); String accessToken = jsonObject.getString("access_token"); // Long expires_in = jsonObject.getLong("expires_in"); redisCacheManager.set(key, accessToken, 1800); return accessToken; } return null; }
微信地址常量類
public class ConstantsPath { /** * 微信公眾號獲取全局token */ public static final String WX_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"; /** * 微信發送模版消息 */ public static final String SEND_MESSAGE_TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="; }
Json工具類
@Slf4j public class JsonUtils { private static ObjectMapper json; static { json = new ObjectMapper(); json.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); json.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } /** * 序列化為JSON字符串 */ public static String ObjectToString(Object object) { try { return (json.writeValueAsString(object)); } catch (Exception e) { log.error("序列化為JSON字符串出錯",e); } return null; } public static <T> T getObject(String jsonString, Class<T> clazz) { if (StringUtils.isEmpty(jsonString)) return null; try { return json.readValue(jsonString, clazz); } catch (Exception e) { log.error("將JSON字符串轉化為Map出錯",e); return null; } } }
Http工具類
@Component @Slf4j public class HttpUtils { private static String sourcePath; public static HttpResult stringPostJson(String path, String content) throws Exception{ return stringPost(path, null, content, "utf-8", "utf-8", "application/json"); } public static HttpResult stringPost(String path, Map<String,String> headerMap, String content, String contentencode, String encode, String contentType) throws Exception{ StringEntity entity = new StringEntity(content, contentencode); entity.setContentType(contentType); return post(path, headerMap, entity, encode); } private static HttpResult post(String path, Map<String,String> headerMap, HttpEntity entity, String encode){ HttpResult httpResult = new HttpResult(); CloseableHttpClient httpClient = null; CloseableHttpResponse response = null; try{ HttpPost httpPost = new HttpPost(getURI(path)); LaxRedirectStrategy redirectStrategy = new LaxRedirectStrategy(); httpClient = HttpClientBuilder.create().setRedirectStrategy(redirectStrategy).build(); RequestConfig requestConfig = RequestConfig.custom() .setSocketTimeout(120000) .setConnectTimeout(120000) .setConnectionRequestTimeout(120000) .setCircularRedirectsAllowed(true) .setRedirectsEnabled(true) .setMaxRedirects(5) .build(); httpPost.setConfig(requestConfig); httpPost.setHeader("User-Agent", header); if(headerMap != null && headerMap.size() > 0){ for(String name:headerMap.keySet()) { httpPost.addHeader(name, headerMap.get(name)); } } httpPost.setEntity(entity); response = httpClient.execute(httpPost); httpResult.setStatus(response.getStatusLine().getStatusCode()); if(httpResult.getStatus() == 200){ HttpEntity resEntity = response.getEntity(); httpResult.setBody(EntityUtils.toString(resEntity, encode)); } }catch(Exception ex){ log.error("post請求出錯", ex); }finally{ try{ if(response != null){ response.close(); } if(httpClient != null){ httpClient.close(); } }catch(Exception ex) { log.error("post請求關閉資源出錯", ex); } } return httpResult; } }
以上是“Java怎么實現微信公眾號發送模版消息”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。