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

微信小程序消息订阅分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.mzph.cn/diannao/66857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

青少年编程与数学 02-006 前端开发框架VUE 22课题、状态管理

青少年编程与数学 02-006 前端开发框架VUE 22课题、状态管理 一、状态管理二、Vuex1. 安装Vuex2. 创建Vuex Store3. 在Vue应用中使用Store4. 在组件中使用状态5. 模块化Store 三、Vuex应用示例1. 创建项目2. 安装Vuex3. 设置Vuex Store4. 在主项目中使用Store5. 创建组件6. 更新…

代码随想录算法训练营第 4 天(链表 2)| 24. 两两交换链表中的节点19.删除链表的倒数第N个节点 -

一、24. 两两交换链表中的节点 题目&#xff1a;24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 视频&#xff1a;帮你把链表细节学清楚&#xff01; | LeetCode&#xff1a;24. 两两交换链表中的节点_哔哩哔哩_bilibili 讲解&#xff1a;代码随想录 dummy-…

pycharm-pyspark 环境安装

1、环境准备&#xff1a;java、scala、pyspark、python-anaconda、pycharm vi ~/.bash_profile export SCALA_HOME/Users/xunyongsun/Documents/scala-2.13.0 export PATH P A T H : PATH: PATH:SCALA_HOME/bin export SPARK_HOME/Users/xunyongsun/Documents/spark-3.5.4-bin…

数据结构与算法之链表: LeetCode 146. LRU 缓存 (Ts版)

LRU 缓存 https://leetcode.cn/problems/lru-cache/description/ 描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 ke…

Three.js 渲染技术:打造逼真3D体验的幕后功臣

文章目录 前言一、着色器&#xff08;Shaders&#xff09;二、后处理&#xff08;Post-processing&#xff09;三、抗锯齿&#xff08;Anti-aliasing&#xff09;四、实时渲染与离线渲染五、光照模型与材质优化六、环境映射&#xff08;Environment Mapping&#xff09;七、纹理…

EFCore HasDefaultValueSql (续1 ValueGeneratedOnAdd)

前情&#xff1a;EFCore HasDefaultValueSql 小伙伴在使用 HasDefaultValueSql 时&#xff0c;对相关的 ValueGeneratedOnAdd 也有了疑问&#xff1a; ValueGeneratedOnAdd 和 HasDefaultValueSql 是 Entity Framework Core 中用于管理字段默认值的两种不同配置方式&#xff0…

通过Apache、Nginx限制直接访问public下的静态文件

一、Apache 在public目录下的.htaccess文件中添加如下规则&#xff0c;来拒绝除了指定文件类型之外的所有请求 <FilesMatch "\.(?!(jpg|jpeg|png|gif|css|js|ico)$)[^.]$">Order Allow,DenyDeny from all </FilesMatch> 上述配置表示仅允许访问.jpg …

远程和本地文件的互相同步

文章目录 1、rsync实现类似git push pull功能1. 基础概念2. 示例操作3. 定制化和进阶用法4. 定时同步&#xff08;类似自动化&#xff09; 2 命令简化1. 动态传参的脚本2. Shell 函数支持动态路径3. 结合环境变量和参数&#xff08;更简洁&#xff09;4. Makefile 支持动态路径…

AIOps 平台

AIOps&#xff08;Artificial Intelligence for IT Operations&#xff09;平台是一种结合人工智能&#xff08;AI&#xff09;技术和IT运营管理的解决方案&#xff0c;旨在通过自动化、智能化的手段优化企业IT系统的运行与管理。以下是AIOps平台的核心功能、优势以及常见的技术…

【大模型入门指南 07】量化技术浅析

【大模型入门指南】系列文章&#xff1a; 【大模型入门指南 01】深度学习入门【大模型入门指南 02】LLM大模型基础知识【大模型入门指南 03】提示词工程【大模型入门指南 04】Transformer结构【大模型入门指南 05】LLM技术选型【大模型入门指南 06】LLM数据预处理【大模型入门…

