广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java实现微信公众号发送模版消息
  • 510
分享到

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

2024-04-02 19:04:59 510人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

微信公众号发送模版消息 背景:如下图,当用户发布需求的时候,公众号自定推送消息。例如:微信支付的时候,公众号会推送支付成功消息 前提:发送模版消息,顾名思义,前提就是需要有模版,那

微信公众号发送模版消息 背景:如下图,当用户发布需求的时候,公众号自定推送消息。例如:微信支付的时候,公众号会推送支付成功消息

在这里插入图片描述

前提:发送模版消息,顾名思义,前提就是需要有模版,那么在哪里配置模版呢?
微信公众号平台–>广告与服务–>模版消息–>我的模版
模版消息是已经申请过的模版,如果里面的模版都不符合自己业务的话,可以到模版库里找,然后添加到「我的模版」。也可以按照自己的需求申请新的模版,一般第二个工作日会审核通过。

在这里插入图片描述

在模版详情可以查看模版的格式,下图左边红框是消息最终展示的效果,
右边红框是需要传的参数。

在这里插入图片描述

有了模版之后,模版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 {

    
    private String msgid;

}

发送模版微信返回状态

@Data
public class ResultState implements Serializable {

    
    private int errcode;

    
    private String errmsg;

}

微信模版消息请求参数实体类

@Data
public class WxTemplateMsg {
    
    private String touser;
    
    private String template_id;
    
    private String url;

    // "miniprogram":{ 未加入
    // "appid":"xiaochengxuappid12345",
    // "pagepath":"index?foo=bar"
    // },

    
    private TreeMap<String, TreeMap<String, String>> data;

    
    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);
    }


 
    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 {
    
    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);
    }

    
    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实现微信公众号发送模版消息的文章就介绍到这了,更多相关Java微信公众号发消息内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java实现微信公众号发送模版消息

