广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >java 实现微信公众号消息推送
  • 901
分享到

java 实现微信公众号消息推送

java微信开发语言 2023-09-22 08:09:08 901人浏览 八月长安
摘要

注册微信公众号 这里主要用测试账号来演示:测试账号注册地址正式账号注册地址:微信公众平台 设置消息模板 可参考微信公众号文档:微信公众号文档 模板根据需求设置(注意:参数长度不能超出微信规定,否则

注册微信公众号

设置消息模板

模板根据需求设置(注意:参数长度不能超出微信规定,否则将发送失败)

在这里插入图片描述
参数要求规则
在这里插入图片描述

java代码

依赖

<dependency>    <groupId>com.alibabagroupId>    <artifactId>fastJSONartifactId>    <version>1.2.54version>dependency><dependency>   <groupId>cn.hutoolgroupId>    <artifactId>hutool-allartifactId>    <version>4.5.6version>dependency><dependency>    <groupId>org.apache.HttpcomponentsgroupId>    <artifactId>httpclientartifactId>    <version>4.5version>dependency><dependency>    <groupId>org.apache.httpcomponentsgroupId>    <artifactId>httpcoreartifactId>    <version>4.4.1version>dependency><dependency>    <groupId>commons-httpclientgroupId>    <artifactId>commons-httpclientartifactId>    <version>3.1version>dependency>

请求地址、appid、密钥等信息;信息配置到application配置中,方便统一管理;

package com.andon.wxPush.conf;import lombok.Data;import org.springframework.stereotype.Service;import org.springframework.beans.factory.annotation.Value;@Service("wxConfiguration")@Datapublic class WxConfiguration {    //获取微信access_token请求地址    @Value("${wxConfig.url.WX_ACCESS_TOKEN_URL}")    private String wxAccessTokenUrl;    //发送微信公众号模板消息请求地址    @Value("${wxConfig.url.SEND_MESSAGE_TEMPLATE_URL}")    private String sendMessageTemplateUrl;    //小程序唯一凭证,即 AppID    @Value("${wxConfig.appid}")    private String appId;    //小程序唯一凭证密钥,即 AppSecret    @Value("${wxConfig.secret}")    private String secret;    //模板id    @Value("${wxConfig.templateId}")    private String templateId;}

发送请求工具类

package com.andon.wxPush.utils;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.andon.wxPush.template.HttpResult;import com.Google.common.base.Splitter;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.HttpResponse;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.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClientBuilder;import org.apache.http.impl.client.HttpClients;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 java.io.IOException;import java.util.Map;import static org.apache.Tomcat.util.file.ConfigFileLoader.getURI;@Component@Slf4jpublic class HttpUtils {    public HttpResult stringPostJson(String path, String content) throws Exception{        return stringPost(path, null, content, "utf-8", "utf-8", "application/json");    }    public 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 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;    }    public JSONObject stringGetJson(String url) {        JSONObject jsonObject = null;        //通过HttpClients.createDefault()获取到CloseableHttpClient对象        CloseableHttpClient httpclient = HttpClients.createDefault();        //创建HttpGet 对象,参数为请求的地址        HttpGet method = new HttpGet(url);        try {            //执行方法请求接口得到响应            HttpResponse response = httpclient.execute(method);            //解析响应数据            String content = EntityUtils.toString(response.getEntity(), "UTF-8");            //转为json格式            jsonObject = JSON.parseObject(content);            EntityUtils.consume(response.getEntity());//完全消耗        } catch (Exception e) {            log.error("get请求出错", e);            e.printStackTrace();        } finally {            try {                //释放连接                method.releaseConnection();                httpclient.close();            } catch (IOException e) {                e.printStackTrace();            }        }        return jsonObject;    }}

json处理工具类

package com.andon.wxPush.utils;import com.fasterxml.jackson.databind.DeserializationFeature;import com.fasterxml.jackson.databind.ObjectMapper;import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import java.text.SimpleDateFormat;@Slf4jpublic 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;        }    }}

消息模板

package com.andon.wxPush.template;import lombok.Data;import java.util.Map;import java.util.TreeMap;@Datapublic class WxSendMessageTemplate {        private String touser;        private String template_id;        private String url;        private Map<String,String> miniprogram;        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;    }}

结果模板

package com.andon.wxPush.template;import lombok.Data;@Datapublic class HttpResult {    private Integer status = 601;    private String body;}

消息推送

