阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > 小程序的推送与消息通知

小程序的推送与消息通知

作者:陈川 阅读数:62223人阅读 分类: 微信小程序

小程序的推送与消息通知

小程序推送与消息通知是提升用户留存和活跃度的重要手段。合理利用推送功能可以及时触达用户,但过度推送可能导致用户反感甚至卸载。微信小程序提供了多种消息推送方式,开发者需要根据业务场景选择合适的方式。

消息类型与使用场景

微信小程序主要支持以下几种消息类型:

  1. 模板消息(已逐步被订阅消息替代)
  2. 订阅消息(长期订阅和一次性订阅)
  3. 客服消息
  4. 统一服务消息

订阅消息是目前主要使用的推送方式,适用于订单状态变更、物流信息、服务提醒等场景。例如电商小程序可以在用户下单后发送支付成功通知:

// 发送订阅消息示例
wx.requestSubscribeMessage({
  tmplIds: ['订单状态变更模板ID'],
  success(res) {
    if (res['订单状态变更模板ID'] === 'accept') {
      // 用户同意订阅,可以发送消息
      wx.cloud.callFunction({
        name: 'sendSubscribeMessage',
        data: {
          templateId: '订单状态变更模板ID',
          page: 'pages/order/detail?id=123',
          data: {
            thing1: { value: '您的订单已支付成功' },
            amount2: { value: '99.00' },
            time3: { value: '2023-05-20 14:30' }
          }
        }
      })
    }
  }
})

订阅消息的实现

一次性订阅消息

一次性订阅需要用户每次主动触发,适合低频重要通知。实现步骤:

  1. 获取模板ID
  2. 前端调用wx.requestSubscribeMessage
  3. 后端调用subscribeMessage.send接口
// 前端请求用户授权
Page({
  onPaySuccess() {
    wx.requestSubscribeMessage({
      tmplIds: ['模板ID1', '模板ID2'],
      success(res) {
        console.log('订阅结果', res)
      }
    })
  }
})

长期订阅消息

仅限政务、医疗、教育等特定类目使用,需要额外申请权限。

消息发送限制与策略

微信对消息推送有严格限制:

  1. 一次性订阅消息7天内有效
  2. 每个用户每天接收同一模板的消息不超过3条
  3. 同一用户同一模板的订阅消息7天内最多发送5条

优化策略

  • 合并通知内容,减少发送频次
  • 设置消息免打扰时段(如23:00-8:00)
  • 提供消息偏好设置,让用户自主选择

服务端实现示例

Node.js发送订阅消息示例:

const cloud = require('wx-server-sdk')
cloud.init()

exports.main = async (event, context) => {
  try {
    const result = await cloud.openapi.subscribeMessage.send({
      touser: event.userOpenId,
      templateId: event.templateId,
      page: event.page,
      data: event.data
    })
    return result
  } catch (err) {
    console.error(err)
    return err
  }
}

消息模板设计技巧

好的消息模板应遵循以下原则:

  1. 简洁明了:核心信息前置
  2. 行动导向:包含明确操作指引
  3. 个性化:加入用户专属信息

示例模板:

{{thing1.DATA}}(状态更新)
金额:{{amount2.DATA}}
时间:{{time3.DATA}}
点击查看详情

异常处理与监控

必须实现的监控点:

  1. 消息发送成功率
  2. 用户点击率
  3. 订阅拒绝率
  4. 消息送达延迟
// 监控消息发送状态
wx.onMessageSentCallback(res => {
  if (res.errCode === 0) {
    // 发送成功
    reportAnalytics('message_sent', { templateId: res.templateId })
  } else {
    // 发送失败
    reportAnalytics('message_failed', {
      templateId: res.templateId,
      errCode: res.errCode
    })
  }
})

用户偏好管理

提供用户控制选项可显著降低退订率:

Page({
  data: {
    messageSettings: {
      orderNotify: true,
      promotionNotify: false,
      systemNotify: true
    }
  },
  
  toggleSetting(e) {
    const type = e.currentTarget.dataset.type
    this.setData({
      [`messageSettings.${type}`]: !this.data.messageSettings[type]
    })
    // 同步到服务端
    wx.request({
      url: 'https://api.example.com/settings',
      method: 'POST',
      data: this.data.messageSettings
    })
  }
})

消息推送最佳实践

  1. 场景化推送:根据用户行为触发相关消息

    • 购物车放弃:2小时后提醒
    • 课程开始前:15分钟提醒
  2. A/B测试:对比不同文案效果

    // 随机选择消息模板
    const templates = ['templateA', 'templateB']
    const selectedTemplate = templates[Math.floor(Math.random() * templates.length)]
    
  3. 链路追踪:添加UTM参数

    pages/order/detail?id=123&utm_source=message&utm_medium=push
    

特殊场景处理

多端同步

用户可能在多个设备登录,需要同步消息状态:

// 使用云数据库标记已读状态
const db = wx.cloud.database()
db.collection('user_messages').doc(messageId).update({
  data: {
    read: true,
    readTime: new Date()
  }
})

国际化消息

根据用户语言设置发送不同内容:

function getMessageTemplate(locale) {
  const templates = {
    'zh_CN': {
      paymentSuccess: '支付成功'
    },
    'en_US': {
      paymentSuccess: 'Payment successful'
    }
  }
  return templates[locale] || templates['zh_CN']
}

性能优化

大量消息发送时的优化方案:

  1. 队列处理:使用消息队列控制发送速率
  2. 批量发送:合并相同模板的消息
  3. 延迟发送:非紧急消息延迟处理
// 使用云函数批量处理
const batchSize = 100
const messages = [...] // 待发送消息数组

for (let i = 0; i < messages.length; i += batchSize) {
  const batch = messages.slice(i, i + batchSize)
  await processBatch(batch)
}

async function processBatch(batch) {
  return Promise.all(batch.map(msg => sendMessage(msg)))
}

合规与用户体验

必须遵守的规则:

  1. 不得发送营销内容
  2. 重要操作需二次确认
  3. 提供明显的退订入口

示例合规检查:

function validateMessageContent(content) {
  const forbiddenWords = ['促销', '打折', '限时']
  return !forbiddenWords.some(word => content.includes(word))
}

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益,请来信告知我们删除。邮箱:cc@cccx.cn

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