文章目录
- 前言
- 一、什么是消息推送
- 二、获取模板ID
- 三、获取access_token
- 四、发送消息
- 五、完整的代码
- 总结
前言
最近做项目时需要做个小程序的消息推送,所以在这里记录分享一下实现过程
一、什么是消息推送
↓↓↓↓
官方文档
小程序提供了多种消息方式,一般常用的是模板消息和订阅消息,但是模板消息推送,在2020年1月10日下线,所以我们就是用使用订阅消息了。
功能介绍
消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验。
- 订阅消息推送位置:服务通知
- 订阅消息下发条件:用户自主订阅
- 订阅消息卡片跳转能力:点击查看详情可跳转至该小程序的页面
消息类型
- 一次性订阅消息
一次性订阅消息用于解决用户使用小程序后,后续服务环节的通知问题。用户自主订阅后,开发者可不限时间地下发一条对应的服务消息;每条消息可单独订阅或退订。 - 长期订阅消息
一次性订阅消息可满足小程序的大部分服务场景需求,但线下公共服务领域存在一次性订阅无法满足的场景,如航班延误,需根据航班实时动态来多次发送消息提醒。为便于服务,我们提供了长期性订阅消息,用户订阅一次后,开发者可长期下发多条消息。
目前长期性订阅消息仅向政务民生、医疗、交通、金融、教育等线下公共服务开放,后期将逐步支持到其他线下公共服务业务。
二、获取模板ID
百度搜索微信公众平台
微信扫码登录
在功能中找到订阅消息
点击开通订阅消息
由于长期性订阅消息,目前仅向政务民生、医疗、交通、金融、教育等线下公共服务开放,后期将逐步支持到其他线下公共服务业务。仅就线下公共服务这一点,长期性订阅消息就和大部分开发者无缘了。
所以我们这里只能以使用一次性订阅消息为例。
选择先要的公共模板,也可以自己定制,但是公共模板已经可以满足我们绝大多数业务场景了
如上图,我们从公共模板库里选择一个一次性订阅的模板。然后编辑模板如下图
下图就是我们添加好的模板,下图的模板id就是我们需要的。
三、获取access_token
首先来看下access_token是什么,下图是官方给出的:
其实通俗的讲,access_token就是小程序官方给我们提供的一个凭证,你要调用小程序官方的接口,就必须先拿到access_token。这个和我们做的项目调用后台接口必须登录后台给你一个token你带token访问相似。看一下官方文档:
grant_type是一个固定的值,只有appid和secret是需要我们填入的,这两个值在我们的小程序后台就可以拿到。
下面就是Java后台代码的编写了
我这里用的是springboot,这里要请求小程序官方接口,正常项目开发我都是用的自己写的接口请求工具类的,这里为了大家方便就用了springboot自带的RestTemplate来做网络请求。文章最后我会把我自己写的这个请求工具类贴出来有需要的朋友可以copy,具体代码如下。
代码如下(示例):
这里代码很简单,就一个简单的get请求。不过要注意一点,这里获取的access_token是有两个小时的过期时间的
所以在获取到access_token的时候,把access_token存到数据库,或者存到本地缓存,并且还要记录当前时间,后面再用的时候先判断这个access_token有没有超过2个小时,如果超过2个小时的话,就要重新获取了。但这里我就不做了,只是你们在做开发的时候尽量还是规范点。
四、发送消息
老规矩还是先看官方文档
上面的参数都是我们发送消息时需要的。
这里有个需要特别注意的点,我们要给用户发送消息,就必须引导用户授权,如下
因为用户不点击允许,你是没有办法给用户推送消息的。每一次授权只允许发送一条消息,所以如果你想尽量多的发送消息,就得尽量多的引导用户授权。
我们这里用到了wx.requestSubscribeMessage这个方法,来获取用户的授权。
这里我把前端的代码也贴出来大家可以参考参考
<button bindtap="getAuthority" type='primary'>获取订阅消息授权</button>
//获取授权的点击事件
getAuthority() {
wx.requestSubscribeMessage({
tmplIds: ['CFeSWarQL*************8V8bFLkBzTU'], //这里填入我们生成的模板id
success(res) {
console.log('授权成功', res)
},
fail(res) {
console.log('授权失败', res)
}
})
}
推送的Java代码如下
代码如下(示例):
可以看到,我们这里需要定义用户的openid,模板id,跳转路径,模板消息内容等。
这些都定义好以后,我们就可以提供一个服务给到Java的其他代码调用,或者提供一个接口供外界传入openid,然后给对应的用户推送消息了。
然后小程序就收到了
五、完整的代码
- 获取access_token
下面的appId,appSecret替换成你们自己的,具体的可以去小程序后台查看
public static final String WX_ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token?grant_type={grant_type}&appid={appid}&secret={secret}";
public String getAccessToken() {
Map<String,Object> params = new HashMap<>();
params.put("grant_type","client_credential");
params.put("appid",appId);
params.put("secret",appSecret);
//发送请求
String result = RestTemplateUtil.requestForGetString(WX_ACCESS_TOKEN , params);
JSONObject jsonObject = JSONObject.parseObject(result);
String accessToken = jsonObject.getString("access_token");
if (StringUtils.isEmpty(accessToken)) {
log.error("获取access token失败: {}" , jsonObject.getString("errmsg"));
throw new ApiException("获取access token失败");
} else {
log.info("wx access_token : {}",accessToken);
return accessToken;
}
}
- 发送消息
public static final String SEND_INFO_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=";
public String push(QueueInfoTempDto info) {
RestTemplate restTemplate = new RestTemplate();
String url = SEND_INFO_URL + getAccessToken();
//拼接推送的模版
WxMssVO wxMssVo = new WxMssVO();
wxMssVo.setTouser(info.getOpenId());//用户的openId
wxMssVo.setTemplate_id(templateId);//订阅消息模板id
wxMssVo.setPage("pages/appointment/line_up?"+"shopId="+info.getShopId());
Map<String, TemplateData> m = new HashMap<>(5);
m.put("thing1", new TemplateData(info.getShopName()));
m.put("thing2", new TemplateData(info.getCode()));
m.put("thing3", new TemplateData("前面还有"+info.getPreNumber()+"桌,请耐心等待"));
m.put("thing9", new TemplateData(info.getNumber()+"人"));
m.put("time8", new TemplateData(DateUtils.sdfTime.format(info.getCreatedTime())));
wxMssVo.setData(m);
ResponseEntity<String> responseEntity =
restTemplate.postForEntity(url, wxMssVo, String.class);
return responseEntity.getBody();
}
- 对应的两个数据类如下
WxMssVo用来封装请求官方接口的参数
@Data
public class WxMssVO {
private String touser;//用户openid
private String template_id;//订阅消息模版id
private String page = "pages/index/index";//默认跳到小程序首页
private Map<String, TemplateData> data;//推送文字
}
TemplateData 用来定义消息的内容
@AllArgsConstructor
@Data
public class TemplateData {
private String value;
}
到这里我们就可以完整的实现Java发送小程序消息的功能了。完整代码也已经贴给大家了。
总结
以上就是今天要分享给大家的内容,本文简单的讲了怎么发送订阅消息,其实大部分大家参考官方文档都是可以写出来的