ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

certificate-photo 订阅消息接入全攻略:签到提醒与邀请通知的云函数实现

certificate-photo 订阅消息接入全攻略:签到提醒与邀请通知的云函数实现 certificate-photo 订阅消息接入全攻略签到提醒与邀请通知的云函数实现【免费下载链接】certificate-photo一个生成证件照的小程序微信云原生开发小程序。 只fork不star是很没品的。项目地址: https://gitcode.com/gh_mirrors/ce/certificate-photocertificate-photo 是一款基于微信云开发CloudBase的开源证件照小程序主打证件照生成、换背景、尺寸裁剪等能力前端位于 miniprogram 目录业务逻辑全部由 cloudfunctions 下的云函数承载。本文以订阅消息接入为主线完整拆解它是如何用云函数实现签到提醒与邀请成功通知的从前端wx.requestSubscribeMessage发起订阅到subscribeEvent记录订阅关系再到triggerSubscrib按模板精准下发一条微信订阅消息的完整生命周期将一目了然。为什么证件照小程序需要接入订阅消息证件照类小程序是典型的低频刚需工具用户可能一周才来一次用完即走。如果不主动触达留存率会很低。certificate-photo 的做法是签到提醒用户签到可免费获得制作次数若当天未签到则定时推送提醒把用户叫回来邀请通知用户邀请好友使用后好友打开小程序即触发通知告诉邀请者你获得奖励次数了。这两个场景都依赖微信订阅消息能力而且完全基于云函数实现不需要自建服务器非常适合新手复刻。订阅消息接入的整体架构一条消息的完整旅程整个链路可以拆成三步对应三个云函数逻辑非常清晰前端订阅用户在页面点击后调用wx.requestSubscribeMessage弹出订阅授权记录订阅微信把用户的订阅行为以subscribe_msg_popup_event事件推送给subscribeEvent云函数写入subscrib-message集合下发消息业务触发时定时签到提醒 / 邀请成功调用triggerSubscrib云函数通过cloud.openapi.subscribeMessage.send发送模板消息发送成功后立刻删除订阅记录实现一次订阅、一次推送。第一步前端如何发起订阅wx.requestSubscribeMessage 用法前端发起订阅非常简单两个页面各负责一个模板。签到提醒模板在我的页面 miniprogram/pages/mein/mein.js 的subscribeSign函数中用户点击签到时先请求订阅授权const tmplIds [h_P9sODh-NfeXteA5t7h6sS9BAIjtEyppGwt-biQIQ0] wx.requestSubscribeMessage({ tmplIds: tmplIds, success: (res) { if (res[tmplIds[0]] accept) { wx.showToast({ title: 订阅成功 }) } } })邀请成功通知模板则在分享页 miniprogram/pages/share/share.js 的subscribeMessage中用户打开分享页即可订阅模板 ID 为CNuffKDjmxEOU_hM44Cu0KoGqOjfdacpbk4LT1abcnE。 小提示wx.requestSubscribeMessage必须由用户主动点击触发且订阅结果只有accept同意才会被记录。第二步subscribeEvent 云函数把订阅记录写入数据库用户同意订阅后微信会向小程序推送subscribe_msg_popup_event事件。该事件由 cloudfunctions/subscribeEvent/index.js 接收代码里注释了完整的 event 结构核心逻辑只有两步判断List.SubscribeStatusString ! accept直接返回只处理同意订阅的用户把openid、模板 IDtmplId和订阅时间写入subscrib-message集合。if (event.List.SubscribeStatusString ! accept) return db.collection(subscrib-message).add({ data: { openid: event.userInfo.openId, tmplId: event.List.TemplateId, time: event.CreateTime } })这段代码的价值在于数据库里始终只有真正同意订阅的用户后续所有推送都基于这张表避免向未授权的用户发消息导致失败。第三步triggerSubscrib 云函数按模板精准下发消息发送动作统一收敛在 cloudfunctions/triggerSubscrib/index.js它接收{ openid, tmplId }调用微信开放接口cloud.openapi.subscribeMessage.send下发模板消息const result await cloud.openapi.subscribeMessage.send({ touser: event.openid, templateId: tmplId, ...getMessageData(tmplId) })最巧妙的是getMessageData(tmplId)函数——它是一个以模板 ID 为 key 的映射表每个模板对应自己的跳转页面和字段内容邀请成功CNuffKDjmxEOU_...跳转/pages/share/share展示邀请成功奖励 3 次使用机会签到提醒h_P9sODh-...跳转/pages/mein/mein字段为今日未签到 / 1次免冠照片制作 / 点击立即签到。这样新增模板时只需往映射表里加一条记录业务代码零改动可维护性极佳。场景一签到提醒定时推送的云函数实现签到提醒由定时触发的 cloudfunctions/timingTriggerSignMessage/index.js 实现它是整个方案里最值得学习的一段查出所有订阅过签到模板的用户subscrib-message中tmplId匹配对每个用户查user集合判断signInDate是否等于今天今天已签到的跳过未签到的调用triggerSubscrib推送提醒。async function getSignStatus (openid) { const { data } await db.collection(user).where({ openid }).get() if (data[0].signInDate new Date().toDateString()) return trigger(openid) }配合云函数的定时触发器config.json中的triggers配置即可实现每天早上自动提醒未签到用户。注意这里日期用toDateString()做按天比较避免了跨时区的时间格式坑。场景二邀请成功通知的自动触发邀请场景的链路稍微复杂由 cloudfunctions/shareUpdate/index.js 承接。当被邀请者打开小程序时判断event.shareOpenid ! wxContext.OPENID避免自己邀请自己调用triggerMessage检查该用户是否已在邀请列表中未邀请过才触发triggerSubscrib推送邀请成功通知用addToInviteesTodayList将新用户addToSet进邀请者的invitedList防止重复计数最后setParent给新用户设置上级邀请人形成推荐关系链。奖励下发放到了 cloudfunctions/shareSuccessCallback/index.js更新share集合成功后调用useCount云函数给邀请者加 3 次制作次数同时useCount中通过_.inc累加count字段签到则额外写入signInDate。整个邀请-通知-发奖闭环一气呵成。发送成功自动清理避免重复打扰订阅消息是一次性的发完即失效。certificate-photo 在triggerSubscrib中做了一个非常规范的处理——send返回errCode 0时立刻删除该用户在subscrib-message中的订阅记录if (result.errCode 0) { await db.collection(subscrib-message).where({ openid: event.openid, tmplId: tmplId }).remove() }这样一来订阅记录天然成为待发配额发一条少一条数据库不会无限膨胀用户下次进入页面会看到未订阅状态可再次引导订阅。分享页 share.js 中的getSubscribeStatus正是通过查询这张表剩余记录数来展示已订阅/未订阅状态的。新手避坑清单最后整理几个接入订阅消息最容易踩的坑帮助你少走弯路模板 ID 必须对应每个模板的字段phrase6、thing7等要与微信后台申请时完全一致字段名或取值不匹配会直接发送失败订阅必须用户触发wx.requestSubscribeMessage不能在onLoad等非交互时机调用否则接口直接报错一次性订阅用完即删务必像本项目中那样发送成功后清理记录否则大量失效记录会影响后续推送的准确率定时触发器记得配签到提醒依赖config.json中的triggers定时配置本地调试时可用wx.cloud.callFunction手动调用一次验证逻辑openid 不要硬编码云函数内优先用cloud.getWXContext().OPENID获取当前用户跨用户操作如给邀请者发消息才用event传入的 openid。总结certificate-photo 的订阅消息方案虽然代码量不大但把前端订阅 → 事件落库 → 按模板下发 → 发后清理这条链路设计得十分完整且签到提醒、邀请通知两个真实业务场景都给出了可直接照抄的云函数实现。如果你正在开发微信云开发小程序想接入订阅消息做用户召回或增长裂变直接参考本文提到的几个云函数subscribeEvent、triggerSubscrib、timingTriggerSignMessage、shareUpdate几乎可以零成本迁移到自己的项目中。【免费下载链接】certificate-photo一个生成证件照的小程序微信云原生开发小程序。 只fork不star是很没品的。项目地址: https://gitcode.com/gh_mirrors/ce/certificate-photo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表