SpringBoot集成小程序推送

1、订阅消息包括两种

一次性订阅消息

一次性订阅消息用于解决用户使用小程序后,后续服务环节的通知问题。用户自主订阅后,开发者可不限时间地下发一条对应的服务消息;每条消息可单独订阅或退订。

长期订阅消息

一次性订阅消息可满足小程序的大部分服务场景需求,但线下公共服务领域存在一次性订阅无法满足的场景,如航班延误,需根据航班实时动态来多次发送消息提醒。为便于服务,我们提供了长期性订阅消息,用户订阅一次后,开发者可长期下发多条消息。

目前长期性订阅消息仅向政务民生、医疗、交通、金融、教育等线下公共服务开放,后期将逐步支持到其他线下公共服务业务。

2、小程序订阅流程

  • 获得用户openID
  • 获取access_token
  • 消息模板推送
  1. 获得用户openId

要在微信小程序调用登录开放接口 wx.login() 获取用户登陆凭证code。

GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

SpringBoot 集成小程序推送
SpringBoot 集成小程序推送

2.获取access_token

/**
     * 获得AccessToken
     * @return
     */
    @Override
    public String getAccessToken() {
        Map<String, String> params = new HashMap<>();
        /**
         * 参数appid,appsecret
         */
        params.put(BimsConstsPark.MINI_PROGRAM_APP_ID, appId);
        params.put(BimsConstsPark.MINI_PROGRAM_APP_SECRET, appSecret);
        /**
         * 先去访问缓存中的access_Token 如果未过期 则不需要去重新获取,过期则需要重新拿
         */
        String accessValue = redisTemplate.opsForValue().get(BimsConstsPark.MINI_PROGRAM_ACCESS_TOKEN  appId);
        if(StringUtils.isNotBlank(accessValue)){
            return accessValue;
        }
        /**
         * 微信接口获得access_Token
         */
        ResponseEntity<String> responseEntity = restTemplate.getForEntity(
                "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}", String.class, params);
        String body = responseEntity.getBody();
        /**
         * 返回json解析
         */
        JSONObject object = JSON.parseObject(body);
        //Access_Token
        String access_Token = object.getString("access_token");
        //过期时间
        String expires_in = object.getString("expires_in");
        //将其存在Redis中
        System.out.println("有效时长expires_in:"   expires_in);
        try {
            /**
             * 将拿到的access_Token存入缓存,设置过期时间,如果过期需要重新获取
             */
            redisTemplate.opsForValue().set(BimsConstsPark.MINI_PROGRAM_ACCESS_TOKEN   appId, access_Token,Long.valueOf(expires_in==null?"0":expires_in), TimeUnit.SECONDS);
        }catch (Exception e){
            return "";
        }
        return access_Token;
    }

3.模板推送

/**
     * 小程序通知推送
     * @return
     */
    @Override
    public String pushMsg() {
        String openid = "oVNCx4tMJHNd5PXEqAfrj0Xz2ezY";
        RestTemplate restTemplate = new RestTemplate();
        //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="   getAccessToken();
        //拼接推送的模版
        WxMssVo wxMssVo = new WxMssVo();
        //用户的openid(要发送给那个用户,通常这里应该动态传进来的)
        wxMssVo.setTouser(openid);
        //订阅消息模板id
        wxMssVo.setTemplate_id("AGr87hXpZQHhgGIrmIGLt5tqtzt8yx64kkTJNnN9Uwg");
        //消息打开跳转页面
//        wxMssVo.setPage(toPage);

        Map<String, TemplateData> m = new HashMap<>(3);
        m.put("thing1", new TemplateData("我要举报小明贪污"));
        m.put("name2", new TemplateData("小红"));
        m.put("date3", new TemplateData(DateUtil.now()));
        wxMssVo.setData(m);
        ResponseEntity<String> responseEntity =
                restTemplate.postForEntity(url, wxMssVo, String.class);
        return responseEntity.getBody();
    }

通用实体及参数定义

参数定义

yml文件:
wx:
  #小程序appId
  miniAppId: *****
  #小程序AppSecret
  miniAppSecret: ******
  #小程序中定义的模板Id
  miniTemplateId: *******
  #消息打开跳转的地址
  miniPage: pages/msg/msg

实体中定义:
    @Value("${wx.miniAppId}")
    private String appId;

    @Value("${wx.miniAppSecret}")
    private String appSecret;

    @Value("${wx.miniPage}")
    private String toPage;

    @Value("${wx.miniTemplateId}")
    private String templateId;

通用实体:

WxMssVo:
package com.fpi.bims.model.vo.push;

import java.util.Map;

/**
 * @program bims-core-master
 * @description: 小程序推送
 * @author: zhengzhang_shan
 * @create: 2020/12/24 11:05
 */

public class WxMssVo {
    /**
     * 用户openid
     */
    private String touser;
    /**
     * 订阅消息模版id
     */
    private String template_id;

    /**
     * 默认跳到小程序首页
     */
    private String page = "pages/index/index";
    /**
     * 推送文字
     */
    private Map<String, TemplateData> data;

    public String getTouser() {
        return touser;
    }

    public void setTouser(String touser) {
        this.touser = touser;
    }

    public String getTemplate_id() {
        return template_id;
    }

    public void setTemplate_id(String template_id) {
        this.template_id = template_id;
    }

    public String getPage() {
        return page;
    }

    public void setPage(String page) {
        this.page = page;
    }

    public Map<String, TemplateData> getData() {
        return data;
    }

    public void setData(Map<String, TemplateData> data) {
        this.data = data;
    }
}


TemplateData:
package com.fpi.bims.model.vo.push;

/**
 * @program bims-core-master
 * @description: 推送数据
 * @author: zhengzhang_shan
 * @create: 2020/12/24 11:06
 */
public class TemplateData {
    private String value;

    public TemplateData(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

3、创建自己的模板

  • 进入小程序公共平台,开通订阅消息,选择通用模板。(官方提供了一些通用的模板),没有合适的可以自己申请
SpringBoot 集成小程序推送
SpringBoot 集成小程序推送
  • 模板确定后可以在我的模板中看见自己选择模板信息,需要用到模板id
SpringBoot 集成小程序推送
  • 详情可查看需要推送的格式
SpringBoot 集成小程序推送

内容出处:,

声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。文章链接:http://www.yixao.com/tech/19051.html

发表评论

登录后才能评论