订阅号获取openid_免费直播课预告:搭建小程序订阅消息系统

本文介绍了如何利用小程序·云开发实现订阅消息功能,包括订阅和退订交互、消息存储、定时发送及退订操作。通过实战步骤,讲解了从准备小程序账号、导入项目、配置到实现各个功能点的详细过程,旨在帮助开发者快速搭建订阅消息系统。
摘要由CSDN通过智能技术生成

小程序·云开发实战直播课是由腾讯云云开发和微信极客WeGeek 联合举办的免费课程,旨在为微信小程序开发者提供云到端的一站式解决方案,降低技术门槛、减少研发成本、提升开发效率,以协助开发者快速搭建稳定高质量的微信小程序应用。

本次直播课将会演示如何使用云开发快速为小程序加入订阅消息能力,在实战环节会带领大家搭建一个具备订阅消息管理能力的开课提醒小程序

基础知识点

 1  小程序·云开发介绍

“小程序·云开发”由微信团队和腾讯云联合打造的“应用服务中台”,秉承高效、易用、安全、低成本的服务理念,整合了微信公众平台和腾讯云的核心技术,提供云数据库、云存储、云函数、日志和监控等开发运维能力。通过“小程序·云开发”,开发者可无缝安全调用小程序的开放服务,提升开发效率,快速试错和落地产品。

 2  订阅消息介绍

微信官方提供了订阅消息能力,以便实现开发者实现服务的闭环和更优的体验。可以支持在用户自主订阅后,推送消息到用户端(服务通知),用户点击查看详情可跳转至小程序的页面,实现服务的闭环,提高活跃度和用户粘性

准备工作

 1  准备小程序账号和开发工具

温馨提示:本次的实战的案例里用到了“订阅课程开课提醒”这个订阅消息模板,需要小程序服务类目里包含 “教育 > 在线教育”,可以在服务类目中加入此类目。后续生产环境中可根据自己的场景选择合适的服务类目和订阅消息模板。

1. 已经申请微信小程序(在服务类目中加入“教育 > 在线教育”),获取小程序  AppID 2. 下载  开发版  微信开发者工具( Nightly Build (Windows 64、Windows 32、macOS))

3. 在微信公共平台的 "订阅消息"中申请一个开课提醒订阅消息模板,获得消息模板ID,字段的内容和顺序需要按下图所示:e3dfb67bcff357a46044db85c350a35f.png

 2  下载并导入初始项目的源代码

此次课程的项目源代码压缩包可 在公众号回复"订阅消息"获得 。解压源代码压缩包后,可以看到 “第六期课程资料”⽂件夹下有两个⽂件夹,分别为 init(此次活动的实战初始代码)和 intact(完成后的完整代码)。

点击开发者工具工具栏项目-导入项目,项目名称可以任意填写比如“小程序订阅消息系统”,项目路径为之前解压出来的 “第六期课程资料”文件夹里面的 init 文件夹,AppID 使用之前准备好的小程序 AppID。

 3  配置项目

1. 打开云开发控制台,在数据库管理页新建⼀个 messages   集合。

2. 修改 pages/index/index 里面的 lessonTmplId 变量的值为准备好的消息模板IDc75ad3667c1fdaa47f745db2dfd5829c.png

 4  了解本次实战的整体流程图1a793331717ee578ef2c4ceafc17d676.png

搭建步骤

 1  小程序前端实现订阅和退订交互

136bbc57f72c0d40877b665388ce3e87.png打开 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,              });            });        }

1a4a2d00cdd6fbaeb4c7c7565af53f55.png在 “@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 云函数。

 2  实现订阅消息存储

048ebaf215eaf2caf063b67e756a07b4.png打开 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 集合,并且做到了防止同一门课程重复订阅的问题。

 3  实现订阅消息的定时发送

7cb6c0d1b34dc4f021c81d40041914bd.png打开 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;  }

f27adce202bf5533a05999348074b2e6.png打开 cloudfunctions/send/config.json,在其中加入如下配置:

  "triggers": [    {      "name": "sendMessagerTimer",      "type": "timer",      "config": "0 * * * * * *"    }  ]

加入这个配置之后,需要使用前面下载的开发版的开发者工具,部署一下函数,将定时触发器发布出去。根据我们的配置,每分钟都运行一次 send 函数,在 send 函数中,我们会将消息集合中满足发送条件的订阅消息通过云调用推送出去。

 4  实现订阅消息的退订

a7ad052bc712a0b6b431fd5de353b6af.png

打开 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进行直播演练,欢迎大家扫码进微信群观看,并参与交流。

caffa871c0cc20216a34245b2c3021f9.png

推荐阅读:

a8e88e7c9edaaa434ec2642573a5acff.png

bd5cb5edf7faf4d4d724469a59eef8bd.png

bee9536ab6db9fa330207d74d2376e40.gif

7ca7bf2195d5c3dc03ee5acf6e0c5527.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值