java 实现小程序 消息订阅

对于新版本消息订阅 ,与之前有些区别,之前的写法就不列举了。有兴趣的可以从网上浏览。

一、 封装消息的类

  /**
     * 设置具体需要发的消息的 类
     */
    @Data
    public class TemplateData {
        private String value;
    }

二、封装入参的类

 /**
     * 封装入参的类 注意:根据官方文档提示,这些属性 必须为此写法,否则会报错
     */
    @Data
    public static class WxMssVo {
        /**
         * 接口调用凭证
         */
        private String access_token;
        /**
         * 接收者(用户)的 openid
         */
        private String touser;
        /**
         * 所需下发的模板消息的id
         */
        private String template_id;
        /**
         * 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
         */
        private String page;
        /**
         * 模板内容,不填则下发空模板
         */
        private Map<String, TemplateData> data;
    }

三、获取access_token

/**
     * 此方法用于获取 access_token
     * access_token 用于拼接 发送消息url
     *
     * @return access_token
     */
    private String getAccessToken() {
        //首先从缓存中取
         Object o = redisTemplate.opsForValue().get(“自定义缓存key”);
        if (o != null)
            return o.toString();
        //缓存没有调用接口查询最新 
        
        //获取access_token
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
                "&appid=" + "小程序Id" + "&secret=" + "小程序秘钥";
     
          RestTemplate  restTemplate = new RestTemplate();
        
        String json = restTemplate.getForObject(url, String.class);
        JSONObject myJson = JSONObject.parseObject(json);
       String access_token = myJson.get("access_token").toString();
        // 微信服务器有效时间
            String expires_in = myJson.get("expires_in").toString();
            redisTemplate.opsForValue().set(自定义缓存key”, access_token,                 Long.parseLong(expires_in), TimeUnit.SECONDS);
            return access_token;
    }

四、发送消息

 /**
     * 发送具体的消息  调用此方法  需要传入 在公众平台选用好的消息模版
     *
     *  并且 需要前端调用微信 授权接口后 才能有权限发送订阅消息
     * @param templateId
     * @return
     */
    public String sendMessage(String templateId) {
        String accessToken = getAccessToken();
        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + accessToken;
        WxMssVo wxMssVo = new WxMssVo();
        wxMssVo.setTouser("openid");
        wxMssVo.setTemplate_id(templateId);
        Map<String, TemplateData> dataVoMap = new HashMap<>();
        TemplateData key1 = new TemplateData();
        TemplateData key2 = new TemplateData();
        TemplateData key3 = new TemplateData();
        key1.setValue("张一一");
        key2.setValue("乒乓球");
        key3.setValue("报名成功");
        //这里的key  为选用的模版的对应的key  可在选用的模版的详情中查看  切必须为这些,否则会报 参数错误提示
        dataVoMap.put("name11", key1);
        dataVoMap.put("thing5", key2);
        dataVoMap.put("thing7", key3);
        wxMssVo.setData(dataVoMap);
        HttpHeaders headers = new HttpHeaders();
        //设置编码  不设置转码 可能会出现 乱码问题
        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
        // 请勿轻易改变此提交方式,大部分的情况下,提交方式都是表单提交
        headers.setContentType(type);
        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
        if (restTemplate == null) {
            restTemplate = new RestTemplate();
        }
        String string = JSONObject.toJSONString(wxMssVo);
        HttpEntity<String> requestEntity = new HttpEntity<String>(string, headers);
        ResponseEntity<String> stringResponseEntity = restTemplate.postForEntity(url, requestEntity, String.class);
        return stringResponseEntity.getBody();
    }

这里的 name11 thing5 thing7 对应文中 map key

 效果图

注意:代码中注释 很重要 请认真阅读 有什么不理解的欢迎提问。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值