小程序订阅消息推送
小程序订阅消息推送
最近在做微信小程序的项目,有一个功能是用户注册,在后台审核后进行用户的消息推送,告知用户是否审核通过
先看效果图:
大概就是这样的,可以先看一下官方文档是怎么介绍消息推送的接口的,详情可看:
通过文档我们可以知道请求消息推送的接口主要要拿到用户的openId和access_token,然后写入模板等信息,调用推送接口即可,具体步骤如下:
获取用户的openId
关于获取用户的openId这里不做说明,详情可以查看微信小程序的官方文档的方法
获取access_token
用户的access_token是微信小程序给我们的一个接口调用凭证,调用绝大多数后台接口时都需使用 access_token,开发者需要进行妥善保存,微信官方文档给出的意见是最好在中控服务器中同统一进行获取和刷新,因此在本项目中也是通过中控服务统一获取access_token,代码中不多赘述access_token的获取方法,详情可看官方文档。
代码的编写
看官方文档给出的实例,除了openId和access_token是我们要主动去进行获取以外,还有其他的参数
{
"touser": "OPENID",
"template_id": "TEMPLATE_ID",
"page": "index",
"miniprogram_state":"developer",
"lang":"zh_CN",
"data": {
"number01": {
"value": "339208499"
},
"date01": {
"value": "2015年01月05日"
},
"site01": {
"value": "TIT创意园"
} ,
"site02": {
"value": "广州市新港中路397号"
}
}
}
template_id:是所需下方的模板id,必填项
page:是点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转,非必填项。
data:是模板内容,也就是上图我所截取的文字内容,必填项。
miniprogram_state:跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版,非必填。
lang: 进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN,非必填。
接口返回为Json格式的数据包:
话不多说可以看代码:
定义一个接口:
实体类:
详细代码如下:
contoller层
/**
* 消息推送
* @author yedan
* @date 2020/7/30 16:52
* @param openId openId
* @return com.anso.common.result.BaseResult
*/
@GetMapping("/pushOneUser")
public BaseResult pushOneUser(@RequestParam("openId") String openId) {
return new BaseResult<>(userRegisterAuditService.push(openId));
}
实现层:
@Override
public Object push(String openId) {
RestTemplate restTemplate = new RestTemplate();
//中控获取access_token
AccessToken accessToken = WechatClient.getAccessToken("006");
SendData sendData = new SendData();
sendData.setAccessToken(accessToken.getAccessToken());
//模板id
sendData.setTemplate_id("EwptsdkNpyXylTwvVFtb379aia1h-8udIytP9og5E2s");
//openId
sendData.setTouser(openId);
//添加模板内容
Map<String, TemplateData> map = new HashMap<>();
map.put("phrase2", new TemplateData("审核通过"));
map.put("time3", new TemplateData(DateUtils.formatToStr(new Date())));
map.put("thing5", new TemplateData("填写信息成功"));
sendData.setData(map);
String url = String.format(FETCH_ACCESS_TOKEN_URL_PATTERN, accessToken.getAccessToken());
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, sendData, String.class);
String resultStr = responseEntity.getBody();
JSONObject jsonObject = JSONObject.parseObject(resultStr);
System.out.println(jsonObject.toJSONString());
return responseEntity.getBody();
}
以上便是消息推送的方法。