最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java微信公眾號(hào)模板消息推送功能實(shí)例代碼

 更新時(shí)間:2025年05月15日 08:30:15   作者:振宇i  
這篇文章主要介紹了Java微信公眾號(hào)模板消息推送功能的相關(guān)資料,包括了公眾號(hào)開(kāi)發(fā)者平臺(tái)的參數(shù)獲取、微信發(fā)送接口的實(shí)際調(diào)用、消息發(fā)送的util類(lèi)、示例模板以及接口調(diào)用的示例,需要的朋友可以參考下

一、公眾號(hào)開(kāi)發(fā)者平臺(tái)相關(guān)參數(shù)獲取

如下圖所示, 需要獲取:

開(kāi)發(fā)者ID(AppID)

開(kāi)發(fā)者密碼(AppSecret) 

二、官方發(fā)送接口

實(shí)際調(diào)用接口填下如下參數(shù)即可:

touser template_id data

三、消息發(fā)送util類(lèi)

import cn.hutool.json.JSON;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.apache.http.HttpEntity;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;

public class WeChatTemplateUtil {

    // 本地測(cè)試
    public static void main(String[] args) {
        String accessToken = "xxx";
        String touser = "xxx"; //openid
        String templateId = "xxxx";

        JSONObject body = new JSONObject();
        body.put("touser", touser);
        body.put("template_id", templateId);

        // 封裝消息體
        JSONObject data = new JSONObject();

        data.put("character_string2", new JSONObject().put("value","111"));
        data.put("thing3", new JSONObject().put("value","222"));
        data.put("amount5", new JSONObject().put("value", "333"));

        body.put("data", data);

        System.out.println("Request Body: " + body.toString());

        try {
            String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;
//            String response = sendPost(url, body.toString());
            String response = sendPostJsonStr(url, body.toString());
            System.out.println(response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 獲取微信token
     * grantType 寫(xiě)死的值,填client_credential即可
     * appId 微信開(kāi)發(fā)平臺(tái)里找
     * secret 微信開(kāi)發(fā)平臺(tái)里找
     * @return
     * @throws Exception
     */
    public static String getWeChatToken() throws Exception{

        String grantType = "client_credential"; //寫(xiě)死
        String appId = "123";
        String secret = "123";

        String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token";
        String params = "grant_type=" + grantType + "&appid=" + appId + "&secret=" + secret;
        String tokenResponse = WeChatHttpUtils.sendGet(tokenUrl, params);
        JSON parse = JSONUtil.parseObj(tokenResponse);
        return parse.getByPath("access_token").toString();
    }

    /**
     * 推送水費(fèi)欠費(fèi)模板提示消息
     * @param accessToken 微信token
     * @param touser 關(guān)注此公眾號(hào)的人員的openid
     * @param acccountNo 戶號(hào)
     * @param accountName 戶名
     * @param money 欠費(fèi)金額
     */
    public static void sendWeChatTemplateMessage(String accessToken, String touser, String acccountNo, String accountName, String money) {

        // 模板ID
        String templateId = "xxxx";

        JSONObject body = new JSONObject();
        body.put("touser", touser);
        body.put("template_id", templateId);

        // 封裝消息體
        JSONObject data = new JSONObject();

        data.put("character_string2", new JSONObject().put("value",acccountNo));
        data.put("thing3", new JSONObject().put("value",accountName));
        data.put("amount5", new JSONObject().put("value", money));

        body.put("data", data);

        try {
            String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;
            sendPostJsonStr(url, body.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 以jsonString形式發(fā)送HttpPost的Json請(qǐng)求,String形式返回響應(yīng)結(jié)果
     *
     * @param url
     * @param jsonString
     * @return
     */
    private static String sendPostJsonStr(String url, String jsonString) throws IOException {
        if (jsonString == null || jsonString.isEmpty()) {
            return sendPost(url);
        }
        String resp = "";
        StringEntity entityStr = new StringEntity(jsonString,
                ContentType.create("text/plain", "UTF-8"));
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(url);
        httpPost.setEntity(entityStr);
        CloseableHttpResponse response = null;
        try {
            response = httpClient.execute(httpPost);
            HttpEntity entity = response.getEntity();
            resp = EntityUtils.toString(entity, "UTF-8");
            EntityUtils.consume(entity);
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (response != null) {
                try {
                    response.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        if (resp == null || resp.equals("")) {
            return "";
        }
        return resp;
    }

    /**
     * 發(fā)送不帶參數(shù)的HttpPost請(qǐng)求
     *
     * @param url
     * @return
     */
    private static String sendPost(String url) throws IOException {
        // 1.獲得一個(gè)httpclient對(duì)象
        CloseableHttpClient httpclient = HttpClients.createDefault();
        // 2.生成一個(gè)post請(qǐng)求
        HttpPost httppost = new HttpPost(url);
        CloseableHttpResponse response = null;
        try {
            // 3.執(zhí)行g(shù)et請(qǐng)求并返回結(jié)果
            response = httpclient.execute(httppost);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 4.處理結(jié)果,這里將結(jié)果返回為字符串
        HttpEntity entity = response.getEntity();
        String result = null;
        try {
            result = EntityUtils.toString(entity);
        } catch (ParseException | IOException e) {
            e.printStackTrace();
        }
        return result;
    }

}

四、示例模板

如下圖所示, 模板中的變量名分別character_string2, thing3, amount5

所以三種的util的JSONObject中put的三個(gè)變量名一一對(duì)應(yīng),不能有錯(cuò)

五、接口調(diào)用示例

1、controller

    @PostMapping("/pushMessage")
    @Operation(summary = "微信公眾號(hào)推送消息")
    public CommonResult<Boolean> pushMessage() throws Exception {
        pushService.pushMessage();
        return success(true);
    }

2、service

    /**
     * 微信公眾號(hào)推送消息
     */
    void pushMessage() throws Exception;

3、serviceimpl

@Override
    public void pushMessage() throws Exception {
       
        // 獲取微信公眾號(hào)的token
        String weChatToken = WeChatTemplateUtil.getWeChatToken();

        // 推送消息(測(cè)試用)
        WeChatTemplateUtil.sendWeChatTemplateMessage(weChatToken, "openid", "accountNo", "accountName", "money");
    }

六、注意項(xiàng)

1、JSONObject包選擇

博主之前一直用的fastjson包引入的JSONObject, 但是

這一步操作的時(shí)候一直值放不進(jìn)去,一直為空

為空示例:

new JSONObject().put("value",acccountNo) 

不為空示例: 

JSONObject data = new JSONObject()

JSONObject acccountNo= new JSONObject()

acccountNo.put("value",acccountNo) 

data.put("acccountNo", acccountNo)

后面改用hutool的包引入JSONObject,

new JSONObject().put("value",acccountNo)  就可以直接成功put進(jìn)值

2、微信token接口

獲取微信的token接口次數(shù)每日上限2000次,所以如果要發(fā)送大量消息,請(qǐng)獲取一次access_token,然后批量調(diào)用發(fā)送接口,不要調(diào)一次發(fā)一次

3、發(fā)送失敗解決

請(qǐng)求接口的時(shí)候一定要把a(bǔ)ccess_token拼到url上,不要放入body中,不然調(diào)用會(huì)失敗

如果返回"errcode":47001,"errmsg":"data format error   則是因?yàn)榘l(fā)送的數(shù)據(jù)格式不對(duì)

但是即使格式對(duì)了,某些情況下依舊會(huì)返回如上錯(cuò)誤.  博主踩坑了一天后才發(fā)現(xiàn), 因?yàn)榘l(fā)送http的post請(qǐng)求如果構(gòu)建不對(duì)依舊會(huì)報(bào)47001!

所以建議報(bào)了47001后,先把請(qǐng)求的參數(shù)放到postman等工具中測(cè)試了, 排除掉不是自己數(shù)據(jù)體構(gòu)建得有問(wèn)題后, 再去排查自己的post請(qǐng)求代碼

7、建議

appid, template_id, sercet這些可以寫(xiě)在yml的配置項(xiàng)中, 靈活一點(diǎn)不建議寫(xiě)死

總結(jié)

到此這篇關(guān)于Java微信公眾號(hào)模板消息推送功能的文章就介紹到這了,更多相關(guān)Java微信公眾號(hào)模板消息推送內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 探討:使用httpClient在客戶端與服務(wù)器端傳輸對(duì)象參數(shù)的詳解

    探討:使用httpClient在客戶端與服務(wù)器端傳輸對(duì)象參數(shù)的詳解

    本篇文章是對(duì)使用httpClient在客戶端與服務(wù)器端傳輸對(duì)象參數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • Spring WebFlux之響應(yīng)式編程詳解

    Spring WebFlux之響應(yīng)式編程詳解

    這篇文章主要介紹了Spring WebFlux之響應(yīng)式編程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • SpringMVC中處理Ajax請(qǐng)求的示例

    SpringMVC中處理Ajax請(qǐng)求的示例

    本篇文章給大家介紹SpringMVC中處理Ajax請(qǐng)求的示例,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-11-11
  • Java中class和Class的區(qū)別示例詳解

    Java中class和Class的區(qū)別示例詳解

    class 是java的關(guān)鍵字,在聲明java類(lèi)時(shí)使用,Class是java JDK提供的一個(gè)類(lèi),完整路徑為java.lang.Class,下面這篇文章主要給大家介紹了關(guān)于Java中class和Class區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Java實(shí)現(xiàn)圖片比率縮放

    Java實(shí)現(xiàn)圖片比率縮放

    這篇文章主要為大家詳細(xì)介紹了Java通過(guò)Thumbnails實(shí)現(xiàn)圖片比率縮放,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 開(kāi)源的Java圖片處理庫(kù)實(shí)例詳解

    開(kāi)源的Java圖片處理庫(kù)實(shí)例詳解

    Java?圖片處理庫(kù)提供了豐富的功能,用于處理和增強(qiáng)圖像,在Java生態(tài)系統(tǒng)中,有幾個(gè)流行的開(kāi)源庫(kù)可以用于圖片處理,這些庫(kù)提供了豐富的功能,如圖像縮放、裁剪、顏色調(diào)整、格式轉(zhuǎn)換等,本文介紹開(kāi)源的Java圖片處理庫(kù)介紹,感興趣的朋友一起看看吧
    2024-03-03
  • SpringCloud Alibaba 基本開(kāi)發(fā)框架搭建過(guò)程

    SpringCloud Alibaba 基本開(kāi)發(fā)框架搭建過(guò)程

    這篇文章主要介紹了SpringCloud Alibaba 基本開(kāi)發(fā)框架搭建過(guò)程,開(kāi)發(fā)工具選用的idea,本文通過(guò)圖文實(shí)例相結(jié)合給大家分享搭建全過(guò)程,需要的朋友可以參考下
    2021-06-06
  • java父子節(jié)點(diǎn)parentid樹(shù)形結(jié)構(gòu)數(shù)據(jù)的規(guī)整

    java父子節(jié)點(diǎn)parentid樹(shù)形結(jié)構(gòu)數(shù)據(jù)的規(guī)整

    這篇文章主要介紹了java父子節(jié)點(diǎn)parentid樹(shù)形結(jié)構(gòu)數(shù)據(jù)的規(guī)整,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringBoot將logback替換成log4j2的操作步驟

    SpringBoot將logback替換成log4j2的操作步驟

    文章介紹了如何在SpringBoot項(xiàng)目中將默認(rèn)的日志框架logback替換為log4j2,以利用log4j2的高性能異步日志記錄特性,特別是通過(guò)Disruptor實(shí)現(xiàn)的無(wú)鎖化隊(duì)列,提高了日志處理速度,同時(shí),文章提供了詳細(xì)的配置步驟,需要的朋友可以參考下
    2024-10-10
  • Java內(nèi)存區(qū)域管理詳解

    Java內(nèi)存區(qū)域管理詳解

    這篇文章主要介紹了Java內(nèi)存區(qū)域管理詳解,文章通過(guò)圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09

最新評(píng)論

黑河市| 黎平县| 隆化县| 普定县| 静海县| 九江县| 岳池县| 青龙| 嘉禾县| 青神县| 尉犁县| 尼勒克县| 沙坪坝区| 丰台区| 阿鲁科尔沁旗| 奉贤区| 集安市| 辽宁省| 邢台市| 洛浦县| 曲水县| 岚皋县| 阳江市| 新建县| 大名县| 册亨县| 连云港市| 长丰县| 赣榆县| 宜兰市| 秦安县| 阳江市| 灵丘县| 瓮安县| 绥中县| 南澳县| 河东区| 新郑市| 富宁县| 东海县| 洞口县|