微信小程序ajax轮询,微信小程序 订阅消息及云函数轮询推送

一、前言

踩坑:

1、云函数上传并部署(不上传node_modules)

2、云函数和数据库的读写权限

3、定时器一定要上传触发器!

4、云函数中的new Date()注意时区

二、订阅消息

前端弹出订阅申请让用户选择

image.png

tmplId为订阅模板ID

// remind.js

// 调起客户端小程序订阅消息界面

wx.requestSubscribeMessage({

// 需要订阅的消息模板的id的集合,一次调用最多可订阅3条消息

tmplIds: [tmplId],

success (res) {

console.log(res[tmplId])

if (res[tmplId] == 'accept') {

console.log('用户点击允许')

// 调用云函数subscribe,向云数据库插入一条记录

wx.cloud.callFunction({

name: 'addBookingMsg',

data: {

data1: 'xxxx',

data2: 'xxxx',

data3: 'xxxx',

data4: 'xxxx',

templateId: tmplId,

},

})

.then(() => {

wx.showToast({

title: '订阅成功!',

icon: 'success'

})

})

.catch((e) => {

// dothing...

console.log(e)

wx.showToast({

title: '订阅失败!',

icon: 'error'

});

})

}

if (res[tmplId] == 'reject') {

console.log('用户点击取消')

}

}

})

云函数插入记录 addBookingMsg index.js

const cloud = require('wx-server-sdk');

cloud.init();

const db = cloud.database();

exports.main = async (event, context) => {

try {

const { OPENID } = cloud.getWXContext();

const result = await db.collection('tt_booking_message_remind').add({

data: {

touser: OPENID, // 订阅者的openid

page: 'pages/home/home', // 订阅消息卡片点击后会打开小程序的哪个页面,注意这里的界面是线下小程序有的,否则跳不过去

data1: event.data1,

data2: event.data2,

data3: event.data3,

data4: event.data4,

templateId: event.templateId, // 订阅消息模板ID

isSend: false, // 消息发送状态设置为 false

},

});

return result;

} catch (err) {

console.log(err);

return err;

}

}

image.png

三、轮询推送

服务端定时查询并循环发送过滤的数据

记得一定要上传触发器!!!

image.png

云函数 发送订阅 sendCourseSubscribe config.json

{

"permissions": {

"openapi": ["subscribeMessage.send"]

},

"triggers": [

{

"name": "sendCourseTimer",

"type": "timer",

"config": "0 0/30 * * * * *"

}

]

}

云函数 发送订阅 sendCourseSubscribe index.js

const cloud = require('wx-server-sdk');

cloud.init();

const db = cloud.database();

exports.main = async (event, context) => {

try {

// 云函数中的时区为 UTC+0,不是 UTC+8,在云函数中使用时间时需特别注意。

// 如果需要默认 UTC+8,可以配置函数的环境变量,设置 TZ 为 Asia/Shanghai(云函数列表-配置-环境变量key-value)

var myDate = new Date()

// 从云开发数据库中查询等待发送的消息列表

const messages = await db.collection('tt_booking_message_remind')

.where({

isSend: false

})

.get()

// 循环消息列表依次处理下发订阅操作

const sendPromises = messages.data.map(async message => {

try {

// 发送订阅消息

await cloud.openapi.subscribeMessage.send({

"touser": message.touser,

"page": message.page,

"lang": 'zh_CN',

"data": {

"thing1": {

"value": message.data1

},

"time2": {

"value": message.data2

},

"thing3": {

"value": message.data3

},

"thing4": {

"value": message.data4

}

},

"templateId": message.templateId,

"miniprogramState": 'developer'

});

// 发送成功后将消息的状态改为已发送

return db

.collection('tt_booking_message_remind')

.doc(message._id)

.update({

data: {

isSend: true,

},

});

} catch (e) {

return e;

}

});

return Promise.all(sendPromises);

} catch (err) {

console.log(err);

return err;

}

}

image.png

至此初步完成,具体发送逻辑根据业务需求来定

谢谢阅读,有帮助的点个❤!

你可能感兴趣的:(微信小程序ajax轮询)