小程序获取openid保存缓存吗_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

1176a3158e014cc8a24e3aabd98fb30f.png
b2cd7d3ec7082157eebb970138bc6242.png

2.获取access_token

/**     * 获得AccessToken     * @return     */    @Override    public String getAccessToken() {        Map 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 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 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 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 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 getData() {        return data;    }    public void setData(Map 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、创建自己的模板

  • 进入小程序公共平台,开通订阅消息,选择通用模板。(官方提供了一些通用的模板),没有合适的可以自己申请
ec1270c9baac82a6a6f2b54ff5926f68.png
23bde89ee4ad90092d53c23b416ae1f8.png
  • 模板确定后可以在我的模板中看见自己选择模板信息,需要用到模板id
16659f06cc1ee134827afe113946f1df.png
  • 详情可查看需要推送的格式
29723766e228f07c425feb2413f624e8.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值