本文链接: https://www.lsjlt.com/news/138012.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java实现微信公众号发送模版消息
    微信公众号发送模版消息 背景:如下图,当用户发布需求的时候,公众号自定推送消息。例如:微信支付的时候,公众号会推送支付成功消息 前提:发送模版消息,顾名思义,前提就是需要有模版,那...
    99+
    2022-11-13
  • Java怎么实现微信公众号发送模版消息
    这篇文章主要介绍Java怎么实现微信公众号发送模版消息,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!微信公众号发送模版消息 背景:如下图,当用户发布需求的时候,公众号自定推送消息。例如:微信支付的时候,公众号会推送支...
    99+
    2023-06-29
  • 微信公众号发送模板消息
    一、登录微信公众号后台,开通模板消息功能,选择使用的模板消息或者申请新的模板消息,只有通过企业认证才能使用模板消息 模板消息申请下来后,保存模板消息Id,后续发送模板消息使用      二、接口权限 => 网页服务 => 网页授权 =...
    99+
    2023-09-05
    微信 服务器 运维 微信公众平台
  • java 实现微信公众号消息推送
    注册微信公众号 这里主要用测试账号来演示:测试账号注册地址正式账号注册地址:微信公众平台 设置消息模板 可参考微信公众号文档:微信公众号文档 模板根据需求设置(注意:参数长度不能超出微信规定,否则...
    99+
    2023-09-22
    java 微信 开发语言
  • 小程序发送订阅消息,微信公众号发送消息模板
    首先讲两个注意事项 小程序和微信公众号的用户openid是不同的。 小程序需要用户手动授权订阅消息通知(一次性订阅是订阅一次发一次,长期订阅可以多发)。 关于小程序和公众号AppID和AppSecret的获取可以自行百度一下,挺简单的。 小...
    99+
    2023-08-31
    小程序 php
  • 微信公众号开发消息推送功能
    目录微信公众号开发微信公众号简介注册微信公众号注册测试公众号搭建微信本地调试环境微信公众号接入(校验签名)给指定用户推送消息网页授权获取用户openid给指定用户发送模板信息微信公众...
    99+
    2023-02-15
    微信公众号开发消息推送 微信公众号开发
  • PHP调用微信公众号接口发送消息
    PHP调用微信公众号接口发送消息随着社交媒体的普及,微信成为了人们在生活和工作中经常使用的一种社交工具。而对于企业来说,利用微信公众号与用户进行互动已经成为了一种必备的营销手段。PHP作为一种广泛应用于Web开发的编程语言,也有着调用微信公...
    99+
    2023-05-21
    PHP 微信公众号接口 发送消息
  • java微信公众号服务号推送模板消息如何设置
    本篇内容主要讲解“java微信公众号服务号推送模板消息如何设置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java微信公众号服务号推送模板消息如何设置”吧!推送的模板消息示例如下 :设置模板消...
    99+
    2023-07-05
  • Android微信公众号开发消息推送功能怎么实现
    这篇文章主要讲解了“Android微信公众号开发消息推送功能怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android微信公众号开发消息推送功能怎么实现”吧!微信公众号简介微信公众...
    99+
    2023-07-05
  • 从零开始讲解Java微信公众号消息推送实现
    目录1.前期准备2.用户微信授权,获取其openId(重要)3.获取微信基础accessToken4. 调用微信模板方法发送消息总结1.前期准备 1. 首先需要的是一个能正常运营的微...
    99+
    2022-11-13
  • Java微信公众号发送消息-保姆级教程附源码
    目录 1. 概念说明: 2. 开发准备: 3. 测试demo(更改配置信息即可使用) 3.1. 服务器配置  3.1.1.配置填写说明 3.1.2.校验服务器有效性: 3.1.3.URL后端接口代码和校验代码(servlet)  3.1.4...
    99+
    2023-09-10
    微信
  • 微信公众号服务号推送模板消息设置方法(后端java)
    目录推送的模板消息示例如下 :设置模板消息编码1. 添加依赖2. SubscriptionMessageUtil.java3. 配置参数4. 使用微信测试号总结 模板消息文...
    99+
    2023-02-21
    服务号模板消息怎么用 公众号 模板消息 公众号消息推送
  • C#微信公众号开发之消息处理
    前言: 回顾上一节服务器配置的内容,我们已经可以自己完成公众号服务器的配置。配置完成之后,我们就可以通过调用的方式,完成对消息管理的处理。当用户关注公众号或者发送消息的时候,我们应该...
    99+
    2022-11-13
  • 在PHP中实现微信公众号新用户自动欢迎消息发送
    在今天的社交媒体时代,微信公众号已成为许多企业和个人建立在线品牌和社交媒体营销的重要手段。对于一个新用户来说,第一次关注公众号是一个重要的节点,也是建立一个良好关系的最佳时机。在这个时候,自动发送欢迎消息是十分重要的。在PHP中,通过一些简...
    99+
    2023-05-14
    PHP 微信公众号 自动消息发送
  • Java实现公众号功能、关注、消息推送
    Java实现公众号功能开发 文章目录 Java实现公众号功能开发描述引入依赖注册公众号配置公众号各事件处理实现公众号事件处理类实现公众号日志记录处理器实现公众号用户关注处理器实现公众号用户取消...
    99+
    2023-10-20
    java 微信公众平台
  • SpringBoot实现发送邮件、发送微信公众号推送功能
    目录SpringBoot实现发送邮件pom.xmlapplication.yml代码实现SpringBoot实现发送微信公众号推送pom.xml代码实现SpringBoot实现发送邮...
    99+
    2022-11-13
  • 详解nodejs微信公众号开发——3.封装消息响应模块
    上一篇文章:nodejs微信公众号开发(2)自动回复,实现了简单的关注回复。采用拼接字符串的形式,并不是很方便,这里我们将其封装承接口。 1. ejs模板引擎 不使用拼接字符串的方式,那么模板引擎就是较...
    99+
    2022-06-04
    详解 模块 公众
  • 微信公众号配置 Token 认证以及消息推送功能
    前言公众号服务配置 Token认证如何配置Token 认证接口 公众号获取网页授权及用户信息导向网页授权关注后消息触发授权 公众号推送模板消息模板消息功能插件推送模版消息接口介绍获...
    99+
    2023-10-04
    微信 java servlet
  • 如何利用python给微信公众号发消息实例代码
    现在通过发微信公众号信息来做消息通知和告警已经很普遍了。最常见的就是运维通过zabbix调用shell脚本给微信发消息,起到告警的作用。当要发送的信息较多,而且希望按照指定格式显示的...
    99+
    2022-11-13
  • SpringBoot如何实现发送邮件、发送微信公众号推送功能
    这篇文章主要介绍了SpringBoot如何实现发送邮件、发送微信公众号推送功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。SpringBoot实现发送邮件&emsp...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作