消息能力是小程序能力中的重要组成部分,微信官方提供了订阅消息能力,以便实现开发者实现服务的闭环和更优的体验。能够支持在用户自主订阅后,推送消息到用户端(服务通知),用户点击查看详情可跳转至小程序的页面,实现服务的闭环,提升活跃度和用户粘性html
本次课程会演示如何使用云开发快速为小程序加入订阅消息能力,在实战环节会带领你们搭建一个具有用户订阅、消息去重、定时发送、用户退订等订阅消息管理能力的开课提醒小程序,学习完成后同窗们将掌握:前端
“小程序·云开发”由微信团队和腾讯云联合打造的“应用服务中台”,秉承高效、易用、安全、低成本的服务理念,整合了微信公众平台和腾讯云的核心技术,提供云数据库、云存储、云函数、日志和监控等开发运维能力。经过“小程序·云开发”,开发者可无缝安全调用小程序的开放服务,提高开发效率,快速试错和落地产品。数据库
微信官方提供了订阅消息能力,以便实现开发者实现服务的闭环和更优的体验。能够支持在用户自主订阅后,推送消息到用户端(服务通知),用户点击查看详情可跳转至小程序的页面,实现服务的闭环,提升活跃度和用户粘性json
舒适提示:本次的实战的案例里用到了 “订阅课程开课提醒” 这个订阅消息模板,须要小程序服务类目里包含 “教育 > 在线教育”,能够在服务类目中加入此类目。后续生产环境中可根据本身的场景选择合适的服务类目和订阅消息模板。
这次活动的项目源代码压缩包可关注公众号 [微信极客WeGeek] 回复"订阅消息"得到。解压源代码压缩包后,能够看到 “第六期课程资料”⽂件夹下有两个⽂件夹,分别为 init(这次活动的实战初始代码)和 intact(完成后的完整代码)。小程序
点击开发者工具工具栏项目-导入项目,项目名称能够任意填写好比“小程序订阅消息系统”,项目路径为以前解压出来的 “第六期课程资料”文件夹里面的 init 文件夹,AppID 使用以前准备好的小程序 AppID。微信小程序
配置项目api
messages
集合。pages/index/index
里面的 lessonTmplId 变量的值为准备好的消息模板ID 打开 miniprogram/pages/index/index.js
,在“@todo 实现订阅逻辑” 下方粘贴以下代码:安全
// 获取课程信息 const item = e.currentTarget.dataset.item; // 调用微信 API 申请发送订阅消息 wx.requestSubscribeMessage({ // 传入订阅消息的模板id,模板 id 可在小程序管理后台申请 tmplIds: [lessonTmplId], success(res) { // 申请订阅成功 if (res.errMsg === 'requestSubscribeMessage:ok') { // 这里将订阅的课程信息调用云函数存入db wx.cloud .callFunction({ name: 'subscribe', data: { ...item, data: { thing2: {value: item.title}, date5: {value: item.startTimeString}, phrase4: {value: item.teacher}, thing3: {value: item.description}, }, templateId: lessonTmplId, }, }) .then(() => { wx.showToast({ title: '订阅成功', icon: 'success', duration: 2000, }); }) .catch(() => { wx.showToast({ title: '订阅失败', icon: 'success', duration: 2000, }); }); }
在 “@todo 实现取消订阅逻辑” 下方粘贴以下代码:微信
// 获取课程信息 const item = e.currentTarget.dataset.item; // 这里将订阅的课程信息调用云函数存入db wx.cloud .callFunction({ name: 'unsubscribe', data: { id: item.id, templateId: lessonTmplId, }, }) .then(() => { wx.showToast({ title: '取消订阅成功', icon: 'success', duration: 2000, }); }) .catch(() => { wx.showToast({ title: '取消订阅失败', icon: 'success', duration: 2000, }); });
实现完这两个方法以后,在真机上面点击订阅的时候,会首先发起订阅消息的受权,成功以后会请求咱们的 subscribe 云函数,在退订时会请求咱们的 unsubscribe
云函数,微信开发
打开 cloudfunctions/subscribe/index.js
, 在 “@todo 将消息内容存储在 messages 集合,并作去重” 下方粘贴以下代码:
// 防止重复存储 let message = await db .collection('messages') .where({ id: event.id, touser: OPENID, templateId: event.templateId, }) .get(); if (message.data.length) { return message; } // 在云开发数据库中存储用户订阅的信息 const result = await db.collection('messages').add({ data: { ...event, touser: OPENID, page: 'index', done: false, // 消息发送状态设置为 false }, }); return result;
在这里咱们实现了用户订阅信息存储在 messages 集合,而且作到了防止同一门课程重复订阅的问题。
打开 cloudfunctions/send/index.js
, 在“@todo 实现定时发送订阅消息逻辑”下方粘贴如下代码
try { // 从云开数据库中查询等待发送的消息列表 const messages = await db .collection('messages') .where({ done: false, // 课程开始时间前半小时以内 startTime: _.lte(new Date().getTime() + 30 * 60 * 1000), }) .get(); // 循环消息列表 const sendPromises = messages.data.map(async message => { try { // 发送订阅消息 await cloud.openapi.subscribeMessage.send({ touser: message.touser, page: message.page, data: message.data, templateId: message.templateId, }); // 发送成功后将消息的状态改成已发送 return db .collection('messages') .doc(message._id) .update({ data: { done: true, }, }); } catch (e) { return e; } }); return Promise.all(sendPromises); } catch (err) { console.log(err); return err; }
打开 cloudfunctions/send/config.json
,在其中加入以下配置:
"triggers": [ { "name": "sendMessagerTimer", "type": "timer", "config": "0 * * * * * *" } ]
加入这个配置以后,须要使用前面下载的开发版的开发者工具,部署一下函数,将定时触发器发布出去。根据咱们的配置,每分钟都运行一次 send 函数,在 send 函数中,咱们会将消息集合中知足发送条件的订阅消息经过云调用推送出去。
打开 cloudfunctions/unsubscribe/index.js
, 在 "@todo 删除订阅的消息" 下方粘贴如下代码
// 删除订阅的消息 const result = await db .collection('messages') .where({ touser: OPENID, templateId: event.templateId, id: event.id, }) .remove(); return result;
实现了对指定用户对某个课程的订阅,定时触发时不会再给该用户发送消息,实现了退订的功能
搭建过程大体是这样,但还有一些细节没有在文章说起。关于项目的具体实操,咱们将在11月28日(周四)20:00进行直播演练,欢迎你们扫码进微信群观看,并参与交流。