当前位置: 首页 > news >正文

uniapp在小程序连接webScoket实现余额支付

webScoket文档:uni.connectSocket(OBJECT) | uni-app官网

/plugins/event.js

const Dep = function() {this.Evens = Object.create(null);
}
class Event {constructor({dep = new Dep()} = {}) {if (dep.constructor === Object && Object.keys(dep).length === 0) {dep.Evens = Object.create(null);}this.Dep = dep;}/** 绑定事件 可以重复绑定* @param {Object} handler		需要绑定的事件名称* @param {Object} fn	事件处理函数*/onNotify(handler, fn, oneEv = false) {try{this.off(handler,()=>{});}catch(e){};if (typeof fn != 'function') {return console.error(`The registered custom event type must be a function \r\n ${fn.toString()}`);}if (this instanceof Event) {let typeArr = this.Dep.Evens[handler];if (!typeArr) {this.Dep.Evens[handler] = [];}const eventArr = this.Dep.Evens[handler]if (oneEv) {eventArr.splice(0, eventArr.length);}eventArr.push(fn);} else {console.error(`You can't manually modify the 'this' pointer is '${handler}' Event type \r\n ${fn.toString()}`)}return this}/** 绑定事件 仅会绑定一次事件,如果发现有重名的事件则全部移除* @param {Object} handler		需要绑定的事件名称* @param {Object} fn	事件处理函数*/one(handler, fn) {if (this instanceof Event) {this.on(handler, fn, true);} else {console.error(`You can't manually modify the 'this' pointer is '${handler}' Event type \r\n ${fn.toString()}`)}return this}/** 解除已经绑定事件 * @param {Object} handler		指定需要解除的事件类型	不传则清楚全部* @param {Object} callback		解除事件后的回调函数*/off(handler, callback) {if (this instanceof Event) {let callInfo = {0: {success: false,msg: `'${handler}' event is not defined`},1: {success: true,msg: 'Successful ok'}};if (!handler) {this.Dep.Evens = {};return true;}let typeArr = this.Dep.Evens[handler];if (typeArr) {delete this.Dep.Evens[handler];return callback.call(this, callInfo[1]);}return callback.call(this, callInfo[0]);} else {console.error(`You can't manually modify the 'this' pointer`)}return this}/**	触发指定事件* @param {Object} type		需要触发的事件* @param {Object} options	为此事件传递的参数*/onPublish(type, options) {if (this instanceof Event) {let eventArr = this.Dep.Evens[type];if (!eventArr || eventArr.length == 0) {return console.error(`The specified event does not exist is '${type}'`)}let i = eventArr.length - 1;while (true) {eventArr[i].call(this, options);i--if (i < 0) {break}}} else {console.error(`You can't manually modify the 'this' pointer`)}return this}
}
export default Event;

/utils/socket.js

