前言 📝

今天要实现一个小程序给用户发送模板消息,经过一系列的官网查看主要分为两种,一次性模板长期订阅。下面我会详细介绍两种模板的意思。

1. 消息类型

小程序订阅消息

一次性订阅:用户自主订阅后,可不限时间地下发一条对应的服务消息;每次订阅只能发送一条消息。也就是说,点击点阅之后,服务端只能帮我们下发一条信息。要想在次给用户下发信息,就需要用户再次点击订阅。

长期订阅:用户订阅一次后,可长期下发多条消息。长期订阅对资质的要求很高,目前长期性订阅消息仅向政务民生、医疗、交通、金融、教育等线下公共服务开放,后期将逐步支持到其他线下公共服务业务。

这样看来是不是觉得一次性订阅比较鸡肋,没有什么用。本文选用的就是一次性订阅,使用一次性订阅达到长期订阅的效果。

2.订阅消息

2.1 消息模板

发送消息必须使用微信小程序官方提供的消息模板。消息模板可以在微信公众号平台获取,如下图:

image.png

选好模板后,点击操作栏的选用按钮即可。如下图:

image.png

2.2 消息内容说明

image.png

(1)模板id: 模板的唯一标识,微信小程序端服务器端都需使用,来确定使用那个模板。
(2)详细内容: 这里就是消息的内容,上图所示中的 计划名称 就是标题,{{ting1.DATA}}就是值。

剩余模板中的内容都不重要,在此不作赘述。

2.3 消息发送

方法:wx.requestSubscribeMessage(Object object)(微信官方文档入口)wx.requestSubscribeMessage()用在微信小程序端,用于调起订阅消息界面。如下图:

image.png

注意事项:

(1)触发方式: wx.requestSubscribeMessage(Object object)只能用于点击按钮触发。
(2)一次性消息: 在消息类型中提及到,一次性订阅消息在用户自主订阅后,只能发送一次消息。

3.前端代码

requestSubscribeMessage

1
2
//由点击事件调出订阅消息界面
<button bindtap="subScriptionMessage"></button>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//调出 模板消息界面
subScriptionMessage(){
wx.requestSubscribeMessage({
//模板id,可以写多个
tmplIds:['模板id']
//成功回调
success(res){
console.log(res);
},
//失败回调
fail(res){
console.log(res);
}
})
}

4. 后端下发消息接口

发送订阅消息

POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN

image.png

需要注意的是access_token需要放在url地址栏,其余的参数我就不赘述了,官网地址都有。

5. 实际应用-长期订阅

通过上述介绍,我想大家对微信小程序发送模板消息有两个大概的认识。
我们知道用户同意订阅消息后,服务器端只能发一条消息给用户,后面如果想再次发送,还需要去询问用户是否订阅。那么如果我们想持续的给用户发消息呢?我们该如何应对这样的场景呢?

5.1 “总是保持以上选择”

在询问用户是否同意接收消息时,下方有个总是保持以上选择,如果用户勾选了,并点击确定,那么后面如果再次询问用户是否同意接收消息时,就不会弹出订阅消息界面。我们该如何判断用户勾选了保持以上选择呢?

可以通过微信小程序的wx.getSetting({})方法。这个方法会在勾选了保持以上选择后,会打印出模板id。所以我们需要在订阅界面成功回调方法中,判断下setting中是否包含模板id。

image.png

5.2 实现思路

  1. 在后台数据库中给微信用户添加一个字段:check_flag表示,表示是否勾选 总是保持以上选择,true:勾选了,false:未勾选。
  2. 在wx.requestSubscribeMessage()成功回调方法中调用wx.setting()中判断用户是否勾选了总是保持以上选择。
  3. 如果是,修改check_flag=true。
  4. 在微信小程序中必点击的地方,添加调用wx.requestSubscribeMessage()方法。
  5. 如果check_flag为true时调用wx.requestSubscribeMessage()。
  6. 然后就可以实现用户在登陆界面点击一次发送多条消息给用户。如果用户不想再次接收消息。可以在我小程序右上角三个点设置中修改即可。

5.3 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//在用户必点的地方,调用订阅消息方法
clickSubscribeMessage(){
let flag = wx.getStorageSync('checkFlag');
console.log(false);
//订阅消息
if(flag){
wx.requestSubscribeMessage({
tmplIds: ['模板id'],
success(res){
console.log(res);
},
fail(res){
console.log(res);
}
})
}
}
...
//订阅消息
subScriptionMessage(){
var that = this;
wx.requestSubscribeMessage({
tmplIds: ['模板id'],
success (res) {
if(JSON.stringify(res).indexOf("reject") != -1){
console.log("拒绝")
}
if(JSON.stringify(res).indexOf("accept") != -1){
console.log("接受")
wx.getSetting({
withSubscriptions: true,
success (res) {
console.log(res.subscriptionsSetting)
if(JSON.stringify(res.subscriptionsSetting).indexOf(workTaskTemplateId) != -1){
console.log("用户选择了“保持以上选择”")
that.checkFlag();
}
}
})
}
},
fail(res){
console.log(res);
}
})
},
...
//请求后台接口,修改check_flag
checkFlag(){
//请求后台修改check_flag 字段为true
wx.request({
url: 'xxxx',
...
success:function(res){
//如果修改成功将check_status字段放到storage中
wx.setStorageSync("checkFlag",true)
},
fail:function(res){},
})
}