微信小程序订阅消息提醒-云函数

server/2025/1/15 18:40:49/

小程序>微信小程序消息订阅分2种:

1.一次性订阅:用户订阅一次就可以推送一次,如果需要多次提醒需要多次订阅。

2.长期订阅:只有公共服务领域,如政务、医疗、交通、金融和教育等。‌在用户订阅后,在很长一段时间内多次推送消息。

步骤:

1.微信公众平台选择消息模板,选用后,我的模板-查看详情里会有模板id,消息格式等信息,代码里会用到

2.微信开发者工具

(1)订阅消息按钮

// index.wxml<button bindtap="requestMessage" type="default" disabled="{{isAdded}}">{{isAdded ? '已订阅新任务提醒':'订阅新任务提醒'}}</button>

(2)点击按钮事件引导用户授权

async requestMessage() {wx.requestSubscribeMessage({tmplIds: ['xxxxxx'],   // xxxxxx填选用的模板IDsuccess: (res) => {if (res[templateId] === 'accept') {// 用户同意this.saveOpenId() // 记录用户openId,页面可以以此判断用户有无订阅消息wx.showToast({title: '授权成功'})} else if (res[templateId] === 'reject'){// 用户拒绝,弹窗和用户确认是否取消订阅(防止用户误操作)引导用户去设置界面重新订阅this.setData({showSetModel: true // 自定义弹窗})} else {wx.showToast({title: '授权订阅信息有误'})}},fail: (err) => {// 20004:用户关闭了主开关,无法进行订阅,引导开启if(err.errCode === 20004) {this.setData({showSetModel: true})} else {wx.showModal({title: '提示',content: err.errMsg,showCancel: false})}},})},

如果用户点击拒绝,引导用户去设置页打开开关

// index.wxml<view class="jumpSetModel" wx:if="{{showSetModel}}"><view class="box"><view class="title">提示</view><view class="content">您已取消订阅通知消息,如果想重新订阅该消息可以点击去设置开启</view><view class="button"><button class="cancel" catchtap="closeSetModel">不了</button><button class="confirm" open-type="openSetting" bindopensetting="openSetCallback">去设置</button></view></view></view>
// 用户从设置页返回会触发下面的事件,从而得知用户有没有打开开关openSetCallback (callback) {wx.getSetting({withSubscriptions: true,success: res => {const tempId = 'xxx' //templateId// 判断用户允许或拒绝总是保持是否推送消息的选择, 如果选择过的话再点击就不显示了,判断有没有itemSettings并且有没有这个订阅消息的模板idif (res.subscriptionsSetting.itemSettings && res.subscriptionsSetting.itemSettings[tempId]) {if (res.subscriptionsSetting.itemSettings[tempId] == 'accept') {// 打开开关this.saveOpenId()} else {// 未打开开关}} else {// 没有对应templateId的数据}}})
},

如果想显示用户是否订阅过消息,需要记录用户openid,在页面进来时查询一下数据库

// index.jsonLoad() {this.checkStatus()
},
async checkStatus() {const currentUser = await wx.cloud.callFunction({name: 'getOpenId'})const currentOpenId = currentUser.result // 当前用户openidwx.cloud.database().collection('user-list').where({_openid: getApp().globalData.currentOpenId}).get().then(res => {this.setData({isAdded: res.data.length > 0 // 如果查询到数据就代表订阅过})})
}

使用到的云函数:

// getOpenId  获取用户openId// 云函数入口文件
const cloud = require('wx-server-sdk')cloud.init({ // 初始化云开发环境env: cloud.DYNAMIC_CURRENT_ENV // 当前环境的常量
})// 云函数入口函数
exports.main = async (event, context) => {// 返回当前用户的身份信息,用于数据库记录和查询return cloud.getWXContext().OPENID
}
// saveOpenId  保存用户openId// 云函数入口文件
const cloud = require('wx-server-sdk')cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境// 云函数入口函数
exports.main = async (event, context) => {const wxContext = cloud.getWXContext()const db = cloud.database()return await db.collection('user-list').add({data: {_openid: wxContext.OPENID}})
}

当满足需求,发送订阅消息,可以是按钮触发或者别的逻辑,下面列出设置订阅消息显示的云函数

// signMessage  订阅消息设置// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()exports.main = async (event, context) => {try {await cloud.openapi.subscribeMessage.send({touser: event._openid, // 发送通知给谁的openiddata: {thing1: {value: event.name // 调用云函数可传参进来},thing3: {value: event.title}},templateId: 'xxx', // 模板IDpage: 'pages/home/index' // 这个是发送完服务通知用户点击消息后跳转的页面})// 发送完毕就清空记录用户openId的表,再次查询的时候,显示未订阅,按钮可再次点击进行订阅return await cloud.callFunction({name: 'clearTable', data: {tableName: 'user-list'}})} catch (err) {console.log("Error while sending message:", err);return err}
}
// clearTable  清空数据库中的表// 云函数入口文件
const cloud = require('wx-server-sdk')cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境// 云函数入口函数
exports.main = async (event, context) => {const db = cloud.database()const _ = db.commandreturn await db.collection(event.tableName).where({_id: _.neq(null)}).remove()}