import Events from '@/plugins/event';
class webScoket extends Events {constructor(uri) {super()this.isConnected = false //socket连接记录this.timer = null //心跳定时器this.uri = urithis.url = `wss://changecabinet.yunheznkj.com/websocket/${uri}`// 创建WebSocket连接。this.ws = uni.connectSocket({url: this.url,success(res) {console.log('链接成功')console.log(res)},fail(err) {console.log('链接失败')console.error(err)},complete: () => {}});// 连接打开事件this.ws.onOpen(res => {console.log(`WebSocket 已连接:${this.url}`)this.isConnected = true;});// 接受到服务器的消息事件this.ws.onMessage(res => {this.onPublish(this.uri, JSON.parse(res.data))});// 连接关闭事件this.ws.onClose(res => {console.warn('WebSocket 已断开')this.isConnected = false;});}close() {return new Promise((resolve, reject) => {if (this.isConnected) {clearInterval(this.timer);this.ws.close()}resolve()})}send(data) {this.ws.send({data: data.msg})}
}export default webScoket

页面调用

实现逻辑:前端点击支付按钮,同时调起webScoket连接和发送支付接口。如果余额不足和支付失败,后端通过接口通知前端。如果支付成功,后端通过webScoket通知前端。

<script>import WS from '@/utils/socket'import {payAndGet} from '@/api/user.js'export default {data() {return {orderNo: '',$ws: null}},onLoad(e) {this.orderNo = e.orderNo},onHide() {if (this.$ws) {this.$ws.close()}},beforeDestroy() {if (this.$ws) {this.$ws.close()}},methods: {// 支付async payAndGet() {this.socketInit()const res = await payAndGet({orderNo: this.orderNo})if (res.code == 1001) { // 余额不足this.$ws.close()} else if (res.code == 200) { // 支付成功} else {// 支付失败this.$ws.close()}},// 链接设备socketInit() {let uri = `gzyh_device_result_` + this.orderNothis.$ws = new WS(uri)this.$ws.onNotify(uri, res => {if (res.code == 200) {// 支付成功执行逻辑}})},}}
</script>

相关文章:

uniapp在小程序连接webScoket实现余额支付

webScoket文档&#xff1a;uni.connectSocket(OBJECT) | uni-app官网 /plugins/event.js const Dep function() {this.Evens Object.create(null); } class Event {constructor({dep new Dep()} {}) {if (dep.constructor Object && Object.keys(dep).length 0…...

Spring Boot【三】

自动注入 xml中可以在bean元素中通过autowire属性来设置自动注入的方式&#xff1a; <bean id"" class"" autowire"byType|byName|constructor|default" /> byName&#xff1a;按照名称进行注入 byType&#xff1a;按类型进行注入 constr…...

R 因子

R 因子 引言 在金融领域&#xff0c;风险管理和投资策略的优化一直是核心议题。传统的风险度量工具&#xff0c;如波动率、Beta系数等&#xff0c;虽然在一定程度上能够帮助投资者理解市场的波动和资产的相对风险&#xff0c;但它们往往无法全面捕捉到市场动态的复杂性。因此…...

【博主推荐】C# Winform 拼图小游戏源码详解(附源码)

文章目录 前言摘要1.设计来源拼图小游戏讲解1.1 拼图主界面设计1.2 一般难度拼图效果1.3 普通难度拼图效果1.4 困难难度拼图效果1.5 地域难度拼图效果1.6 内置五种拼图效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载结束语 前言 在数字浪潮汹涌澎湃的时代&#xff0c;程序开…...

深入解析 MySQL 启动方式:`systemctl` 与 `mysqld` 的对比与应用

目录 前言1. 使用 systemctl 启动 MySQL1.1 什么是 systemctl1.2 systemctl 启动 MySQL 的方法1.3 应用场景1.4 优缺点优点缺点 2. 使用 mysqld 命令直接启动 MySQL2.1 什么是 mysqld2.2 mysqld 启动 MySQL 的方法2.3 应用场景2.4 优缺点优点缺点 3. 对比分析结语 前言 MySQL …...

【python】windows pip 安装 module 提示 Microsoft Visual C++ 14.0 is required 处理方法

参考链接&#xff1a;https://blog.csdn.net/qzzzxiaosheng/article/details/12511900 1.问题引入 在使用pip 安装一些module经常会出现报错&#xff1a; Microsoft Visual C 14.0 is required. Get it with “Microsoft Visual C Build Tools很明显这是缺少C的编译的相关依…...

python爬虫案例——猫眼电影数据抓取之字体解密,多套字体文件解密方法(20)

文章目录 1、任务目标2、网站分析3、代码编写1、任务目标 目标网站:猫眼电影(https://www.maoyan.com/films?showType=2) 要求:抓取该网站下,所有即将上映电影的预约人数,保证能够获取到实时更新的内容;如下: 2、网站分析 进入目标网站,打开开发者模式,经过分析,我…...

go sync.WaitGroup

1、数据结构 type WaitGroup struct {noCopy noCopystate atomic.Uint64 // high 32 bits are counter, low 32 bits are waiter count.sema uint32 } 计数器&#xff1a;原子变量&#xff0c;高32位用于为协程计数&#xff0c;低32位为等待计数&#xff08;被Wait阻塞等待&a…...

Libevent库-http通信不同请求方式的处理

做项目的时候用到了http通信&#xff0c;同事用libevent库写的&#xff0c;特此记录后端从前端拿到消息后的处理方式 void CHTTPTest::request(const std::any & data) {// data 是从前端拿到的数据void *obj std::any_cast<void *>(data); // std::any是C17新标准…...

关于node全栈项目打包发布linux项目问题总集

1.用pm2部署nest 说明&#xff1a;如果一开始将nest直接打包放到linux服务器上用pm2执行则会报错&#xff0c;这是因为tsconfig.build.tsbuildinfo文件的路径以及相关依赖问题。 报错会为&#xff1a;什么东西找不到.... 所以建议以下为步骤一步一步配置 将整个nest添加压缩包直…...

常见的上、下采样方法

常见的‌上采样方法‌ ‌‌反卷积&#xff08;Deconvolution&#xff09;或‌转置卷积&#xff08;Transpose Convolution&#xff09;‌&#xff1a;通过学习可逆卷积核来进行上采样&#xff0c;增加特征图的尺寸。‌‌插值&#xff08;Interpolation&#xff09;‌&#xff…...

如何解决 java.rmi.NotBoundException: RMI 中没有绑定的对象问题?亲测有效的解决方法!

java.rmi.NotBoundException 是 Java RMI&#xff08;Remote Method Invocation&#xff09;中的一个常见异常&#xff0c;它通常出现在远程方法调用过程中&#xff0c;表示在 RMI 注册表中找不到指定的绑定对象。换句话说&#xff0c;当客户端尝试查找一个远程对象&#xff08…...

设计模式:14、抽象工厂模式(配套)

目录 0、定义 1、抽象工厂模式的四种角色 2、抽象工厂的UML类图 3、示例代码 0、定义 提供一个创建一系列或相互依赖对象的接口&#xff0c;而无须指定它们具体的类。 1、抽象工厂模式的四种角色 抽象产品&#xff08;Product&#xff09;&#xff1a;一个抽象类或接口&a…...

Linux环境基础开发工具使用

目录 1. Linux软件包管理器yum 1.1 什么是软件包 1.2 Linux软件生态 1.3 关于rzsz 1.4 注意事项 1.5 查看软件包 2. Linux编辑器-vim使用 2.1 vim的基本概念 2.2 vim的基本操作 2.3 简单vim配置 3. 编译器gcc/g 3.1 背景知识 3.2 gcc编译选项 3.2.1 预处理…...

AI生成的一个.netcore 经典后端架构

下面是一个完整的 .NET Core 后端项目示例&#xff0c;使用 Dapper 作为轻量级 ORM 访问 Oracle 数据库&#xff0c;并实现高性能架构。我们将实现学生表、课程表、成绩表和班级表的基本增删改查功能&#xff0c;以及查询某个班级学生成绩的功能&#xff0c;并使用自定义缓存来…...

深度学习-48-AI应用实战之基于face_recognition的人脸识别

文章目录 1 人脸识别1.1 识别原理1.2 应用场景2 python实现人脸识别2.1 windows安装face_recognition2.2 安装问题及解决3 使用示例3.1 人脸区域检测3.2 对齐与编码3.3 人脸匹配3.4 信息录入4 附录4.1 函数cv2.rectangle4.2 参考附录1 人脸识别 通过图片或者摄像头的方式,将识…...

【Rabbitmq篇】高级特性----事务,消息分发

目录 事务 消息分发 应用场景 1. 限流 2.负载均衡 事务 RabbitMQ是基于AMQP协议实现的,该协议实现了事务机制,因此RabbitMQ也支持事务机制.SpringAMQP也提供了对事务相关的操作.RabbitMQ事务允许开发者确保消息的发送和接收是原子性的,要么全部成功,要么全部失败. 何为原…...

Python进程和线程适用场景

在选择使用 进程&#xff08;Process&#xff09;和 线程&#xff08;Thread&#xff09;时&#xff0c;通常取决于任务的类型、程序的需求以及硬件资源的限制。进程和线程各自有不同的特点&#xff0c;适用于不同的场景。下面是关于进程和线程的一些常见应用场景和选择指导&am…...

flutter开发环境—Windows

一、简介 我们使用最新版的flutter版本安装。 参考链接 名称地址官方网站https://flutter.dev/官方中文网站文档 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter软件下载路径https://docs.flutter.dev/release/archive?tabwindows 二、操作流程 2.1 下载软件 点…...

展示和添加篮球队信息--laravel与elementplus

之前使用laravel与inertia来做过一样的功能,感觉不满意,因此再结合elementplus重做一遍,先展示下重做后的效果。重写后的代码相比之下比较优雅。 球队首页 球队添加页 球员首页 很明显的改变,我新增了侧栏菜单来控制局部模块(这里是指NBABasketba…...

IPD的势、道、法、术、器

目录 简介 一、势&#xff1a;为什么 IPD 是必然选择&#xff1f; 二、道&#xff1a;IPD 的底层哲学 三、法与术&#xff1a;从战略到执行的具体路径 四、器&#xff1a;让流程真正落地的工具与组织 不是每家公司都需要全套 IPD&#xff0c;但每家公司都需要 IPD 思维 简…...

Blender渲染通道完全指南:如何像电影后期一样,分离出深度、阴影与反射图

Blender渲染通道完全指南&#xff1a;影视级后期制作的深度解析在数字内容创作领域&#xff0c;Blender已经从一个简单的3D建模工具成长为能够处理复杂视觉特效的全流程解决方案。对于追求影视级质量的中高级用户而言&#xff0c;掌握渲染通道技术是提升作品专业度的关键一步。…...

sudo企业级应用【20260525】001篇

文章目录 一、总体设计思路 1️⃣ 设计原则 2️⃣ 日志策略(重点) 二、10 个真实生产场景(含 sudoers 配置) 🔹 Linux 系统管理(3 个) ✅ 场景 1:基础运维(用户 / 权限) ✅ 场景 2:磁盘与文件系统 ✅ 场景 3:网络与防火墙 🔹 云管理(2 个) ✅ 场景 4:云 CLI …...

Raspberry Pi Debug Probe:RP2040嵌入式开发的调试利器与实战指南

1. 项目概述&#xff1a;为什么你需要一个Raspberry Pi Debug Probe&#xff1f;如果你玩过树莓派Pico或者任何基于RP2040芯片的开发板&#xff0c;肯定遇到过这样的场景&#xff1a;写好的代码&#xff0c;点一下“上传”&#xff0c;然后……就没有然后了。板子上的LED没按你…...

总线式智能提示灯系统设计:从恒流驱动到模块化架构

1. 项目概述&#xff1a;从传统到智能的剧场提示灯系统革新在剧场、演播室或者大型活动现场的后台&#xff0c;如果你待过&#xff0c;一定对那套“红灯停&#xff0c;绿灯行”的提示灯系统不陌生。导演或舞台监督通过对讲机喊“Standby”&#xff08;准备&#xff09;&#xf…...

圈复杂度>12=技术债炸弹?DeepSeek静态分析实战:从17.8→3.2的重构路径全披露

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;圈复杂度&#xff1e;12技术债炸弹&#xff1f;DeepSeek静态分析实战&#xff1a;从17.8→3.2的重构路径全披露 当函数圈复杂度&#xff08;Cyclomatic Complexity&#xff09;持续高于12&#xff0c;它不再是…...

基于Cynthion逆向USB协议,为DP100电源开发Linux控制软件

1. 项目概述&#xff1a;用Cynthion嗅探USB&#xff0c;为DP100电源打造Linux软件作为一名长期在Linux环境下折腾硬件和嵌入式开发的爱好者&#xff0c;我经常遇到一个头疼的问题&#xff1a;很多不错的桌面小设备&#xff0c;比如电源、示波器、逻辑分析仪&#xff0c;它们的官…...

3个实用场景教你轻松解锁网易云音乐NCM加密文件:ncmdumpGUI完整指南

3个实用场景教你轻松解锁网易云音乐NCM加密文件&#xff1a;ncmdumpGUI完整指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经下载了网易云音乐的…...

无声输入革命:如何用Chaplin在5分钟内构建本地唇语识别系统

无声输入革命&#xff1a;如何用Chaplin在5分钟内构建本地唇语识别系统 【免费下载链接】chaplin A real-time silent speech recognition tool. 项目地址: https://gitcode.com/gh_mirrors/chapl/chaplin 在嘈杂的办公室、安静的图书馆&#xff0c;或是需要绝对隐私的医…...

【Sora 2 HDR生成黄金公式】:曝光补偿系数×动态范围压缩阈值×时域一致性权重=可商用HDR帧率(附Python验证脚本)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Sora 2 HDR视频生成黄金公式的提出与商业意义 Sora 2 的HDR视频生成能力不再依赖传统多曝光融合或后期调色管线&#xff0c;而是通过一个端到端可微分的物理感知渲染公式实现原生高动态范围建模。该公式被业界…...