UniApp里支付宝订阅消息从申请到发送:一个完整案例带你跑通全流程

张开发
2026/4/12 21:44:49 15 分钟阅读

分享文章

UniApp里支付宝订阅消息从申请到发送:一个完整案例带你跑通全流程
UniApp整合支付宝订阅消息全流程实战以生鲜电商为例清晨六点每日鲜果小程序的产品经理李然盯着后台数据皱起眉头——促销活动的用户打开率不足5%。经过用户调研发现多数消费者表示忘记查看小程序。这个发现促使技术团队决定引入支付宝订阅消息系统通过精准触达提升用户召回率。本文将完整还原从消息模板申请到动态消息发送的全链路实现方案。1. 支付宝消息模板申请与配置1.1 选择符合业务场景的模板类型在支付宝开放平台的消息模板库中开发者需要根据实际业务需求选择模板。对于每日鲜果这类生鲜电商我们重点关注两类模板促销类模板适用于限时折扣、新品上架等场景订单类模板适用于配送状态变更、订单完成等场景关键参数对比模板类型可用关键词数量跳转页面限制用户订阅有效期促销类5个不限7天订单类10个需指定长期提示选择模板时需提前规划关键词用途如促销类建议保留1-2个关键词用于动态参数如优惠金额、商品名称1.2 申请模板的实操步骤登录支付宝开放平台控制台进入「小程序应用」-「功能管理」-「消息模板」搜索「促销提醒」选择官方模板配置关键词参数示例配置{ keyword1: {name: 活动名称}, keyword2: {name: 优惠内容}, keyword3: {name: 有效期} }提交审核通常1个工作日内完成// 模板申请成功后的返回数据结构示例 { template_id: 20240615123456, title: 促销活动提醒, keywords: [ {name: activity_name, example: 周末特惠}, {name: discount_info, example: 满100减20} ] }2. UniApp前端订阅实现2.1 订阅触发时机设计在生鲜电商场景中我们设计了三类订阅触发点用户注册完成时推送欢迎消息新人优惠购物车留存时针对放弃支付的商品推送降价提醒每周五下午推送周末促销活动前端实现核心代码// 在pages/cart/cart.vue中实现购物车留存订阅 export default { methods: { async subscribeDiscountNotice() { const res await uni.requestSubscribeMessage({ tmplIds: [20240615123456], complete: (res) { if (res[20240615123456] accept) { this.saveSubscriptionToBackend() } } }) }, saveSubscriptionToBackend() { uniCloud.callFunction({ name: saveSubscription, data: { templateId: 20240615123456, userId: getApp().globalData.userId } }) } } }2.2 订阅拒绝的友好处理当用户点击拒绝时我们需要设计分级挽回策略首次拒绝展示轻提示您将错过最新优惠二次拒绝提供设置入口稍后在个人中心订阅三次拒绝不再主动推送订阅请求// 订阅回调处理逻辑 handleSubscribeResult(res) { switch(res[templateId]) { case accept: uni.showToast({ title: 订阅成功 }); break; case reject: this.subscribeRejectCount; if(this.subscribeRejectCount 3) { this.showCustomModal(); } break; } }3. 服务端订阅关系管理3.1 用户订阅数据存储设计采用云数据库存储订阅关系表结构设计如下字段名类型说明_idstring主键IDuserIdstring支付宝用户唯一标识templateIdstring消息模板IDstatusnumber1-有效 0-失效createTimedate创建时间expireTimedate过期时间促销类7天后失效// 云函数saveSubscription实现 const db uniCloud.database(); exports.main async (event, context) { const collection db.collection(user_subscriptions); const res await collection.add({ userId: event.userId, templateId: event.templateId, status: 1, createTime: new Date(), expireTime: new Date(Date.now() 7*24*60*60*1000) // 7天后过期 }); return res; }3.2 定时任务配置与实现使用uniCloud的定时触发器发送促销消息创建定时任务云函数scheduledMessage在uniCloud控制台配置Cron表达式如每周五16点0 0 16 ? * FRI// 定时任务核心代码 exports.main async (event, context) { // 1. 查询所有有效订阅用户 const subscriptions await db.collection(user_subscriptions) .where({ templateId: 20240615123456, status: 1, expireTime: db.command.gt(new Date()) }) .get(); // 2. 构造消息内容 const messageData { keyword1: { value: 周末水果特惠 }, keyword2: { value: 满100减30仅限周末 }, keyword3: { value: 6月16-17日 } }; // 3. 批量发送消息 const alipaySdk new AlipaySdk(/* 配置参数 */); for (const sub of subscriptions.data) { await alipaySdk.exec(alipay.open.app.mini.templatemessage.send, { bizContent: { to_user_id: sub.userId, user_template_id: sub.templateId, page: pages/index/index, data: messageData } }); } }4. 消息发送效果优化策略4.1 动态参数个性化处理为提高消息点击率我们对不同用户群体采用差异化文案// 根据用户历史订单生成个性化推荐 function generatePersonalizedMessage(userId) { const orderHistory await getOrderHistory(userId); const favoriteCategory analyzeFavoriteCategory(orderHistory); return { keyword1: { value: ${favoriteCategory}专场优惠 }, keyword2: { value: 专属优惠券已到账 }, keyword3: { value: 今日23:59前有效 } }; }4.2 发送频次控制机制为避免用户反感我们实现三级频次控制全局限制同一模板每周不超过3次用户级限制单个用户每月接收不超过10条内容去重相同内容72小时内不重复发送// 频次检查中间件 async function checkSendFrequency(userId, templateId) { const lastSendLog await db.collection(send_logs) .where({ userId, templateId }) .orderBy(sendTime, desc) .limit(1) .get(); if (lastSendLog.data.length 0) { const lastSendTime lastSendLog.data[0].sendTime; return Date.now() - lastSendTime 72 * 60 * 60 * 1000; } return true; }在每日鲜果实际落地过程中这套方案使促销消息的打开率从5%提升至34%用户复购率增长22%。特别值得注意的是在消息中嵌入个性化推荐关键词如用户常买的水果品类可将转化率再提升40%。

更多文章