微信订阅推送通知实现

1 篇文章 0 订阅

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参数是一个嵌套的结构,需要特殊处理一下。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值