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

news2025/1/16 22:46:53

微信小程序消息订阅分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填选用的模板ID
      success: (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并且有没有这个订阅消息的模板id
            if (res.subscriptionsSetting.itemSettings && res.subscriptionsSetting.itemSettings[tempId]) {
              if (res.subscriptionsSetting.itemSettings[tempId] == 'accept') {
                // 打开开关
                this.saveOpenId()
              } else {
                // 未打开开关
              }
            } else {
              // 没有对应templateId的数据
            }
    }
  })
},

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

// index.js

onLoad() {
  this.checkStatus()
},
async checkStatus() {
  const currentUser = await wx.cloud.callFunction({name: 'getOpenId'})
  const currentOpenId = currentUser.result // 当前用户openid
  wx.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, // 发送通知给谁的openid
      data: {
        thing1: {
          value: event.name // 调用云函数可传参进来
        },
        thing3: {
          value: event.title
        }
      },
      
      templateId: 'xxx', // 模板ID
      page: '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.command

  return 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.coloradmin.cn/o/2277738.html

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

相关文章

Ubuntu上,ffmpeg如何使用cuda硬件解码、编码、转码加速

本文使用 Ubuntu 环境。Ubuntu 直接使用 APT 安装的就支持 CUDA 加速。本文使用这样下载的版本进行演示&#xff0c;你自己编译或者其他源的版本可能会不同。 ffmpeg 的一些介绍&#xff0c;以及 macOS 版本的 ffmpeg 硬件加速请见《macOS上如何安装&#xff08;不需要编译安装…

了解Python中的SciPy库

么是 SciPy&#xff1f; SciPy&#xff08;发音为“Sigh Pie”&#xff09;是 Scientific Python 的首字母缩写词&#xff0c;它是 Python 的开源库&#xff0c;用于科学和技术计算。它是 Python 编程语言中称为 Numpy 的基本数组处理库的扩展&#xff0c;旨在支持高级科学和工…

51单片机入门基础

目录 一、基础知识储备 &#xff08;一&#xff09;了解51单片机的基本概念 &#xff08;二&#xff09;掌握数字电路基础 &#xff08;三&#xff09;学习C语言编程基础 二、开发环境搭建 &#xff08;一&#xff09;硬件准备 &#xff08;二&#xff09;软件准备 三、…

【Qt】01-了解QT

踏入QT的殿堂之路 前言一、创建工程文件1.1 步骤介绍1.2 编译介绍方法1、方法2、编译成功 二、了解框架2.1 main.cpp2.2 .Pro文件2.2.1 注释需要打井号。2.2.2 F1带你进入帮助模式2.2.3 build文件 2.3 构造函数 三、编写工程3.1 main代码3.2 结果展示 四、指定父对象4.1 main代…

【Uniapp-Vue3】使用defineExpose暴露子组件的属性及方法

如果我们想要让父组件访问到子组件中的变量和方法&#xff0c;就需要使用defineExpose暴露&#xff1a; defineExpose({ 变量 }) 子组件配置 父组件配置 父组件要通过onMounted获取到子组件的DOM 传递多个属性和方法 子组件 父组件

qml XmlListModel详解

1、概述 XmlListModel是QtQuick用于从XML数据创建只读模型的组件。它可以作为各种view元素的数据源&#xff0c;比如ListView、GridView、PathView等&#xff1b;也可以作为其他和model交互的元素的数据源。通过XmlRole定义角色&#xff0c;如name、age和height&#xff0c;并…

登录系统网址作业

目录 主页代码 主页​编辑 效果1 登录页面代码 登录页面 效果2 注册页面代码 注册页面 效果3 主页代码 <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content&qu…

生产管理看板助力节能科技公司实现数据自动化管理

在节能科技公司的生产过程中&#xff0c;数据管理的自动化是提高生产效率和产品质量的关键。然而&#xff0c;许多公司在数据记录、展示、对比和存档方面仍面临诸多痛点&#xff0c;如产品检测数据无法自动记录、缺乏直观的产线状态展示、检测数据对比繁琐耗时&#xff0c;以及…

论文阅读:Searching for Fast Demosaicking Algorithms

今天介绍一篇有关去马赛克的工作&#xff0c;去马赛克是 ISP 流程里面非常重要的一个模块&#xff0c;可以说是将多姿多彩的大千世界进行色彩还原的重要一步。这篇工作探索的是如何从各种各样的去马赛克算法中&#xff0c;选择最佳的一种。 Abstract 本文提出了一种方法&…

nginx 修改内置 404 页面、点击劫持攻击。

1、在部署前端项目的目录下增加 404.html 页面&#xff1a;/opt/web/404.html。 2、在 nginx 配置中增加 404 配置&#xff1a; root /opt/web; # 设置根目录的配置error_page 404 404.html; location /404.html {root /opt/web;# 指定 404 页面所在的根目录internal;# 确保…

金融项目实战 04|JMeter实现自动化脚本接口测试及持续集成

目录 一、⾃动化测试理论 二、自动化脚本 1、添加断言 1️⃣注册、登录 2️⃣认证、充值、开户、投资 2、可重复执行&#xff1a;清除测试数据脚本按指定顺序执行 1️⃣如何可以做到可重复执⾏&#xff1f; 2️⃣清除测试数据&#xff1a;连接数据库setup线程组 ①明确…

【SH】Xiaomi9刷Windows10系统研发记录 、手机刷Windows系统教程、小米9重装win10系统

文章目录 参考资料云盘资料软硬件环境手机解锁刷机驱动绑定账号和设备解锁手机 Mindows工具箱安装工具箱和修复下载下载安卓和woa资源包第三方Recovery 一键安装Windows准备工作创建分区安装系统 效果展示Windows和Android一键互换Win切换安卓安卓切换Win 删除分区 参考资料 解…

3 前端(上): Web开发相关概念 、HTML语法、CSS语法

文章目录 前言:导学1 Web开发相关概念2 Web标准(网页标准)3 软件架构(CS/BS)(1)C/S: Client/Server 客户端 / 服务器端(2)B/S: Browser/Server 浏览器 / 服务器端VSCode配置前段开发环境一、HTML概念1 概念2 HTML快速入门(1)语法快速入门(2)VSCode一个 !(快捷键…

Docker PG流复制搭建实操

目录标题 制作镜像1. 删除旧的容器2. 创建并配置容器3. 初始化数据库并启动 主库配置参数4. 配置主库5. 修改 postgresql.conf 配置 备库配置参数6. 创建并配置备库容器7. 初始化备库 流复制8. 配置&检查主库复制状态9. 检查备库配置 优化建议问题1&#xff1a;FATAL: usin…

【AIGC】SYNCAMMASTER:多视角多像机的视频生成

标题&#xff1a;SYNCAMMASTER: SYNCHRONIZING MULTI-CAMERA VIDEO GENERATION FROM DIVERSE VIEWPOINTS 主页&#xff1a;https://jianhongbai.github.io/SynCamMaster/ 代码&#xff1a;https://github.com/KwaiVGI/SynCamMaster 文章目录 摘要一、引言二、使用步骤2.1 TextT…

C++类与对象(一)—学习记录

序言&#xff1a;要想开发一款成功的应用程序&#xff0c;其开发者必须充分了解并实现用户的需求。作为一个设计良好的类&#xff0c;既要有直观且易于使用的接口&#xff0c;也必须具备高效的实现过程。 一、类与对象基本概念 面向对象程序设计的主要特点为抽象、封装、继承与…

【React】新建React项目

目录 create-react-app基础运用React核心依赖React 核心思想&#xff1a;数据驱动React 采用 MVC体系package.jsonindex.html好书推荐 官方提供了快速构建React 项目的脚手架&#xff1a; create-react-app &#xff0c;目前使用它安装默认是19版本&#xff0c;我们这里降为18…

Jmeter数据库

jmeter之操作数据库 一、下载jdbc 驱动&#xff0c;安装jdbc驱动 2、将驱动存放在4个路径下 &#xff08;1&#xff09;C:\Program Files\Java\jre1.8.0_60\lib &#xff08;2&#xff09;第二个存放的包 C:\Program Files\Java\jre1.8.0_60\lib\ext &#xff08;3&#xf…

nginx: [emerg] bind() to 0.0.0.0:80 failed 端口被占用

nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions) 查看被占用的端口 被系统占用了 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/HTTP 然后再进入nginx文件夹目录下…

《C++11》深入剖析正则表达式库:解锁文本处理的高效之道

在现代编程领域&#xff0c;文本处理是一项不可或缺的任务&#xff0c;而正则表达式无疑是这一领域的强大利器。C11标准库的引入&#xff0c;为C开发者带来了正则表达式库&#xff0c;极大地丰富了C在文本处理方面的能力。本文将全方位、多角度地深入探讨C11正则表达式库&#…