uniCloud云开发–实现微信小程序订阅消息

微信token定时获取

思路

-先新建云函数getWxToken,通过触发器定时 每2小时获取token 。因为微信小程序服务端api 基本都要token认证,有效期只有2小时
-其次定时获取后存数据库中,方便其他地方统一调用。而不会出现相互调用出现token失效问题

代码截图

新建云函数

新建云函数

触发器设置

登录unicloud 后台管理界面,找到云函数点击详情设置
新建云函数

注意要对应的 appid appsecret 。其他这里没什么好说的, 弄过原生微信小程序云开发的应该很好上手。 没弄过的 看文档,我这就贴出代码, 照着写即可。

发送订阅消息

创建云函数sendTempMessage 。先数据库获取token,在去调用微信的发送api ,代码如下

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
     'use strict';
const db = uniCloud.database()
exports.main = async (event, context) => {
//event为客户端上传的参数
console.log('event : ', event)
let select_data = await db.collection('token').where({
name:'wx_token',
}).get();
console.log(select_data.data[0].token);
const token = select_data.data[0].token;
const openid = 'xx'; // 小程序里用户的openid
const date = event.date;
const startLocation = event.startLocation;
const time = event.time;
const desc = event.desc;
const endLocation = event.endLocation;
const url = `https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=${token}`;
console.log(url)
const res = await uniCloud.httpclient.request(url,{
method:"POST",
contentType: 'json',
dataType:"json",
data:{
touser: openid,
page: 'index',
lang: 'zh_CN',
data: {
date14: {
value: date
},
time9: {
value: time
},
thing17:{
value:startLocation
},
thing18:{
value:endLocation
},
thing21:{
value:desc
}
},
template_id:'xxx', //自己申请的模板id
miniprogramState:'developer'
}
})
return res;
};

vue页面里有个按钮@click=’sendMessage’,点击先获取订阅权限。 准许后在调用云函数

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
  sendMessage() {
uni.requestSubscribeMessage({
tmplIds: ['xxx'], //申请的消息模板id
success:(res) =>{
if (res['xxx'] === 'accept') {
uniCloud.callFunction({
name: 'sendTempMessage',
data: {
date: '2020-12-22',
startLocation: '北京火车站',
time: '09:11',
desc: '测试订阅消息',
endLocation: '上海火车站',
}
}).then((res) => {
console.log(res);
})
} else {
uni.showModal({
title: '提示!',
content: '您拒绝授权,将不会发生消息通知他人',
confirmText: '确定',
cancelText: '再授权一次',
success: (result) => {
if (!result.confirm) {
this.sendMessage();
}
}
})
}
}

})

}

###发送成功界面

订阅消息成功

之前用的是微信小程序原生的云开, 这次记录一下 用uniapp 的unicloud来实现云开发的过程。简单说一下 使用感受吧。
-uniapp 基于vue 2.0 来进行跨端,利用vue的优势,编写代码比原生快。
-uniapp unicloud 集成了很多功能。例如短信验证使用方便,还是跨端的云开发。
-原生微信小程序云开发,云函数调用更加的方便,可以免token校验。包括openId的获取 都是一行代码搞定,就不一会出现下面的问题
-细心的人可能看到我在使用unicloud 开发的时候。由于没有缓存的原因,只能存在数据库里,需要 对token 频繁的读写。那在用户多的时候,可能增加了云数据库的读取限制。从而增加云开发成本。