微信小程序消息通知开发

微信小程序消息通知开发及注意点

大致流程图:

用户登录
后端存储用户openid
前端弹出通知授权
后端请求接口获取token
后端调用消息推送接口

1. 登录小程序平台选择合适的模板
模板选取

Q:长期订阅与普通订阅有何区别?
A:1、一次性订阅消息:用户订阅一次后,开发者可下发一条消息,不限时间。若用户勾选了“总是保持以上选择,不再询问”且点击了允许,那么以后都默认同意订阅这条消息。用户不再做多次选择,开发者也避免了更繁琐的提醒。
2、长期性订阅消息:用户订阅一次后,可长期下发多条消息。目前长期性订阅消息向 政务、医疗、交通、金融、教育 等线下公共服务开放,后续将综合评估行业需求和用户体验持续完善。(长期订阅消息只针对特定行业开放,所以普通开发者并无法使用)
*注意:目前微信那边长期订阅的消息模板因为被滥用,几乎都用不了

2. 推送之前获取小程序的token

接口文档:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-access-token/getAccessToken.html

  • 自己封装的一个获取token方法
public String getAppletToken(Long hospitalId, BusHospitalMiniprogramConfig wechatConfig) {
        String token = redisService.getCacheObject(WechatCache.APPLET_ACCESS_TOKEN + hospitalId);
        // token失效或者为空
        if (StringUtils.isEmpty(token) || checkToken(token)) {
            String url = WechatInterface.getTokenUrl(wechatConfig.getAppid(), wechatConfig.getAppSecret());
            String resp= weChatUtil.postRequestForWeiXinService(url);
            log.info(hospitalId + "获取小程序token返回:" + resp);
            if (StringUtils.isEmpty(resp)) {
                throw new ServiceException("获取小程序token失败");
            }
            token = JSONObject.parseObject(resp).getString("access_token");
            // 设置为1.9h(有效期2h)
            redisService.setCacheObject(WechatCache.APPLET_ACCESS_TOKEN + hospitalId, token,
                    7100L, TimeUnit.SECONDS);
        }
        return token;
    }

3. 消息推送

接口文档:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-message-management/subscribe-message/sendMessage.html#%E8%AF%B7%E6%B1%82%E5%8F%82%E6%95%B0-2

/**
 * 推送小程序消息通知
 * @param pushDTO 推送接口的入参,可看接口文档
 * @return 推送结果
 */
public Boolean sendAppletMsg(AppletMsgPushDTO pushDTO) {
		// 查询数据库小程序配置信息
	   BusHospitalMiniprogramConfig wechatConfig = miniprogramConfigMapper.selectOne(
	           new LambdaQueryWrapper<BusHospitalMiniprogramConfig>()
	                   .eq(BusHospitalMiniprogramConfig::getHospitalId, pushDTO.getHospitalId())
	                   .eq(BusHospitalMiniprogramConfig::getIdentifying,pushDTO.getAppletKey()));
	   StringUtils.isNullThrowExp(wechatConfig, "小程序配置未设置");
	   if (StringUtils.isEmpty(wechatConfig.getTemplate())) {
	       throw new ServiceException("小程序消息通知模板为空");
	   }
	   // 查询消息模板id (我将消息模板id存在数据库了,所以这里通过key去获取要推送的消息模板)
	   JSONObject template = JSON.parseObject(wechatConfig.getTemplate(), JSONObject.class);
	   String templateId = template.getString(pushDTO.getTemplate_id());
	   if (StringUtils.isEmpty(templateId)) {
	       throw new ServiceException(pushDTO.getTemplate_id() + "消息通知模板不存在");
	   }
	   // 获取token
	   String token = getAppletToken(pushDTO.getHospitalId(), wechatConfig);
	   // 获取步骤1存储的openid
	   BusPatientApplet pa = patientAppletService.getOne(new LambdaQueryWrapper<BusPatientApplet>()
	           .eq(BusPatientApplet::getHospitalId, pushDTO.getHospitalId())
	           .eq(BusPatientApplet::getPatientId, pushDTO.getTouser())
	           .eq(BusPatientApplet::getAppletId, wechatConfig.getId()));
	   StringUtils.isNullThrowExp(pa,"获取用户小程序账号openid为空");
	   pushDTO.setTemplate_id(templateId);
	   pushDTO.setAccess_token(token);
	   pushDTO.setTouser(pa.getOpenid());
	   // Http请求调用下微信推送接口
	   log.info("小程序消息通知入参:" + JSON.toJSONString(pushDTO));
	   String resp = HttpUtils.sendPostJson(WechatInterface.getSubscribeUrl(pushDTO.getAccess_token()), JSON.toJSONString(pushDTO), null);
	   log.info("微信小程序消息通知结果:" + resp);
	   if (StringUtils.isNotEmpty(resp)) {
	       JSONObject object = JSONObject.parseObject(resp);
	       if (YesNoEnum.NO.getCode().equals(object.getInteger("errcode"))) {
	           return true;
	       }
	       return false;
	   }
	   return false;
}

实现效果

通知效果

踩坑注意点

  • Q:推送接口返回:{ “errcode”: 47003,“errmsg”: “argument invalid! data.thing1.value is empty rid: 6486d741-7e95ec5f-39d18f1f”}
    A:其实这个错误有很多种原因引起,注意看msg提示的字段就可以了,检查下文档的参数值内容限制。其次还可以调用官方提供的文档,查询下rid,可以看到具体的入参,我这里检查过没发现有传入内容限制的东西,最终调用rid接口发现中文乱码了, 只需要在请求头的Content-Type设置为application/json; encoding=utf-8就可以了

rid接口地址:https://developers.weixin.qq.com/doc/offiaccount/openApi/get_rid_info.html
在这里插入图片描述
在这里插入图片描述

  • Q:用户没有勾选授权消息通知,小程序消息还是推送了
    A:一次性订阅的话,如果用户之前授权过但是没有进行消息推送,此时腾讯那边是将授权累计起来的,所以消息就会进行推送了,建议还是一对一授权以后就进行消息推送。

  • Q:长期订阅的消息有的可以推送有的推送提示用户拒绝该消息的推送
    A:检查使用的消息模板是不是出现了重复使用,官方不建议这样操作,我删除后换了个模板就可以推送了;还有目前一次性订阅与长期订阅不支持混用
    *

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值