赞
踩
1. 登录小程序平台选择合适的模板
Q:长期订阅与普通订阅有何区别?
A:1、一次性订阅消息:用户订阅一次后,开发者可下发一条消息,不限时间。若用户勾选了“总是保持以上选择,不再询问”且点击了允许,那么以后都默认同意订阅这条消息。用户不再做多次选择,开发者也避免了更繁琐的提醒。
2、长期性订阅消息:用户订阅一次后,可长期下发多条消息。目前长期性订阅消息向 政务、医疗、交通、金融、教育 等线下公共服务开放,后续将综合评估行业需求和用户体验持续完善。(长期订阅消息只针对特定行业开放,所以普通开发者并无法使用)
*注意:目前微信那边长期订阅的消息模板因为被滥用,几乎都用不了
2. 推送之前获取小程序的token
接口文档:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-access-token/getAccessToken.html
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; }
rid接口地址:https://developers.weixin.qq.com/doc/offiaccount/openApi/get_rid_info.html
Q:用户没有勾选授权消息通知,小程序消息还是推送了
A:一次性订阅的话,如果用户之前授权过但是没有进行消息推送,此时腾讯那边是将授权累计起来的,所以消息就会进行推送了,建议还是一对一授权以后就进行消息推送。
Q:长期订阅的消息有的可以推送有的推送提示用户拒绝该消息的推送
A:检查使用的消息模板是不是出现了重复使用,官方不建议这样操作,我删除后换了个模板就可以推送了;还有目前一次性订阅与长期订阅不支持混用*
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。