日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

微信公众号发送模版消息 Java实现

發布時間:2023/12/9 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微信公众号发送模版消息 Java实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

微信公眾號發送模版消息

背景:

當用戶發布任務的時候,公眾號會自動推送消息通知。例如我們都熟悉的場景:微信支付的時候,公眾號會推送支付成功消息。

申請模版:

模版消息,顧名思義,就是有模版的消息,那么要模版干嘛呢?模版是從哪來呢?
發送消息需要有固定的格式,我們可以在微信公眾號平臺上配置模版。

微信公眾號平臺–>廣告與服務–>模版消息–>我的模版
「我的模版」列表里的是已經申請的模版,如果里面的模版格式都不符合自己業務,可以到模版庫里找,然后添加到「我的模版」。也可以按照自己的需求申請新的模版,一般第二個工作日會審核通過。

https://mp.weixin.qq.com/

打開模版詳情,查看模版的格式,下圖左邊紅框是消息最終展示的效果,
右邊紅框是需要傳的參數。

有了模版之后,模版ID就是我們要放進代碼里的,把模版ID復制出來。

發送模版消息接口文檔:

消息模版準備好之后,暫時不要寫代碼奧,查看微信開發文檔,看看發送模版都需要哪些參數。

微信開發文檔–>基礎消息能力–>模版消息接口–「發送模版消息」
https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html

微信開發文檔參數介紹

發送模版消息

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;/*** 消息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) {// 模版IDString 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();// 模版IDwxTemplateMsg.setTemplate_id(templateId);// openIdwxTemplateMsg.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 {// 獲取tokenString 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緩存中獲取tokenif (redisCacheManager.get(key) != null) {return (String) redisCacheManager.get(key);}// 獲取access_tokenString 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工具類

package com.demo.advertiser.common.utils;import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.cglib.beans.BeanMap;import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;@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工具類

package com.demo.advertiser.common.utils;import com.google.common.base.Splitter; import com.demo.advertiser.common.utils.component.HttpResult; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.entity.mime.content.StringBody; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.LaxRedirectStrategy; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URI; import java.net.URL; import java.net.URLDecoder; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;@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;} } package com.demo.advertiser.common.utils.component;public class HttpResult {private Integer status = 601;private String body = "";public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}public String getBody() {return body;}public void setBody(String body) {this.body = body;} }

總結

以上是生活随笔為你收集整理的微信公众号发送模版消息 Java实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 九九热九九爱 | 久久美女av | 久久综合亚洲 | av小说在线观看 | 黄色天堂 | 欧美一级全黄 | 日韩av在线第一页 | 日本高清免费视频 | 国产黄色片av | 在线免费观看欧美大片 | 亚洲精品456 | av啊啊| 五号特工组之偷天换月 | 在线视频播放大全 | 中文字幕在线精品 | 在线三区 | 国产福利小视频在线 | 高清中文字幕在线a片 | 伊人色在线 | 日韩免费小视频 | 国产成人久久精品流白浆 | 国产精品一线 | 天天搞天天搞 | 亚洲色图视频网站 | 国模精品视频一区二区 | 久久久久逼 | aa片在线观看视频在线播放 | 高h乱l高辣h文短篇h | 男人的天堂在线 | 4438全国成人免费 | 欧美偷拍亚洲 | 巨大乳の揉んで乳榨り奶水 | 性感美女在线 | 香蕉一级视频 | 国产情侣一区二区 | 韩国伦理在线视频 | 双性受孕h堵精大肚生子 | 91吃瓜在线 | 国产精品无圣光 | av男人的天堂在线观看 | 日日夜夜精品视频免费 | 欧美偷拍另类 | 男人添女人囗交视频 | www中文在线 | 婷婷日 | 亚洲专区欧美专区 | 日韩人妻精品中文字幕 | 超碰人人网| 天堂av8在线 | 日本精品在线 | 99免费观看视频 | 久久久国产精品x99av | 黄网在线播放 | 一区二区成人在线观看 | av网址网站 | 黄色一级在线视频 | 伊人超碰 | 青青草毛片 | 日韩在线观看视频一区二区 | 天降女子在线观看 | 久久久久久一级片 | 成人爱爱 | 中文字幕一区二区三区手机版 | 骚虎视频最新网址 | 亚洲成人资源 | 麻豆性生活 | 九九午夜 | 国产日韩av在线播放 | 人妻 日韩 欧美 综合 制服 | 天天艹日日艹 | 91视频一区 | 91入囗| 成人在线手机视频 | 日本无遮羞调教打屁股网站 | 欧美视频免费看欧美视频 | 疯狂少妇| 桃色视屏 | 蘑菇福利视频一区播放 | 日本免费高清一区二区 | 日日操av | 日韩av一区二区在线观看 | 日本欧美在线 | 国产网站黄色 | 99视频在线观看免费 | 国产伦精品一区二区三区在线 | 天天久久久 | 国产一区免费看 | 欧美插插视频 | 午夜一区二区三区在线观看 | 韩国三色电费2024免费吗怎么看 | 欧美人与禽性xxxxx杂性 | 亚洲国产日韩欧美在线观看 | 丰满少妇一级片 | 亚洲最新在线 | 女人十八岁毛片 | 欧美另类专区 | 国产成人精品视频 | 亚洲欧美激情一区二区三区 | 欧美伦理在线观看 |