1. 微信文档
微信官方文档
选择开发对应类型的文档打开,如下
2. 获取接口
微信所有的接口都需要先获取token(如何获取这里不做赘述),拿到token后首先调用户获取个人模板列表接口拿到模板id
![在这里插入图片描述](https://img-blog.csdnimg.cn/40e46cd762364687965a3af94d7d70f0.png
该方法只有一个入参token,输出主要用到的参数就是priTmplId,模板id
然后调用发送订阅消息接口
微信收到的通知如下
如果没有授权订阅会返回这个
3. 后端实现
创建订阅通知接口的vo对象
//lombok注解
@Data
@Accessors(chain = true)
public class WxSendVo {
@ApiModelProperty("所需下发的订阅模板id")
private String template_id;
@ApiModelProperty("点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转")
private String page;
@ApiModelProperty("接收者(用户)的 openid")
private String touser;
@ApiModelProperty("模板内容,格式形如 { \"key1\": { \"value\": any }, \"key2\": { \"value\": any } }的object")
private Map<String, Object> data;
@ApiModelProperty("跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版")
private String miniprogram_state;
@ApiModelProperty("进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN")
private String lang = "zh_CN";
}
调用方法
//sendUrl https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=
@Value("${weixin.sendUrl}")
private String sendUrl;
public ServiceResponse<Boolean> send(WxSendVo wxSendVo) {
//微信token
String wxToken = redisTemplate.opsForValue().get(RedisKeyUtils.WX_TOKEN);
String url = sendUrl + wxToken;
Map<String, Object> data = wxSendVo.getData();
HashMap<String, Map<String, Object>> map = new HashMap<>(16);
//构建data参数格式
data.forEach((key, value) -> {
HashMap<String, Object> one = new HashMap<>(16);
one.put("value", value);
map.put(key, one);
});
JSONObject jsonObject = new JSONObject();
BeanUtil.copyProperties(wxSendVo, jsonObject);
jsonObject.set("data", map);
HttpRequest httpRequest = HttpRequest.post(url).body(jsonObject.toString()).contentType("application/json");
HttpResponse execute = httpRequest.execute();
String body = execute.body();
try {
JSONObject jsonObject1 = JSONUtil.parseObj(body);
if (!Objects.equals(jsonObject1.getStr("errcode"), "0")) {
return ServiceResponse.error(body);
}
} catch (Exception e) {
return ServiceResponse.error(e.toString());
}
return ServiceResponse.ok(Boolean.TRUE);
}
注意: 我的token处理是放到redis里面,这里直接从里面取了。订阅消息接口的数据必须以json格式发起调用,HttpRequest使用的hutool的工具类包,data参数是一个嵌套的结构,需要特殊处理一下。