java向微信公众号---发送模板和图文消息

article/2025/10/1 18:37:36

微信公众号初次开发

      • 其他操作
  • 项目搭建
    • maven
    • application.yml
    • yml参数配置
    • 微信客户端配置
  • 搭建完成 实现业务
    • 模板消息推送
      • 准备工作
        • 模板消息填写要求
        • 图文消息填写要求
      • 推送模板消息
        • 推送模板消息结果——效果
      • 推送图文消息
        • 推送图文消息工具类
        • 问题和结果
    • 获取关注的用户openId
      • 既然有了openId集合和要发送的消息怎么群发

其他操作

书接上文:微信测试号申请步骤和调试.
书接下文:后台获取授权用户的openId.

项目搭建

maven

<dependencies><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.13</version></dependency><dependency><groupId>org.jolokia</groupId><artifactId>jolokia-core</artifactId><version>1.6.0</version></dependency><dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version></dependency><dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-mp</artifactId><version>3.6.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.16</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.61</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.8.1</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-autoconfigure</artifactId><version>1.3.2</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><version>3.1.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.7.0</version></dependency><dependency><groupId>javax.persistence</groupId><artifactId>persistence-api</artifactId><version>1.0</version></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.9</version></dependency></dependencies>

application.yml

###################  项目启动端口  ###################
server:port: 80# 微信公众号配置
wx:#微信公众号APPIDappid: 123#微信公众号SECRETsecret: 123#微信公众号模板IDtemplateId: 123

yml参数配置


import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** 微信参数**/
@Data
@Component
@ConfigurationProperties(prefix = "wx")
public class WxMpProperties {/*** 公众号appId*/private String appId;/*** 公众号appSecret*/private String secret;/*** 公众号模板ID*/private String templateId;
}

微信客户端配置


import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import me.chanjar.weixin.mp.config.WxMpConfigStorage;
import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 微信配置**/
@Configuration
public class WxConfig {@AutowiredWxMpProperties wxMpProperties;/*** 构造注入** @param wxMpProperties*/WxConfig(WxMpProperties wxMpProperties) {this.wxMpProperties = wxMpProperties;}/*** 微信客户端配置存储** @return*/@Beanpublic WxMpConfigStorage wxMpConfigStorage() {WxMpDefaultConfigImpl configStorage = new WxMpDefaultConfigImpl();// 公众号appIdconfigStorage.setAppId(wxMpProperties.getAppId());// 公众号appSecretconfigStorage.setSecret(wxMpProperties.getSecret());// 公众号TokenconfigStorage.setToken(wxMpProperties.getToken());// 公众号EncodingAESKeyconfigStorage.setAesKey(wxMpProperties.getAesKey());return configStorage;}/*** 声明实例** @return*/@Beanpublic WxMpService wxMpService() {WxMpService wxMpService = new WxMpServiceImpl();wxMpService.setWxMpConfigStorage(wxMpConfigStorage());return wxMpService;}
}

搭建完成 实现业务

模板消息推送

准备工作

在这里插入图片描述
链接: 申请测试模板.

模板消息填写要求

first.DATA 跟上.DATA说明是数据

人员:{{first.DATA}} 
地址:{{keyword1.DATA}} 
区域:{{keyword2.DATA}} 
告警类型:{{remark1.DATA}} 
时间:{{remark2.DATA}}

图文消息填写要求

<xml> 
<Articles> <item> <Title><![CDATA[title1]]></Title> <Description><![CDATA[description1]]></Description> <PicUrl><![CDATA[picurl]]></PicUrl> <Url><![CDATA[url]]></Url></item><item><Title><![CDATA[title]]></Title><Description><![CDATA[description]]></Description><PicUrl><![CDATA[picurl]]></PicUrl> <Url><![CDATA[url]]></Url> </item>
</Articles> 
</xml>

推送模板消息

这里使用微信提供的serviceApi
链接: WxMpService.


import com.shangqu.datapush.buildsite.model.emnus.AlarmType;
import com.shangqu.datapush.buildsite.model.mysqlData.AlarmInfo;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpAiOpenService;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.WxMpUserService;
import me.chanjar.weixin.mp.bean.result.WxMpUserList;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;/*** 微信消息推送***/
@Slf4j
@Component
@CrossOrigin
public class WxMsgPush {/*** 微信公众号API的Service*/private final WxMpService wxMpService;/*** 构造注入*/WxMsgPush(WxMpService wxMpService) {this.wxMpService = wxMpService;}/*** 发送微信模板信息** @param openId 接受者openId* @return 是否推送成功*/public Boolean SendWxMsg(String openId,String templateId) {// 发送模板消息接口WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()// 接收者openid.toUser(openId)// 模板id.templateId(templateId)// 模板跳转链接.url("www.baidu.com").build();// 添加模板数据templateMessage.addData(new WxMpTemplateData("first", "null告警""#000000")).addData(new WxMpTemplateData("keyword1", "","#000000")).addData(new WxMpTemplateData("keyword2","", "#000000")).addData(new WxMpTemplateData("keyword3", "", "#000000")).addData(new WxMpTemplateData("keyword4", "", "#000000"));String msgId = null;try {// 发送模板消息msgId = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);} catch (WxErrorException e) {e.printStackTrace();}log.warn("·==++--·推送微信模板信息:{}·--++==·", msgId != null ? "成功" : "失败");return msgId != null;}}

推送模板消息结果——效果

在这里插入图片描述
点击详情会进入百度

推送图文消息