手动触发消息推送,就写一个按钮就好,如果需要定时,比如每日签到提醒就需要用到定时器

// index.wxml<view class="save" bindtap="sendMessage">发送消息</view>// index.js//发送消息sendMessage() {wx.cloud.callFunction({name: 'signMessage',//data是用来传给云函数event的数据,你可以把你当前页面获取消息填写到服务通知里面data: {action: 'sendSubscribeMessage',title:'xxx',name:'xxx',_openid: user._id, //需要发送用户的openid},success: res => {wx.showToast({title: '发送成功',})resolve(res);},fail: err => {wx.showToast({icon: 'none',title: '调用失败',})reject(new Error('[云函数] [openapi] subscribeMessage.send 调用失败'))}})}


http://www.ppmy.cn/server/158624.html

相关文章

VS Code的设置功能以及多层级的设置方式与解密

VS Code的Settings功能为用户提供了极大的灵活性和便利性&#xff0c;使得用户可以根据自己的需求和偏好来定制编辑器的行为和外观。 Settings 可以实现的具体功能 VS Code的设置项非常丰富&#xff0c;涵盖了各个方面&#xff0c;包括但不限于&#xff1a; 编辑器选项&…

《零基础Go语言算法实战》【题目 4-2】使用 Go 语言实现一个模拟栈数据结构操作的类 FrequencyStack

《零基础Go语言算法实战》 【题目 4-2】使用 Go 语言实现一个模拟栈数据结构操作的类 FrequencyStack FrequencyStack 有两个功能&#xff1a;push(int x) 方法将整数 x 压入栈&#xff0c;pop() 方法将栈中出现频次 最高的元素删除并返回&#xff1b;如果出现频次最高的元素…

鸿蒙面试 2025-01-11

ArkTs 和TS的关系&#xff1f; ArkTS&#xff08;方舟开发语言&#xff09;与 TypeScript&#xff08;TS&#xff09;存在紧密联系&#xff0c;同时也有显著区别&#xff1a; 联系 语法基础&#xff1a;ArkTS 在语法层面大量借鉴了 TypeScript &#xff0c;TypeScript 里诸如…

Spring Boot中的扫描注解如何使用

在 Spring Boot 中&#xff0c;扫描注解是指通过注解来告诉 Spring 框架应该扫描哪些包、哪些类或哪些特定的组件&#xff0c;并将其作为 Spring 容器中的 bean 进行管理。Spring Boot 主要通过以下几种注解来实现自动扫描&#xff1a; ComponentScanSpringBootApplicationCom…

springboot 加载本地jar到maven

在Spring Boot项目中&#xff0c;如果你想要加载一个本地的jar文件到Maven本地仓库&#xff0c;你可以使用Maven的install-file目标来实现。以下是一个简单的例子&#xff1a; 打开命令行工具&#xff08;例如&#xff1a;终端或者命令提示符&#xff09;。 执行以下Maven命令…

LLM进化下的Agent演变及软件重构下的一点思考

最近在与peer团队协同时遇到一个case&#xff0c;客户是某科研院所&#xff0c;希望通过llm&#xff0c;agent等技术搭建科研实验操作助手&#xff0c;以实现一定自主化的实验前领域知识学习与洞察、实验方案设计、实验过程执行与检测、实验结果统计与反馈等… 这让我回忆起去…

MQTT(Message Queuing Telemetry Transport)协议

文章目录 一、MQTT 的原理1. 通信模型2. 核心概念3. 工作流程 二、MQTT 的优势1. 轻量级2. 异步通信3. 可靠性4. 实时性5. 支持断线重连6. 跨平台支持7. 安全性 三、MQTT 的典型应用场景四、与其他协议的对比 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;…

Vue.js组件开发-使用地图绘制轨迹

在Vue.js中开发一个组件来展示地图并绘制轨迹&#xff0c;可以使用诸如Leaflet.js、Mapbox GL JS或百度地图等地图库。这些库提供了丰富的API来创建和定制地图&#xff0c;以及绘制路径、标记和其他地图元素。 示例&#xff1a; 1. 安装Leaflet.js 首先&#xff0c;需要安装…