3DGabor滤波器实现人脸特征提取

import cv2 import numpy as np# 定义 Gabor 滤波器的参数 kSize 31 # 滤波器核的大小 g_sigma 3.0 # 高斯包络的标准差 g_theta np.pi / 4 # Gabor 函数的方向 g_lambda 10.0 # 正弦波的波长 g_gamma 0.5 # 空间纵横比 g_psi np.pi / 2 # 相位偏移# 生成 Gabor 滤…

【Linux】4.Linux常见指令以及权限理解(2)

文章目录 3. Linux指令3.1 ls指令和rm指令补充3.2 man指令&#xff08;重要&#xff09;3.3cp指令&#xff08;重要&#xff09;输出重定向3.3.1ubuntu20.04如何安装tree 3.4 mv指令&#xff08;重要&#xff09;mv指令更改文件名mv指令更改目录名 如何看待指令指令的重命名3.5…

Vue3初学之Element-plus

用于快速的上手开发&#xff0c;以做项目为导向&#xff0c;所以借用element-plus插件 发现淘宝的镜像有时候也是很慢的&#xff0c;还可以换个 npm config set registry https://registry.npmmirror.com 安装element-plus npm install element-plus --save 查看安装是否成…

vue2新增删除

&#xff08;只是页面实现&#xff0c;不涉及数据库&#xff09; list组件&#xff1a; <button click"onAdd">新增</button><el-table:header-cell-style"{ textAlign: center }" :cell-style"{ textAlign: center }":data&quo…

实用操作系统学习笔记

第1章 操作系统概述 操作系统基本概念 【基础知识】 操作系统&#xff1a;控制和管理整个计算机系统的硬件和软件资源&#xff0c;合理地组织、调度计算机的工作与资源的分配&#xff0c;进而为用户和其他软件提供方便接口与环境的程序集合。操作系统是计算机系统中最基本的…

k8s部署rocketmq踩坑笔记

给团队部署一个rocketmq4.8.0. k8s上部署的broker&#xff0c;注册到nameserver上是自己的pod ip&#xff0c;导致本机连接到的broker的pod ip&#xff0c;这个ip k8s集群外的机器是无法联通的。 nameserver上注册的是这个pod ipv4 尝试将broker的配置brokerIP1修改为注册到na…

【机器学习:八、逻辑回归】

逻辑回归&#xff08;Logistic Regression&#xff09; 1. 逻辑回归的引出 在现实世界中&#xff0c;许多问题都涉及到分类任务。例如&#xff1a; 判断一封邮件是否为垃圾邮件&#xff1b;预测某人是否会患某种疾病&#xff1b;确定图片中是否包含某种特定物体。 这些问题…

UI自动化测试保姆级教程①

欢迎来到阿妮莫的学习小屋慢也好&#xff0c;步子小也好&#xff0c;在往前走就好 目录 自动化测试 简介 作用 分类 优缺点 优点 缺点(误区) UI自动化测试 自动化测试使用场景 自动化测试实现时间 Selenium框架 特点 Web自动化测试环境部署 Selenium包安装 浏览…

【2024年华为OD机试】 (A卷,100分)- 总最快检测效率(Java JS PythonC/C++)

一、问题描述 题目描述 在系统、网络均正常的情况下组织核酸采样员和志愿者对人群进行核酸检测筛查。 每名采样员的效率不同&#xff0c;采样效率为 N 人/小时。由于外界变化&#xff0c;采样员的效率会以 M 人/小时为粒度发生变化&#xff0c;M 为采样效率浮动粒度&#xf…

如何使用MVC模式设计和实现校园自助点餐系统的微信小程序

随着智慧校园的普及&#xff0c;校园自助点餐系统在提高学生用餐效率、减轻食堂运营压力方面发挥了重要作用。 在开发这类系统时&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;模式是一种非常适合的架构&#xff0c;它将系统的业务逻辑、用户界面和数据交互清晰…