序号

  • 前言
    • 准备
  • pom.xml配置
    • yml配置
  • 业务代码
    • 加载wx配置
    • 编写业务逻辑代码
    • controller类
    • 枚举
  • 测试

前言

记得第一次接触公众号的开发还是15年的时候,做的平安展业宝(记录业务员和客户的意向)的项目,后面陆陆续续也有接触公众号相关的项目。最近正好在做微信相关的项目,刚好把微信项目的功能点梳理一下。

微信公众号的开发方式有一种,一种原生的,一种框架的(热心人封装好的代码)。建议刚刚学习的朋友,都使用原始的方式。

准备

微信测试平台申请

  • 测试公众号和正式公众号后台界面会有所差异,实际功能都是一样的。

微信调试工具

  • 微信调试工具的作用,主要是方便我们调试,例如申请的测试公众号,是没有菜单的,如果需要配置菜单,可能就有点麻烦,如下图,这里就可以使用到调试工具。

pom.xml配置

        <!--  httpclient--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId></dependency><dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-mp</artifactId><version>4.1.0</version></dependency>
  • mp是框架共有的包,只是引用一些工具类

yml配置

#公众号配置
wechat:appid:  wx7e2be32199afae11appkey: 2c01014c25ed48d5a789b14664545612

  • 在测试公众号平台,找到appId和appsecret

业务代码

发送微信公众号模板消息官网demo

加载wx配置

package com.zyee.iopace.web.config;import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
@Data
public class WechatConfig {@Value("${wechat.appid}")private String appid;@Value("${wechat.appkey}")private String appkey;
}

编写业务逻辑代码

package com.zyee.iopace.web.service;import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.zyee.iopace.web.config.WechatConfig;
import com.zyee.iopace.web.dto.vo.TemplateMsgEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.HashMap;
import java.util.Map;@Component
public class ConfigurationService {private String accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&";@Autowiredprivate WechatConfig wechatConfig;public JSONObject getAccessToken() {String requestUrl = accessTokenUrl + "appid=" + wechatConfig.getAppid() + "&secret=" + wechatConfig.getAppkey();String resp = HttpUtil.get(requestUrl);JSONObject result = JSONUtil.parseObj(resp);System.out.println("获取access_token:" + resp);return result;}/*** 获取用户列表* @param accessToken* @return*/public JSONObject getUserList(String accessToken) {String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + accessToken + "&next_openid=";String resp = HttpUtil.get(requestUrl);JSONObject result = JSONUtil.parseObj(resp);System.out.println("用户列表:" + resp);return result;}public JSONObject sendTemplateMsg(TemplateMsgEntity messageVo, String token, String openId,String templateId) {String requestUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="  + token;Map<String,Object> content=new HashMap<>();JSONObject data = JSONUtil.createObj();//value 为需要设置的值   color为字体颜色data.put("title",new JSONObject().put("value",messageVo.getTitle()));data.put("key1",new JSONObject().put("value",messageVo.getKey1()).put("color","#173177"));data.put("key2",new JSONObject().put("value",messageVo.getKey2()).put("color","#173177"));data.put("key3",new JSONObject().put("value",messageVo.getKey3()).put("color","#173177"));data.put("key4",new JSONObject().put("value",messageVo.getKey4()).put("color","#173177"));data.put("remark",new JSONObject().put("value",messageVo.getRemark()));content.put("touser",openId);content.put("url",messageVo.getUrl());content.put("template_id",templateId);content.put("data",data);String resp = HttpUtil.post(requestUrl,new JSONObject(content).toString());System.out.println(content.toString());JSONObject result = JSONUtil.parseObj(resp);System.out.println("发送消息:" + resp);return result;}}
  • getAccessToken方法,有次数限制,每天只能2000次,可以把做成定时任务,每个小时读取一次,加载到redis中,每次从redis里面读取,也可以存到数据库。
  • getUserList方法获取关注的用户,注意一次最大返回10000个,如果超过,则需要通过next_openid参数来获取,这里了解即可,只是为了演示效果。例如,人事发布一个放假通知,所有关注公众号的人员都可以收到。
  • sendTemplateMsg方法里面的value是内容,color是我们设置的动态参数字体的颜色,字体默认为黑色,动态参数和其他的内容,如果都是同一种字体,是不是不美观。

controller类

package com.zyee.iopace.web.controller;import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.system.UserInfo;
import com.zyee.iopace.web.dto.vo.TemplateMsgEntity;
import com.zyee.iopace.web.enums.WxTemplateType;
import com.zyee.iopace.web.service.ConfigurationService;
import com.zyee.iopace.web.utils.WxUtils;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Locale;@Slf4j
@Api(tags = "微信测试接口")
@RestController
@CrossOrigin
@RequestMapping("/wx")
public class WxController {@Autowiredprivate ConfigurationService configurationService;/*** 发送模板消息* @return*/@GetMapping( "/sedMsg")public JSONObject sedMsg(){JSONObject accessToken = configurationService.getAccessToken();String token=accessToken.getStr("access_token");//获取用户列表JSONObject userList = configurationService.getUserList(token);//获取所有关注用户JSONArray openids = userList.getJSONObject("data").getJSONArray("openid");System.out.println(openids.toArray());TemplateMsgEntity messageVo=new TemplateMsgEntity();messageVo.setTitle("站点预警提示");messageVo.setKey1("采集系统内部预警");messageVo.setKey2("数据质控");messageVo.setKey3("2023-4-6 16:28:12");messageVo.setKey4("G1234掉线,请检查设备情况");messageVo.setRemark("remark");messageVo.setUrl("baidu.com");for (Object openid:openids) {JSONObject resp = configurationService.sendTemplateMsg(messageVo,token,openid.toString(), WxTemplateType.WARN.code());}return null;}
}
  • 这里的url是跳转地址,发送模板消息分两种,一种是内容消息,还有一种是可以点击详情进行跳转到页面的消息,后面都有演示效果图。

枚举

package com.zyee.iopace.web.enums;/*** 微信模板*/
public enum WxTemplateType {WARN("ctJ9QNJacYjX2ZGK8NapSmT9wki_NHTIfE-smSBtfkw","预警模板");private String code;private String desc;WxTemplateType(String code, String desc) {this.code = code;this.desc = desc;}public String code() {return code;}public String desc() {return desc;}}

