家政预约小程序10公众号集成

目录

  • 1 使用测试号
  • 3 工作流配置
  • 4 配置关注事件脚本
  • 5 注册开放平台
  • 6 获取公众号access_token
  • 6 实现关注业务逻辑
  • 总结

我们本次实战项目构建的相当于一个预约平台,既有家政企业,也有家政服务人员还有用户。不同的人员需要收到不同的消息,比如用户可以收到订单状态变更的消息,客服可以收到下单的消息,家政服务人员可以收到派单的消息。

如果是使用小程序订阅消息,存在的问题是订阅消息必须对方主动订阅才可以发,而且订阅一次才可以发一次。

对于用户可能问题不大,但是对于客服和家政人员就不太合适。因为他们接收消息是被动的,而且是接收多次消息。

对于这种需求,我们就需要和公众号集成来完成消息的接收。

1 使用测试号

登录到公众号后台,找到开发者工具,点击公众号测试号
在这里插入图片描述
用你自己的号扫码登录
在这里插入图片描述
登录之后,系统会给你初始化一个测试账号
在这里插入图片描述
这里的appID和appsecret在调用公众号接口的时候需要传入,下边的接口配置信息,主要是用来获取用户关注的事件,这里配置了微搭工作流的地址,我们接下来介绍一下工作流的配置

3 工作流配置

打开应用编辑器,切换到工作流视图,点击+号创建工作流
在这里插入图片描述
选择处理微信消息的通知模板
在这里插入图片描述
选择第一个节点,配置公众号的appid,token和secret我们选择随机生成
在这里插入图片描述
然后复制一下接收推送的URL,贴入到我们公众号的接口配置里,这样当用户在接收推送的时候就调用了微搭的工作流作为响应

4 配置关注事件脚本

在工作流里我们具体的关注事件响应是在js脚本里设置的,选中我们的js脚本节点,点击编辑
在这里插入图片描述
在这里插入图片描述
脚本的逻辑是先看表存不存在,不存在就创建一个,然后给用户返回一个欢迎信息

我们这里要修改一下,我们的表是事先创建好的,切换到数据源视图,找到我们的用户注册数据源,切换到基本信息,复制一下表信息
在这里插入图片描述
关注的时候需要写入正式表,点击立即发布
在这里插入图片描述
为了给用户发送消息,我们需要添加一列是公众号的openid
在这里插入图片描述
再添加一列公众号unionid
在这里插入图片描述
这里解释一下为什么要添加unionid,微信体系下如果公众号、小程序要进行关联的,需要用到unionid,前提是你的公众号和小程序都绑定到微信开放平台

5 注册开放平台

打开微信开发平台,按照提升进行注册
在这里插入图片描述
第二步登记主体信息
在这里插入图片描述
第三歩确认主体信息,注册成功后就可以将我们刚刚输入的邮箱和密码作为登录的用户名和密码了
在这里插入图片描述
登录之后先需要进行认证
在这里插入图片描述
在这里插入图片描述
认证通过之后,就需要将我们的公众号和小程序都绑定到开放平台
在这里插入图片描述
绑定之后我们的各个主体账号就统一到了开放平台下,这样就可以返回同一个unionid

6 获取公众号access_token

如果需要调用公众号接口的,先需要获取公众号的access_token,我们先创建一个数据源用来保存我们的access_token

在这里插入图片描述
先添加一列access_token类型选择文本
在这里插入图片描述
再添加一列expire_in类型选择数字
在这里插入图片描述
然后切换到工作流,新增一个工作流,选择空模板
在这里插入图片描述
第一个节点我们选择指定时间触发
在这里插入图片描述
选择重复周期为分钟,我们设置为每15分钟
在这里插入图片描述
然后拖入一个运行js脚本节点
在这里插入图片描述
将两个节点连接起来
在这里插入图片描述
在脚本里输入如下代码用来更新我们的token信息