package com.andon.wxPush.service.impl;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.andon.util.DateUtil;import com.andon.wxPush.conf.WxConfiguration;import com.andon.wxPush.service.WxSendMsgService;import com.andon.wxPush.template.HttpResult;import com.andon.wxPush.template.WxSendMessageTemplate;import com.andon.wxPush.utils.HttpUtils;import com.andon.wxPush.utils.JsonUtils;import com.google.common.collect.Maps;import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang.StringUtils;import org.springframework.beans.factory.annotation.Value;import org.springframework.http.httpstatus;import org.springframework.http.ResponseEntity;import org.springframework.stereotype.Service;import javax.annotation.Resource;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.text.SimpleDateFormat;import java.time.LocalDate;import java.util.Date;import java.util.Map;import java.util.TreeMap;@Service@Slf4jpublic class WxSendMsgServiceImpl implements WxSendMsgService {    //凭证有效时间    private static final String KEY_EXPIRES_IN = "expiresIn";    //    private static final String KEY_TOKEN = "accessToken";    //拼接缓存前缀    private static final String ACCESS_TOKEN_KEY_PREFIX = "AccessToken_";    @Resource    private WxConfiguration wxConfiguration;    @Resource    private HttpUtils httpUtils;        private static Map<String, Map<String, Object>> accessTokenMap = Maps.newConcurrentMap();        @Override    public JSONObject noticeTemplate(JSONObject templateMsg) {        // 模版ID        String templateId = wxConfiguration.getTemplateId();        TreeMap<String, TreeMap<String, String>> params = new TreeMap<>();        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        //微信公众号根据具体模板参数组        params.put("keyWord4", WxSendMessageTemplate.item(sdf.format(new Date()), "#000000")); //告警时间        params.put("keyword3", WxSendMessageTemplate.item(templateMsg.getString("andonName"), "#000000"));    //报警类型        params.put("keyword1", WxSendMessageTemplate.item(templateMsg.getString("equipmentName"), "#000000"));     //设备名称        params.put("keyword2", WxSendMessageTemplate.item(templateMsg.getString("installPlace"), "#000000"));     //设备位置        params.put("first", WxSendMessageTemplate.item(templateMsg.getString("andonContent"), "#000000"));     //告警内容        WxSendMessageTemplate wxTemplateMsg = new WxSendMessageTemplate();        // 模版ID        wxTemplateMsg.setTemplate_id(templateId);        // openId        wxTemplateMsg.setTouser(templateMsg.getString("openId"));        // 关键字赋值        wxTemplateMsg.setData(params);        String data = JsonUtils.ObjectToString(wxTemplateMsg);        System.out.println(data);        return this.handleSendMsgLog(data);    }    //捕获异常    private JSONObject handleSendMsgLog(String data) {        JSONObject resultDto = new JSONObject();        try {            resultDto = this.sendTemplateMsg(data);            System.out.println("handleSendMsgLog:" + resultDto.toJSONString());        } catch (Exception exception) {            log.error("发送微信模版失败",  exception);        }        // TODO 可以记录一下发送记录的日志        return resultDto;    }    //发送模板    public JSONObject sendTemplateMsg(String data) throws Exception {        // 获取token        JSONObject accessTokenRes = this.getAccessToken();        String accessToken = accessTokenRes.getString("access_token");        // 发送消息        HttpResult httpResult = null;        try {            httpResult = httpUtils.stringPostJson(wxConfiguration.getSendMessageTemplateUrl() + accessToken, data);        } catch (Exception e) {            e.printStackTrace();        }        return JSON.parseObject(httpResult.getBody());    }        public JSONObject getAccessToken() {        //拼接获取缓存key        String key = ACCESS_TOKEN_KEY_PREFIX.concat(wxConfiguration.getAppId()).concat(wxConfiguration.getSecret());        Map<String, Object> accessTokenJson = accessTokenMap.get(key);        if (accessTokenJson != null) {            long expiresIn = (Long) accessTokenJson.get(KEY_EXPIRES_IN);            if (System.currentTimeMillis() < expiresIn) {                return (JSONObject) accessTokenJson.get(KEY_TOKEN);            }            accessTokenMap.remove(key);        }        synchronized (this) {            accessTokenJson = accessTokenMap.get(key);            // 多线程环境下,其他线程可能已经获得最新corpAccessToken,直接返回            if (accessTokenJson != null) {                return (JSONObject) accessTokenJson.get(KEY_TOKEN);            }            String url = String.format(wxConfiguration.getWxAccessTokenUrl(), wxConfiguration.getAppId(), wxConfiguration.getSecret());            JSONObject resJson = httpUtils.stringGetJson(url);            if (resJson != null && StringUtils.isNotEmpty(resJson.getString("access_token"))) {                accessTokenJson = this.seAccessToken(resJson);            }            if (accessTokenJson == null) {                try {                    throw new Exception();                } catch (Exception e) {                    log.error("设置access_token缓存失败");                    e.printStackTrace();                }            }            //放入缓存中            accessTokenMap.put(key, accessTokenJson);            JSONObject accessTokenJsonRes = (JSONObject) accessTokenJson.get(KEY_TOKEN);            if (accessTokenJsonRes == null) {                try {                    throw new Exception();                } catch (Exception e) {                    log.error("获取access_token错误");                    e.printStackTrace();                }            }            return accessTokenJsonRes;        }    }    //设置access_token    private Map<String, Object> seAccessToken(JSONObject jsonObject) {        Map<String, Object> token = Maps.newHashMap();        // 减去3分钟,以免过时        token.put(KEY_EXPIRES_IN, (jsonObject.getLongValue("expires_in") - 3 * 60) * 1000 + System.currentTimeMillis());        token.put(KEY_TOKEN, jsonObject);        return token;    }}

效果

发送测试
在这里插入图片描述
微信公众号接收效果
在这里插入图片描述

来源地址:https://blog.csdn.net/weixin_45956838/article/details/129925772

--结束END--

本文标题: java 实现微信公众号消息推送

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

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

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

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

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

  • 微信公众号

  • 商务合作