  • 代码里面的code值,从测试公众号模板消息里面获取
{{title.DATA}}
预警类型: {{key1.DATA}}
预警范围: {{key2.DATA}}
发布时间: {{key3.DATA}}
预警内容: {{key4.DATA}}
{{remark.DATA}}
  • 这是模板内容,注意==.DATA之间的参数名是有讲究的,得跟代码里面一一对应,我这里写了4个key,基本上满足需求,在实际应用中,你可以定义多个key,再抽取成一个发送模板消息的接口,做到代码复用就行。

测试

我的端口是9090.所以访问的地址为http://localhost:9090/wx/sedMsg,点击访问后,可以查看后台打印。会收到如下日志打印。


  • 注意,这两个字段的区别就是在控制类哪里注释//messageVo.setUrl(“baidu.com”);这一行代码就可以。

  • 点击详情,是可以跳转到百度的。
  • 场景:例如,我们关注某个公司的公众号,发工资后,会给我们发送一个公众号模板消息,例如假设,你这个月花了1w,跟你之前每个月的工资差别很大,你是不是会跑去问财务,为了让大家不至于天天打扰到财务的同事, 就做了一个功能,点击详情后,可以查看工资的组成部分,例如基本工资+岗位津贴+保密工资+绩效工资(20%,随机抽一个倒霉蛋承担)+全勤工资(请假就扣钱)

【微信公众号入门到精通 一】发送模板消息(业务通知)相关推荐

  1. 微信公众号开发——向指定用户发送模板消息

  2. 微信公众号自定义菜单和推送模板消息

    1.微信公众号测试账号: 找到服务号的开发文档,点击进去. Java代码: 准备工作: (1)填写JS接口安全域名 (2)填写接口配置信息: (2)java的Token验证接口 @RequestMap ...

  3. 《微信公众平台入门到精通》,青龙老贼,详情版本

    <微信公众平台入门到精通>,青龙老贼,详情版本 <微信公众平台入门到精通>Vol.1   http://segmentfault.com/a/1190000000356021 ...

  4. php 向公众号发送消息,微信公众号之主动给用户发送消息功能