const cloudbase = require('@cloudbase/node-sdk')
const fetch = require('node-fetch');
const app = cloudbase.init({env: cloudbase.SYMBOL_CURRENT_ENV
})
// 1. 获取数据库引用
const db = app.database()
// 获取access_token的函数
async function getAccessToken(appId, appSecret) {const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appId}&secret=${appSecret}`;try {const response = await fetch(url);const data = await response.json();if (data && data.access_token) {return data.access_token;} else {console.error('获取access_token失败:', data);return null;}} catch (error) {console.error('获取access_token出错:', error);return null;}
}// 查找存储access_token的文档的函数
async function findAccessTokenDoc() {console.log("-----------ssss-----------------")try {const tokenDocs = await db.collection('lcap-data-3ThdFDXPo-gzhtoken_uwynyav').get()console.log("----------------------------", tokenDocs)if (tokenDocs.data && tokenDocs.data.length > 0) {return tokenDocs.data[0];} else {return null;}} catch (error) {console.error('查找access_token文档出错:', error);return null;}
}// 写入云开发数据库中的access_token的函数
async function addAccessTokenToDatabase(accessToken, expiresIn) {try {const res = await db.collection('lcap-data-3ThdFDXPo-gzhtoken_uwynyav').add({access_token: accessToken,expire_in: expiresIn,createdAt: new Date().getTime(), // 存储为毫秒值createBy: "",updateBy: "",_openid: "",updatedAt: new Date().getTime(), // 存储为毫秒值});console.log('access_token写入成功,文档ID:', res);return res} catch (error) {console.error('access_token写入失败:', error);return null}
}// 更新云开发数据库中的access_token的函数
async function updateAccessTokenInDatabase(docId, accessToken, expiresIn) {try {const res = await db.collection('lcap-data-3ThdFDXPo-gzhtoken_uwynyav').doc(docId).update({access_token: accessToken,expire_in: expiresIn,updatedAt: new Date().getTime(), // 存储为毫秒值});console.log('access_token更新成功');return res} catch (error) {console.error('access_token更新失败:', error);return null}
}const appId = '';
const appSecret = '';
let res = null
const tokenDoc = await findAccessTokenDoc();
if (tokenDoc) {const docId = tokenDoc._id;const accessToken = await getAccessToken(appId, appSecret);if (accessToken) {res = await updateAccessTokenInDatabase(docId, accessToken, 7200);}
} else {const accessToken = await getAccessToken(appId, appSecret);console.log("accessToken", accessToken)if (accessToken) {res = await addAccessTokenToDatabase(accessToken, 7200);}
}return {res
}

代码的逻辑是,如果还没有写入token,那么就调用新增接口写入,如果已经写入了,就调用更新接口做更新操作

在工作流中,我们调用第三方接口的需要用到node-fetch包,其次如果我们想操作数据库的需要引入数据库的sdk

6 实现关注业务逻辑

相关配置都准备好之后,我们就可以写关注的逻辑了。我们的想法是如果用户关注,我们先获取到用户的openid,然后根据openid调用用户信息接口获取unionid,将获得的信息写入到数据源中,完成一个注册,代码如下:

const cloudbase = require("@cloudbase/node-sdk");
const fetch = require('node-fetch');
const app = cloudbase.init({env: cloudbase.SYMBOL_CURRENT_ENV // 这里可以修改为其他环境
});
const db = app.database();
const tokenDocs = await db.collection('lcap-data-3ThdFDXPo-gzhtoken_uwynyav').get()
console.log("tokenDocs",tokenDocs)
const access_token = tokenDocs.data[0].access_token; 
console.log("access_token",access_token)
const openid =""// wxTrigger.output.FromUserName; 
const response = await fetch(`https://api.weixin.qq.com/cgi-bin/user/info?access_token=${access_token}&openid=${openid}&lang=zh_CN`); console.log("response",response)const data = await response.json();console.log("data",data) const unionid = data?.unionid
const users = await db.collection("lcap-data-3Rr9TzWzJ-yhgl_2rtx1m9");const { total } = await users.where({ gzhopenid: openid }).count();
console.log("total",total)
const isNewUser = total === 0;
console.log("isNewUser",isNewUser)
if (isNewUser) {await users.add({ gzhopenid: data.openid ,gzhunionid:unionid});
}return `${isNewUser ? "感谢您的关注" : "感谢您再次关注" };

总结

本篇我们介绍了如何和公众号集成,将公众号的信息和小程序的信息关联是必备的功能,后续章节中我们介绍一下小程序注册用户时如何和公众号进行关联

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/845201.shtml

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

相关文章

99.网络游戏逆向分析与漏洞攻防-ui界面的设计-角色信息显示的界面与功能

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不懂是正常的,只要会抄就行,抄着抄着就能懂了 内容…

机器人学导论P115求雅可比矩阵python实现

代码如下: import numpy as np import matplotlib.pyplot as plt import seaborn as sns import plotly.express as px import plotly.graph_objects as go from plotly.subplots import make_subplots from numpy import sin from numpy import cos plt.rcParams[…

【考试100】安全员B证《建设工程安全生产技术》单选题

​ 题库来源:考试100 【考试100】安全员B证《建设工程安全生产技术》单选题 1.在悬空部位作业时,操作人员应( ) A.遵守操作规定 B.进行安全技术交底 C.戴好安全帽 D.系好安全带 【考试100答案】:D…

【R基础】如何开始学习R-从下载R及Rstudio开始

文章目录 概要下载R流程下载Rstudio流程下载完成-打开 概要 提示:如何开始学习R-从下载R及Rstudio开始,此处我只是想下载指定版本R4.3.3 下载R流程 链接: R官网 文件下载到本地 下载文件展示 按照向导指示安装 下载Rstudio流程 链接: Rstudio官网…

低代码与人工智能的深度融合:行业应用的广泛前景

引言 在当今快速变化的数字化时代,企业面临着越来越多的挑战和机遇。低代码平台和人工智能技术的兴起,为企业提供了新的解决方案,加速了应用开发和智能化转型的步伐。 低代码平台的基本概念及发展背景 低代码平台是一种软件开发方法&#x…

解决MYSQL5.7版本only_full_group_by报错解决方法

问题 出现this is incompatible with sql_modeonly_full_group_by这个语句就说明启动了only_full_group_by规则了 介绍only_full_group_by规则: 这种情况可能是5.7版本的规则比较严格,当启用“only_full_group_by”模式时,MySQL会对执行GROU…

SpringBoot中MyBatisPlus的使用

MyBatis Plus 是 MyBatis 的增强工具,提供了许多强大的功能,简化了 MyBatis 的使用。下面是在 Spring Boot 中使用 MyBatis Plus 的步骤: 添加依赖:在 Maven 或 Gradle 的配置文件中添加 MyBatis Plus 的依赖。 配置数据源&#…

Day10:平面转换、渐变色

目标:使用位移、缩放、旋转、渐变效果丰富网页元素的呈现方式。 一、平面转换 1、简介 作用:为元素添加动态效果,一般与过渡配合使用。 概念:改变盒子在平面内的形态(位移、旋转、缩放、倾斜)。 平面转换…

小米投屏怎么投?收好这3个投屏指南!(2024新)

近年来,小米凭借过硬的品质和合理的价格成为手机市场的一股强劲力量。随着其销量的上升,人们可以通过多种方式使用它来获得乐趣和便利。比如小米MIUI 11自带一个“光环”——Miracast,可以让用户在电脑上控制小米/红米/小米,获得更…

The book

Deep Learning for Coders with Fastai and PyTorch: AI Applications Without a PhD is the book that forms the basis for this course. We recommend reading the book as you complete the course. There’s a few ways to read the book – you can buy it as a paper bo…

CameraProvider启动流程

从Android 8.0之后,Android 引入Treble机制,主要是为了解决目前Android 版本之间升级麻烦的问题,将OEM适配的部分vendor与google 对android 大框架升级的部分system部分做了分离,一旦适配了一个版本的vendor信息之后,之…

【excel】设置可变下拉菜单(一级联动下拉菜单)

文章目录 【需求】制作动态下拉菜单,显示无重复的“班级”列表【思路】设置辅助列,使用UNIQUE()函数去重,并用FILTER()去掉结果中的“0”【步骤】step1 辅助列step2 设置下拉菜单 【总结】 【需求】制作动态下拉菜单,显示无重复的…

深度学习之AlexNet、VGG-19、VGG-16、LeNet-5、ResNet模型的训练

一.AlexNet 1.1.导入资源包 import cv2 import matplotlib.pyplot as plt import numpy as np import os import random注: cv2:这是 OpenCV 模块,用于处理图像和视频,包括摄像头捕捉、图像处理、特征检测等。 matpl…

Playwright 自动化操作

之前有见同事用过playwright进行浏览器模拟操作,但是没有仔细了解,今天去详细看了下,发现playwright着实比selenium牛逼多了 Playwright 相对于selenium优点 1、自动下载chromnium, 无需担心chrome升级对应版本问题; 2、支持录屏操…

干Java的有4年的工作经验;想转行做labview能行吗?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「 Java的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!bVIEW和Java都是软件工具&a…

推荐几款优秀的文档加密软件 | 企业文件加密解决方案

在数字化时代,信息安全问题日益突出,文档加密软件成为了保护数据安全的重要手段。但是,市面上的文档加密软件种类繁多,功能各异,如何选择一款好用的文档加密软件成为了许多用户关注的焦点。本文将为大家提供一份实用的…

【第十三节】C++控制台版本坦克大战小游戏

目录 一、游戏简介 1.1 游戏概述 1.2 知识点应用 1.3 实现功能 1.4 开发环境 二、项目设计 2.1 类的设计 2.2 各类功能 三、程序运行截图 3.1 游戏主菜单 3.2 游戏进行中 3.3 双人作战 3.4 编辑地图 一、游戏简介 1.1 游戏概述 本项目是一款基于C语言开发的控制台…

5. MySQL运算符和函数

文章目录 【 1. 算术运算符 】【 2. 逻辑运算符 】2.1 逻辑非 (NOT 或者 !)2.2 逻辑与运算符 (AND 或者 &&)2.3 逻辑或 (OR 或者 ||)2.4 异或运算 (XOR) 【 3. 比较运算符 】3.1 等于 3.2 安全等于运算符 <>3.3 不等于运算符 (<> 或者 !)3.4 小于等于运算符…

Linux基本命令的使用(cp mv)

一、cp命令-1 1、CP命令作用&#xff1a;复制一个源文件到目标文件&#xff08;夹&#xff09; 2、 语法&#xff1a;cp [选项] 源文件 目标文件&#xff08;夹&#xff09; ① 复制到文件夹下&#xff0c;则文件名保持不变 ② 复制到文件中&#xff0c;则文件名变更 二、cp命…

【文件fd】回顾C语言文件操作 | 详细解析C语言文件操作写w追加a | 重定向和“w““a“

目录 前言 回顾C语言的操作 Q1 Q2 Q3 C语言文件操作 w方式 a方式 重定向和"w""a"方式 前言 前面进程虚拟地址空间让我们对进程的理解更加深入。在基础IO我们会详细介绍文件和文件系统。本专题的核心内容是文件。 深刻理解文件&#xff08;站在…