微信小程序消息通知开发及注意点
大致流程图:
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:一次性订阅的话,如果用户之前授权过但是没有进行消息推送,此时腾讯那边是将授权累计起来的,所以消息就会进行推送了,建议还是一对一授权以后就进行消息推送。文章来源:https://www.toymoban.com/news/detail-601803.html -
Q:长期订阅的消息有的可以推送有的推送提示用户拒绝该消息的推送
A:检查使用的消息模板是不是出现了重复使用,官方不建议这样操作,我删除后换了个模板就可以推送了;还有目前一次性订阅与长期订阅不支持混用*文章来源地址https://www.toymoban.com/news/detail-601803.html
到了这里,关于微信小程序消息通知开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!