    前一段时间项目中遇到一个稍微麻烦一点的问题. 即客户要求,他在后台编辑好文章后要主动给每个用户都发送消息,并可以让用户点击直接进入文章页面. 于是乎,当时脑子一热,想着没什么大的问题,so easy. ...

  5. RUNTIME / 微信公众号开发—主动向用户发送消息

    来源:https://gitee.com/lxycx_xc/codes/mvesy65pt4lraw3u8x7gc81 模板消息:需要先在微信公众号管理后台申请该功能模板,拿到模板ID和模板上对应的字 ...

  6. 微信公众号为指定openid用户推送消息

    微信公众号为指定openid用户推送消息 微信提供的开放接口中,有两个给指定openid的用户发送信息的接口,适用场景应该是向 预约用户或者中奖用户发送消息. 第一个接口:客服发送消息 请求方式: P ...

  7. 关注微信公众号使其自动发送欢迎你关注消息

    关注微信公众号使其自动发送欢迎你关注消息 一般我们关注微信公众号时.他都会自动推送一条消息.欢迎您关注了某公众号.而今天我们所做的就是这个功能. 关注公众号时我们需要获取到用户的一些个人基本信息. 而 ...

  8. Java开发微信公众号之被动回复用户消息-回复图片消息

    一.前言 hello小伙伴们,大家好,做微信开发两年了,最近看到微信方面的文章阅读量和关注量上升的比较快速,激发了我满满的动力啊,所以就滋生了一个想法,从头开始整理一下微信公众号开发,写一个简易的教程 ...

  9. 微信公众号如何无限制的定向推送消息--模板消息的应用

    微信公众号如何无限制的定向推送消息–模板消息的应用 最近开发的OA平台有一个需求:将待办消息推送到微信公众号的指定用户.但是为了避免用户受到垃圾消息的骚扰,微信对相关的接口做了非常严格的限制. 查阅开 ...

  10. 订阅号服务器消息推送数量,如何解决微信公众号一个月只能发4次消息的问题...

    如何解决微信公众号一个月只能发4次消息的问题 发布时间:2021-01-19 09:49:16 来源:亿速云 阅读:120 作者:小新 这篇文章将为大家详细讲解有关如何解决微信公众号一个月只能发4次消 ...

最新文章

  1. PyTorch 进行 Neural-Transfer
  2. allegro16.3 中的orcad capture CIS 无法打开何解决?
  3. spring配置数据源(交给spring容器完成)
  4. canvas实现半圆环形进度条
  5. TCP协议疑难杂症全景解析|硬核
  6. 为什么服务端程序都需要先 listen 一下?
  7. java 值 继承_java中继承的数值传递引用
  8. 数据结构与算法系列——排序(10)_归并排序
  9. 感觉非常经典的一片博文(关于缓存)
  10. java iterator遍历map_使用Iterator输出map,遍历map集合
  11. python爬虫实践-腾讯视频弹幕分析
  12. android studio怎么后退,Android Studio:上一个活动的后退按钮
  13. HDU 4415 Assassin’s Creed
  14. ruby的require, 和in clude有什么区别
  15. 【栈】实现高级计算器
  16. css——给多张图片设置一个背景图:上下固定尺寸+中间拉伸,里面放内容
  17. 实现listview条目点击显示和隐藏
  18. python 面向对象终极进阶之开发流程
  19. 2021-2027全球与中国成像雷达传感器市场现状及未来发展趋势
  20. Ant的入门级教程(1)?ANT 蚂蚁是什么?带有简单使用。

热门文章

  1. pandas numpy 实习小结
  2. SQL 圆通大头笔对应全国建包拆包地的对应关系(以山东省青岛建包关系为例)
  3. 快速上线小程序,Serverless云开发带来哪些极致体验?
  4. (Python sklearn+LogisticRegression)实现乳腺癌预测
  5. 织梦dede实现多城市分站功能(有演示)
  6. 为什么生成式对抗网络(GAN)能够使图像质量得到改善,以及如何设计GAN模型来实现这一目标?
  7. 【Unity】3D贪吃蛇游戏制作/WebGL本地测试及项目部署
  8. 新SAT官方范文得分的分段分析
  9. 基于Linux的SPI驱动框架源码分析(全文3万字)
  10. Java设计模式——责任链模式与电子签约