1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 微信小程序订阅消息定时发送功能的实现

微信小程序订阅消息定时发送功能的实现

时间:2020-12-16 22:36:26

相关推荐

微信小程序订阅消息定时发送功能的实现

上半年,微信小程序弃用了模板消息功能,将其与订阅消息功能合并,我们在学习的过程中编写出了一种简单的定时发送订阅消息的功能。我们做的小程序是一个备忘录类型的小程序。最后的定时结果是每天固定一个时间点发送当天截止的事件。

前提

在此之前一定要在微信公众平台完成订阅消息的准备工作,即选取好一个模板或者自己创建一个适合自己的模板,然后记录好模板中的data类型和模板id。

关于订阅消息的发送:有两种方式,一种是采用HTTPS的方式调用,一种是像我们一样所采取的云函数的调用,这两种调用方式均在微信开发文档中。

实现

发送订阅消息的云函数

const cloud = require('wx-server-sdk')cloud.init({env:cloud.DYNAMIC_CURRENT_ENV})// 云函数入口函数exports.main = async (event, context) => {try{const result=await cloud.openapi.subscribeMessage.send({touser:event.openid,//此处需要在主体界面将用户的openid传参传过来page:'pages/calendars/calendars',//点击订阅模板消息会进入到的界面data:{//此处要与所选择订阅消息模板的格式对应date2:{value:event.date1},thing3:{value:event.content1},phrase5:{value:event.content1},date8:{value:event.date1}},templateId://此处为所选择的模板id})console.log(result)return result}catch(err){console.log(err)return err}}

此函数中的data里面的数据类型及名称一定要与所选取的模板消息一一对应,否则就会发送失败!!!

获取openid的云函数

const cloud = require('wx-server-sdk')cloud.init({env:cloud.DYNAMIC_CURRENT_ENV})// 云函数入口函数exports.main = async (event, context) => {const wxContext = cloud.getWXContext()return {event,openid: wxContext.OPENID,appid: wxContext.APPID,unionid: wxContext.UNIONID,}}

这个函数好像每新建一个云函数都会自动返回这三个id,其中就包括我们需要的openid。

定时功能的实现

我们的实现构想是每天固定一个时间点来寻找云数据库当中所保存的事件日期是否与当天日期一致,如果一致就执行发送订阅消息的函数,然后将这条记录从云数据库中删除。

定时函数.js

// 云函数入口文件const cloud = require('wx-server-sdk');var result = 0;cloud.init({env:cloud.DYNAMIC_CURRENT_ENV})const timedb = cloud.database();// 云函数入口函数exports.main = async (event, context) => {const wxContext = cloud.getWXContext()//获取日期var myDate=new Date();var day = myDate.getDate();var month = myDate.getMonth();month++var year = myDate.getFullYear();if(month<10) {month="0"+month}if(day<10){day="0"+day;}timedb.collection('timeList').where({date1: year+"-"+month+"-"+day}).get().then(res => {res.data.forEach(function (item) {cloud.callFunction({//调用发送模板消息的云函数,对应上边的那个发送函数name:"fasong",data:{openid:item._openid,date1:item.date1,content1:item.content1,}}).then(res =>{console.log("发送成功",res);timedb.collection('timeList').doc(item._id).remove({success: function(res) {console.log("删除成功",res);},fail: function(res) {// res 是一个对象,其中有 _id 字段标记刚创建的记录的 idconsole.log("删除失败",res);}})}).catch(res =>{console.log("发送失败",res);})})})}

定时函数.json

能定时的关键实现在于json文件中的触发器

{"permissions": {"openapi": []},"triggers": [{"name": "myTrigger","type": "timer","config": "0 50 8 * * * *"//此处为每天的八点五十刷新}]}

微信小程序的触发器采用的是cron表达式,具体格式详见微信开放文档

主体界面中函数的使用

在主体界面中我们需要上传设置提醒的数据,_id是我们云数据库中的主键,用于作为识别事件的标志。content和data1则为我们这个小程序中的事件内容。

var _id1=this.data.id;wx.requestSubscribeMessage({//获取用户的授权tmplIds: ,//此处需要填写所采用的模板id/*success(res){},fail(res){console.log("授权失败",res)}*/}).then(res =>{console.log("授权成功",res);timedb.collection('timeList').add({// data 字段表示需新增的 JSON 数据data: {_id: openid1+_id1, // 可选自定义 _id,在此处场景下用数据库自动分配的就可以了date1:date1,content1:content1,},success: function(res) {// res 是一个对象,其中有 _id 字段标记刚创建的记录的 idconsole.log("上传成功",res)},fail: function(res) {// res 是一个对象,其中有 _id 字段标记刚创建的记录的 idconsole.log("上传失败",res)}})}).catch(res=>{console.log("授权失败")}),

总结

我觉得订阅消息的这个坑在于订阅消息的模板中数据的类型,选取模板的时候一定要仔细甄别,比如其中的phrase类型就比较坑,它对应的是五个以内的汉字!!!!

还有一点就是要注意获取系统日期的格式是否与上传数据时的日期格式一致,否则最后是判断不出来的。

最后一点是一次授权只能发送一条订阅消息,也就是调用一次wx.requestSubscribeMessage只能发送一条,这是微信官方规定的。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。