    /*** 获取token* @return*/public String getAccessToken() throws WxErrorException {String accessToken = wxMpService.getAccessToken();return accessToken;}@ApiOperation(value = "", notes = "")@ResponseBody@RequestMapping(value = "/findwx", method = RequestMethod.POST)public void SendQYMessageimg(@RequestParam("id") String id) throws WxErrorException {String Url = "http://www.baidu.com";String mp = getAccessToken();String strurl = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + mp;try {//图片地址String PicUrl = "https://img-blog.csdn.net/20160907155302548";String responeJsonStr = "{";//用户openIdresponeJsonStr += "\"touser\": \"" + "用户openId" + "\",";responeJsonStr += "\"msgtype\": \"news\",";responeJsonStr += "\"agentid\": \"wxd4aff8****\",";responeJsonStr += "\"news\": {";responeJsonStr += "\"articles\": [{";responeJsonStr += "  \"title\": \"" + "震惊外国一小伙竟然做出... ..." + "\",";responeJsonStr += "  \"description\": \" " + "今日一美国男子在家中,竟然做出... ..." + "\",";responeJsonStr += "  \"url\": \"" + Url + "\",";responeJsonStr += "  \"picurl\": \"" + PicUrl + "\"";responeJsonStr += "}]";responeJsonStr += "},";responeJsonStr += "\"safe\":\"0\"";responeJsonStr += "}";xstream.connectWeiXinInterface(strurl, responeJsonStr);} catch (Exception e) {e.printStackTrace();}}

推送图文消息工具类


import java.io.InputStream;
import java.io.OutputStream;import java.net.HttpURLConnection;
import java.net.URL;public class xstream {public static void connectWeiXinInterface(String action,String json){URL url;try {url = new URL(action);HttpURLConnection http = (HttpURLConnection) url.openConnection();http.setRequestMethod("POST");http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");http.setDoOutput(true);http.setDoInput(true);System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒http.connect();OutputStream os = http.getOutputStream();os.write(json.getBytes("UTF-8"));// 传入参数InputStream is = http.getInputStream();int size = is.available();byte[] jsonBytes = new byte[size];is.read(jsonBytes);String result = new String(jsonBytes, "UTF-8");System.out.println("请求返回结果:"+result);os.flush();os.close();} catch (Exception e) {e.printStackTrace();}}}

问题和结果

要用户先发送一条消息给公众号,你才能发送成功
在这里插入图片描述
点击消息会进入百度

获取关注的用户openId

    /*** 获得关注公众号所有openid* @return* @throws WxErrorException*/@Overridepublic List<String> getUserList() throws WxErrorException {WxMpUserList wxMpUserList = wxMpService.getUserService().userList(null);List<String> openids = wxMpUserList.getOpenids();return openids;}

既然有了openId集合和要发送的消息怎么群发

微信并没有提供群发接口–就在自己代码中迭代openId集合去循环发送


http://chatgpt.dhexx.cn/article/Hhyp7hmp.shtml

相关文章

微信公众号接入天行机器人案例和方法

首先使用的是天行机器人&#xff1a; 1、接入基本原理&#xff1a; https://www.tianapi.com/apiview/47 申请完成后的结果如下 调用对应的接口的参数如下&#xff1a; http://api.tianapi.com/txapi/robot/index?keyae5e9a72c8d4cb1f5e096f7bb4daf1f3&questionrobot…

微信公众号的端口映射及服务开发

一. 开发准备 微信公众号申请---->实名认证---->服务器开发---->绑定服务器 PS: 这里有一点需要注意的就是, 微信开发必须是80端口或者443端口, 如果我们有云服务器主机一切都好办. 但是如果没有我们还有几个备选方案: 1. 花生壳 , net123 : 这两个都需要实名认证(…

[JAVA实现]微信公众号网页授权登录,java开发面试笔试题

我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。 扫描二维码或搜索下图红色VX号,加VX好友,拉你进【程序员面试学习交流群】免费领取。也欢迎各位一起在群里探讨技术。 推荐文章:Java 面试知识点解析;Mysql优化技巧…

后端操作微信公众号

一、功能说明 员工端使用微信公众号完成审批操作&#xff0c;涉及到的功能包含&#xff1a;自定义菜单、授权登录、消息 1、微信公众号一级菜单为&#xff1a;审批列表、审批中心、我的 2、员工关注公众号&#xff0c;员工第一次登录微信公众号&#xff0c;通过微信授权登录进行…

Java基于微信公众号接口实现授权登录源码及原理分析

微信公众号授权登录操作前提必须注册微信公众平台账号&#xff0c;注意的是订阅号不支持授权登录操作&#xff0c;因此对于个人开发者注册的订阅号是无法实现的&#xff0c;必须注册企业号的微信平台账号而具体注册流程就不详细介绍了&#xff0c;有什么疑问可去微信公众号平台…

微信公众号多域名回调系统1.0发布

这是一款基于ThinkPHP6.0框架的微信公众号多域名回调系统。 微信公众号后台默认只能授权2个网页域名&#xff0c;用本系统可突破这个限制&#xff0c;用同一个公众号对接无限多个网站。网站后台支持回调域名白名单的管理&#xff0c;以及登录记录的查看。 本系统还有微信access…

PHP微信扫码关注公众号并授权登录源码

PHP微信扫码登录看起来简单&#xff0c;但做起来有点麻烦&#xff0c;开发起来就会浪费很多的时间。 PHP判断是否首次关注公众号&#xff0c;扫码关注公众号获取微信用户头像、openid和省市等信息源码。 演示体验地址: https://www.skpan.cn/user/login.html 网盘下载地址:…

2023最新微信公众号无限回调系统源码/已修复BUG亲测可用

正文: 测试环境&#xff1a; Nginx 1.20.2 MySQL 5.6.50 PHP-7.2 1.创建站点 2.到根目录上传源码 3.创建数据库并导入 4.修改数据库信息 根目录/config.php 第5&#xff0c;6&#xff0c;7行 5.后台地址域名/admin 账号admin 密码123456 6.修改域名 根目录下 api.php 第…

Java微信公众号开发登录

MySQL基础开发篇 这部分的内容应该更合适那些刚入坑的朋友们或者是对于基础部分掌握不牢固的朋友,因此有一定经验的或者基础不错的可以自动跳至下一章内容阅读,这部分我仅把目录内容截图展示。 MySQL的优化以及管理维护 MySQL作为一款关系型数据库,SQL语句的优化是尤其重要的…

mysql 推送微信公众号_10分钟完成微信公众号第三方平台全网发布

背景&#xff1a;在微信公众平台配置服务器URL时&#xff0c;使用了新浪云SAE自带的二级域名&#xff0c;提交时出现一个安全风险的警告&#xff0c;网上查了下&#xff0c;许多服务平台和团队也遇到同样的问题。 经过一番研究 … 为什么会有安全风险的警告&#xff1f; 微信公…

springboot微信公众号管理系统vue内容文章文件上传jsp源码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当做编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 这是一个基于springbootvue的微信公众号管理系统 二…

微信公众号迁移,需要做些什么

❤️ 个人主页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;微信公众平台 文章目录 一、开通开发者二、设置IP白名单三、自定义菜单四、认证五、网页授权域名六、模板消息七、转换…

PHP微信公众号网页授权登录 扫码登录 获取用户基本信息

前言 现在微信登录是一个网站、APP的标配&#xff0c;所以微信授权登录是我们应该要掌握的。微信授权登录有4种方式&#xff1a; 1、通过微信开放平台2、通过认证的微信服务号3、通过认证的微信订阅号4、通过微信小程序曲线救国 今天我们就讲解的是微信服务号&#xff0c;通…

微信公众号多域名回调系统

介绍&#xff1a; 这是一款基于ThinkPHP6.0框架的微信公众号多域名回调系统。 微信公众号后台默认只能授权2个网页域名&#xff0c;用本系统可突破这个限制&#xff0c;用同一个公众号对接无限多个网站。网站后台支持回调域名白名单的管理&#xff0c;以及登录记录的查看。 本…

微信公众号授权获取用户信息及jwt登录

Java 微信公众号授权获取用户信息及jwt登录 &#xff01;&#xff01;&#xff01; 前言 前几篇文章小编分享过&#xff1a; 微信小程序授权获取用户手机号 jwt登录 (含源码)微信小程序支付 公众号支付 (含源码) 工作之余&#xff0c;分享下 “ 微信公众号授权 获取用户信…

手把手教程用Java实现微信公众号扫码登录功能

文章目录 前言一、环境准备二、使用步骤1. 使用微信工具包2. 创建数据表3. 登录页面代码逻辑4. 验证微信公众号登录 总结 前言 微信现今是我们必不可少的社交工具了&#xff0c;围绕微信这个生态实际上有很多东西可以做&#xff0c;我们经常会看到一些网站通过微信扫码进如公众…

[一维前缀和]leetcode303:区域和检索 - 数组不可变(easy)

题目&#xff1a; 题解&#xff1a; 一维前缀和&#xff0c;元素数组[0,j]的前缀和对应prefix[j1] 代码如下&#xff1a; class NumArray { private:vector<int> prefix; public://题解&#xff1a;一维前缀和NumArray(vector<int>& nums) {int nnums.size()…

前缀和矩阵前缀和

前缀和 前缀和是一种重要的预处理&#xff0c;能大大降低查询的时间复杂度。我们可以简单理解为“数列的前 n n n 项的和”。 例题 有 N N N 个的正整数放到数组 A A A 里&#xff0c;现在要求一个新的数组 B B B&#xff0c;新数组的第 i i i 个数 B [ i ] B[i] B[i]…

【算法基础】一维前缀和 + 二维前缀和

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;【C/C】算法 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有…

前缀和与差分总结

目录 1.前缀和 2.前缀和算法的好处 3.二维前缀和 4.差分 5.一维差分 6.二维差分 1.前缀和 前缀和是指某序列的前n项和&#xff0c;可以把它理解为数学上的数列的前n项和&#xff0c;而差分可以看成前缀和的逆运算。合理的使用前缀和与差分&#xff0c;可以将某些复杂的…