微信小程序消息通知開發(fā)及注意點(diǎn)
大致流程圖:
1. 登錄小程序平臺選擇合適的模板
Q:長期訂閱與普通訂閱有何區(qū)別?
A:1、一次性訂閱消息:用戶訂閱一次后,開發(fā)者可下發(fā)一條消息,不限時(shí)間。若用戶勾選了“總是保持以上選擇,不再詢問”且點(diǎn)擊了允許,那么以后都默認(rèn)同意訂閱這條消息。用戶不再做多次選擇,開發(fā)者也避免了更繁瑣的提醒。
2、長期性訂閱消息:用戶訂閱一次后,可長期下發(fā)多條消息。目前長期性訂閱消息向 政務(wù)、醫(yī)療、交通、金融、教育 等線下公共服務(wù)開放,后續(xù)將綜合評估行業(yè)需求和用戶體驗(yàn)持續(xù)完善。(長期訂閱消息只針對特定行業(yè)開放,所以普通開發(fā)者并無法使用)
*注意:目前微信那邊長期訂閱的消息模板因?yàn)楸粸E用,幾乎都用不了
2. 推送之前獲取小程序的token
接口文檔:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-access-token/getAccessToken.html
- 自己封裝的一個(gè)獲取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");
// 設(shè)置為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 推送接口的入?yún)ⅲ煽唇涌谖臋n
* @return 推送結(jié)果
*/
public Boolean sendAppletMsg(AppletMsgPushDTO pushDTO) {
// 查詢數(shù)據(jù)庫小程序配置信息
BusHospitalMiniprogramConfig wechatConfig = miniprogramConfigMapper.selectOne(
new LambdaQueryWrapper<BusHospitalMiniprogramConfig>()
.eq(BusHospitalMiniprogramConfig::getHospitalId, pushDTO.getHospitalId())
.eq(BusHospitalMiniprogramConfig::getIdentifying,pushDTO.getAppletKey()));
StringUtils.isNullThrowExp(wechatConfig, "小程序配置未設(shè)置");
if (StringUtils.isEmpty(wechatConfig.getTemplate())) {
throw new ServiceException("小程序消息通知模板為空");
}
// 查詢消息模板id (我將消息模板id存在數(shù)據(jù)庫了,所以這里通過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請求調(diào)用下微信推送接口
log.info("小程序消息通知入?yún)ⅲ? + JSON.toJSONString(pushDTO));
String resp = HttpUtils.sendPostJson(WechatInterface.getSubscribeUrl(pushDTO.getAccess_token()), JSON.toJSONString(pushDTO), null);
log.info("微信小程序消息通知結(jié)果:" + resp);
if (StringUtils.isNotEmpty(resp)) {
JSONObject object = JSONObject.parseObject(resp);
if (YesNoEnum.NO.getCode().equals(object.getInteger("errcode"))) {
return true;
}
return false;
}
return false;
}
實(shí)現(xiàn)效果
踩坑注意點(diǎn)
-
Q:推送接口返回:{ “errcode”: 47003,“errmsg”: “argument invalid! data.thing1.value is empty rid: 6486d741-7e95ec5f-39d18f1f”}
A:其實(shí)這個(gè)錯(cuò)誤有很多種原因引起,注意看msg提示的字段就可以了,檢查下文檔的參數(shù)值內(nèi)容限制。其次還可以調(diào)用官方提供的文檔,查詢下rid,可以看到具體的入?yún)?,我這里檢查過沒發(fā)現(xiàn)有傳入內(nèi)容限制的東西,最終調(diào)用rid接口發(fā)現(xiàn)中文亂碼了, 只需要在請求頭的Content-Type設(shè)置為application/json; encoding=utf-8就可以了
rid接口地址:https://developers.weixin.qq.com/doc/offiaccount/openApi/get_rid_info.html
-
Q:用戶沒有勾選授權(quán)消息通知,小程序消息還是推送了
A:一次性訂閱的話,如果用戶之前授權(quán)過但是沒有進(jìn)行消息推送,此時(shí)騰訊那邊是將授權(quán)累計(jì)起來的,所以消息就會進(jìn)行推送了,建議還是一對一授權(quán)以后就進(jìn)行消息推送。文章來源:http://www.zghlxwxcb.cn/news/detail-601803.html -
Q:長期訂閱的消息有的可以推送有的推送提示用戶拒絕該消息的推送
A:檢查使用的消息模板是不是出現(xiàn)了重復(fù)使用,官方不建議這樣操作,我刪除后換了個(gè)模板就可以推送了;還有目前一次性訂閱與長期訂閱不支持混用*文章來源地址http://www.zghlxwxcb.cn/news/detail-601803.html
到了這里,關(guān)于微信小程序消息通知開發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!