开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
实现公众号模板消息推送
1、前期准备工作
已经有相关账号的,可以直接从代码那块走。
我这边拿微信测试账号进行模拟,正式的公众号更换appid和appsecret以及请求链接就行了。
重点:测试请求链接跟正式的不一样
申请测试公众号
登录进去,会给生成相应的appid和appsecret
下面有测试号二维码:
以及申请推送的消息模板:
- 模板中参数内容必须以".DATA"结尾,否则视为保留字;
- 模板保留符号"{{ }}"
模板下方有可以调用的接口,可以自行查看文档
2、获取Access token
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.core.redis.RedisCache;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* vx 测试
* @author wh
*/
@RestController
@RequestMapping("/vx")
public class TemplateSendController {
private static final Logger log = LoggerFactory.getLogger(TemplateSendController.class);
// 公众号:appId
@Value("${vx.appId}")
private String appId;
// 公众号:appsecret
@Value("${vx.appsecret}")
private String appsecret;
// token 存放到redis中的key
private final String ACCESS_TOKEN = "weiXinApp:access_token";
@Autowired
private RedisCache redisCache;
/**
* 获取 vx 的 ACCESS_TOKEN
*/
@GetMapping("/getToken")
public String getToken(){
// 先从缓存中获取
String token = (String) redisCache.getCacheObject(ACCESS_TOKEN);
// 获取不到,再进行去调用微信的接口
if (StringUtils.isBlank(token)) {
//请求url路径
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appsecret;
HashMap tokenMap = null;
try {
// 具体发送操作
String str = HttpUtil.createGet(url).execute().body();
tokenMap = JSON.parseObject(str, HashMap.class);
} catch (Exception e) {
log.error(e.toString());
return null;
}
if (tokenMap == null || tokenMap.size() == 0) {
return null;
}
token = (String) tokenMap.get("access_token");
Integer expiresIn = (Integer) tokenMap.get("expires_in");
if (StringUtils.isBlank(token) || expiresIn == null || expiresIn <= 0) {
return null;
}
// 把token 放到缓存中
redisCache.setCacheObject(ACCESS_TOKEN, token, expiresIn - 2500, TimeUnit.SECONDS);
return token;
}
return token;
}
2、调用推送消息模板
@GetMapping("/testPushMessage")
public String testPushMessage() {
// 组装要发送的数据
JSONObject body = new JSONObject();
// 要推给谁
body.put("touser", "oIQ1z6MD8bcYAsnCCtiU6H54pLcg");
// 模板ID
body.put("template_id", "OT_KJJKhDdvGVReyz1HLhZVA8NwF43wtNu_jz_xqU68");
// 具体发送内容
JSONObject jsonParam = new JSONObject();
JSONObject dateVal = new JSONObject();
dateVal.put("value","2022-12-01");
dateVal.put("color","#173177");
jsonParam.put("date", dateVal);
body.put("data", jsonParam);
//发送
String accessToken = getToken();
log.info("token--->{}",accessToken);
log.info("body---->{}",body.toString());
String post = HttpUtil.post("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken, body.toString());
log.info("通知到用户--->{}",post);
return "ok";
}
测试公众号后续可以根据需要,自行设计相关模板,只要参数对的上就行;
正式公众号是要申请模板;