家政预约小程序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官网…

新人硬件工程师,工作中遇到的问题list

新人硬件工程师能够通过面试,已经证明是能够胜任硬件工程师职责,当然胜任的时间会延迟,而不是当下,为什么呢?因为学校学习和公司做产品,两者之间有差异,会需要适应期。今天来看看新人硬件工程师…

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

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

生产计划排产,制定每小时计划产量(“查表法”SQL计算)

根据日生产计划产量排产,制定每2小时理论计划生产产量。 每2小时计划产量 每2小时工作时间(秒)/生产计划节拍(秒)。 假设,生产计划节拍 : 25.0(秒)/台 工厂以每天8点00分钟作为当日工作日的…

解决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、简介 作用:为元素添加动态效果,一般与过渡配合使用。 概念:改变盒子在平面内的形态(位移、旋转、缩放、倾斜)。 平面转换…

Tale全局函数对象base

目录 1、 Tale全局函数对象base 1.1、 * tale alert删除 1.2、 * 成功弹框 1.3、 * 弹出成功,并在500毫秒后刷新页面 1.4、 * 警告弹框 1.5、 * 询问确认弹框,这里会传入then函数进来

【前端Vue】——课堂笔记(二)

💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux&#xf…

小米投屏怎么投?收好这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…

flask流式接口

一、接口封装 from flask import Flask, request, Response, stream_with_context app Flask(__name__) app.logger.disabled Truedef chat_stream_(prompt):for new_text in [1,2,3]:yield new_textapp.route(/chat_stream, methods[POST]) def chat_stream():prompt requ…

CameraProvider启动流程

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

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

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

工业通信原理——LVDS通信原理

工业通信原理——LVDS通信原理 简介 LVDS(Low Voltage Differential Signaling,低压差分信号传输)是一种数字信号传输技术,通常用于高速数据传输,特别是在需要长距离传输、抗干扰能力强的场景中应用广泛。下面我将详…

深度学习之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、支持录屏操…