小程序云开发,订阅消息定时批量发送实现代码

it2025-02-03  32

需求:做一个类似抽奖结果通知的订阅消息提醒

实现流程:

每个用户需要先授权订阅消息接收,授权成功后把数据存到云开发的数据集合里面,再写个定时器,遍历数据集合的所有数据,拿到后遍历发送订阅消息,发送成功后删除该数据。

下面看看实现操作和代码:

1. 创建云开发环境,创建数据集合 msg , 数据权限改成自定义,全部可修改

2.小程序授权和提交用户信息的代码(data 为订阅消息的字段,用户Openid,订阅消息跳转的页面),

wx.requestSubscribeMessage({ tmplIds: ['DYvZoya_RukdkznIQchLWsD296UujyU_pCFGRXa9nnw'], success (res) { wx.cloud.callFunction({ name: "sendMsg", data: { thing5: '111', thing1: '22', name2: '33', thing6: '44', openid: 'oESJb5LTR0lu7rUn9mVpAt-xEu2k', page: 'pages/index/index', }, success(res) { console.log('个人信息-------------', res) }, fail(err) { console.log('个人信息-------------', err) } }) } })

3.储存数据的云函数,新建一个云函数 sendMsg,代码:

const cloud = require('wx-server-sdk') cloud.init({ env: 'shijihyj-5g7mfb4z4011210a ' }) const db = cloud.database() exports.main = async (event, context) => { db.collection('msg').add({ // data 字段表示需新增的 JSON 数据 data: { thing5: event.thing5, thing1: event.thing1, name2: event.name2, thing6: event.thing6, openid: event.openid, page: event.page, } }) .then(res => { console.log(res) return res }) .catch(console.error) }

4.再创建定时器 myTrigger

{ "permissions": { "openapi": [ "subscribeMessage.send" ] }, "triggers": [ { "name": "myTrigger", "type": "timer", "config": "10 * * * * * *" } ] }

js

const cloud = require('wx-server-sdk') cloud.init({ env: 'shijihyj-5g7mfb4z4011210a ' }) const db = cloud.database() var sendMsg = async (item) =>{ const result = await cloud.openapi.subscribeMessage.send({ touser: item.openid, page: item.page, lang: 'zh_CN', data: { thing5: { value: item.thing5 }, thing1: { value: item.thing1 }, name2: { value: item.name2 }, thing6: { value: item.thing6 } }, templateId: 'DYvZoya_RukdkznIQchLWsD296UujyU_pCFGRXa9nnw', }) const remove = await db.collection('msg').where({ openid: item.openid }).remove() } const MAX_LIMIT = 100 exports.main = async (event, context) => { // 先取出集合记录总数 const countResult = await db.collection('msg').count() const total = countResult.total // 计算需分几次取 const batchTimes = Math.ceil(total / 100) // 承载所有读操作的 promise 的数组 const tasks = [] for (let i = 0; i < batchTimes; i++) { const promise = db.collection('msg').skip(i * MAX_LIMIT).limit(MAX_LIMIT).get() tasks.push(promise) } // 等待所有 var arr = (await Promise.all(tasks)).reduce((acc, cur) => { return { data: acc.data.concat(cur.data), errMsg: acc.errMsg, } }) for(var i =0;i<arr.data.length;i++){ sendMsg(arr.data[i]) } }

提交就完成了

 

 

 

 

 

 

 

 

 

 

 

 

最新回复(0)