Vue电商项目--订单和支付

提交订单

没有组件,先搬组件

 配置路由

 然后静态pay页面就有了

这里提交订单不是简单的直接进行路由的跳转,而且要拿你支付的数据向服务器发请求

提交订单

请求地址

/api/order/auth/submitOrder?tradeNo={tradeNo}

请求方式

POST

参数类型

参数名称

类型

是否必选

描述

traderNo

string

Y

交易编号(拼接在路径中)

consignee

string

Y

收件人姓名

consigneeTel

string

Y

收件人电话

deliveryAddress

string

Y

收件地址

paymentWay

string

Y

支付方式

(ONLINE代表在线)

orderComment

string

Y

订单备注

orderDetailList

Array

Y

存储多个商品对象的数组

例子:

{

    "consignee": "admin",

    "consigneeTel": "15011111111",

    "deliveryAddress": "北京市昌平区2",

    "paymentWay": "ONLINE",

    "orderComment": "xxx",

    "orderDetailList": [

        {

            "id": null,

            "orderId": null,

            "skuId": 6,

            "skuName": " Apple iPhone 11 (A2223) 128GB 红色 移动联通电信22",

            "imgUrl": "http://182.92.128.115:8080//rBFUDF6V0JmAG9XGAAGL4LZv5fQ163.png",

            "orderPrice": 4343,

            "skuNum": 2,

            "hasStock": null

        },

        {

            "id": null,

            "orderId": null,

            "skuId": 4,

            "skuName": "Apple iPhone 11 (A2223) 128GB 红色",

            "imgUrl": "http://182.92.128.115:80800/rBFUDF6VzaeANzIOAAL1X4gVWEE035.png",

            "orderPrice": 5999,

            "skuNum": 1,

            "hasStock": null

        }

    ]

}

返回示例

成功:

{

    "code": 200,

    "message": "成功",

    "data": 71,   // orderId 订单号

    "ok": true

}

写接口,这里换一种方式。我们不在通过vuex的方式。

现在我们这里有一个新的需求,只需引入一次,接口都可以使用,我们可以用全局事件总线的方式

 统一引入的方式

 我们这里换了一种方式,不使用vuex。用data来存储数据 

测试一下,成功了 

获取订单号与展示支付信息

这里做一个判断,如果提交订单成功。路由跳转+路由传递参数

然后我们在pay页面显示我们传递过去的值 

像我们这里就是订单号传递过去,然后发起请求

获取订单支付信息

请求地址

/api/payment/weixin/createNative/{orderId}

请求方式

GET

参数类型

参数名称

类型

是否必选

描述

orderId

string

Y

支付订单ID

(通过提交订单得到)

返回示例

成功:

{

    "code": 200,

    "message": "成功",

    "data": {

        "codeUrl": "weixin://wxpay/bizpayurl?pr=P0aPBJK",

        "orderId": 71,

        "totalFee": 23996,

        "resultCode": "SUCCESS"

    },

    "ok": true

}

 然后写api

然后在mounted中发请求

注意不要在生命周期函数中使用async

 先把他打印出来看看,测试一下

 

大概是这样的 

 但是发现id是拿到了,但是支付报错了。可能接口不能正常使用

支付页面中使用elementUI以及按需引入

常用的组件库

React(Vue):antd[PC] antd-mobile[移动端]

Vue:elementUi[PC] vant[移动端]

没有element-ui 先下载

 我们别完整引入(太大了),我们可以按需引入

 配置一下

 然后引入它

 这里可以安装一个新的插件来帮助我们 

<el-就有了 沒< 有可能没有效果

 然后效果就有了

然后修改我们的项目

 elementui注册组件的时候,还有一种写法,挂在原型上

这里我们需要使用这个

 因为它是挂载在原型对象上,因此它可以直接this.$alert了

 大概的效果是这样的

 open(){this.$alert('<strong>这是 <i>HTML</i> 片段</strong>', 'HTML 片段', {dangerouslyUseHTMLString: true,// 中间布局center:true,// 是否显示取消按钮showCancelButton:true,// 取消按钮的文本内容cancelButtonText:'支付遇到问题',confirmButtonText:'已支付成功',// 右上角的xshowClose:false});}

微信支付业务上

就是添加一个二维码的功能

现在这个接口好像蹦了,现在只提供思想。原本支付成功会返回一个data,data里面有存储微信二维码的地址

在这里我们需要使用一个新的技术,那就是qrcode.

先下载然后去应用他

这里接口不能正常使用,我才用写死方式模拟出一个 

如何判断支付成功还是失败

你需要知道支付成功还是失败。

支付成功实现路由的跳转,支付失败显示提示信息

这里我们需要用新的接口

查询支付订单状态

请求地址

/api/payment/weixin/queryPayStatus/{orderId}

请求方式

GET

参数类型

参数名称

类型

是否必选

描述

orderId

string

Y

支付订单ID

返回示例

成功:

{

    "code": 205,

    "message": "支付中",

    "data": null,

    "ok": false

}

 写接口 

长轮询,什么叫长轮询?长轮询(Long polling) (javascript.info)

 基本的逻辑是这样的

上述代码是一个定时器的逻辑,它在特定时间间隔内执行一段异步操作。下面是对代码的解析:

  1. 首先,判断this.timer是否为假值(例如null或undefined)。这样可以确保只有当定时器不存在时才能创建一个新的定时器。

  2. 如果条件满足,将创建一个定时器。定时器使用setInterval函数,接受两个参数:一个异步函数和时间间隔(以毫秒为单位)。

  3. 异步函数中,调用this.$API.reqPayStatus(this.orderId)发送请求,获取支付状态的结果。这里使用了await关键字等待异步操作完成,并将结果赋给变量result

  4. 检查result.code是否等于200,表示支付成功。

  5. 如果支付成功,执行以下操作: a. 清除定时器:调用clearInterval(this.timer)清除之前设置的定时器。 b. 将this.timer设置为null,表示定时器已被清除。 c. 保存支付成功返回的code:将result.code赋给变量this.code,以便后续使用。 d. 关闭弹出框:使用this.$msgbox.close()关闭当前弹出框。 e. 跳转到支付成功路由:使用this.$router.push('/paysuccess')导航到指定的支付成功页面。

  6. 整个过程会每隔1000毫秒(即1秒)执行一次,直到支付成功为止。

这段代码的作用是在一定时间间隔内轮询请求支付状态,如果支付成功,则进行相应操作,并清除定时器。

然后捞组件,实现跳转

完成,这个也告诉了我们为什么code当开始就null,如果当开始不为null,用户直接点支付成功。直接跳转到paysuccess页面当中 

微信支付业务下

我们不应该在点完已支付成功后直接消失

 

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

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

相关文章

Kubernetes架构和工作流程

目录 一、kubernetes简介 1.k8s的由来 2.为什么用 k8s &#xff1f; 3.k8s主要功能 二、k8s集群架构与组件 1.Master 组件 1.1Kube-apiserver 1.2Kube-controller-manager 1.3Kube-scheduler 2.Node组件 2.1Kubelet 2.2Kube-Proxy 2.3docker 或 rocket 3.配置存储中…

刷题笔记 day8

1004 最大连续1的个数 III 这道题要求将原数组中的0翻转成1&#xff0c;求出最大元素全是1的子数组长度&#xff0c;看这道题第一感觉还要将里面的0变成1&#xff0c;感觉这道题解决起来很麻烦&#xff0c;但是我们可以转变思路&#xff0c;找出其最大子数组&#xff0c;使得子…

K8S系列文章 之 容器存储基础 Volume

Volume Volume是容器数据卷。我们经常创建删除一些容器&#xff0c;但有时候需要保留容器中的一些数据&#xff0c;这时候就用到了Volume。它也是容器之间数据共享的技术&#xff0c;可以将容器中产生的数据同步到本地。实际就是把容器中的目录挂载到运行着容器的服务器或个人…

FANUC机器人SRVO-105和SRVO-067故障报警原因分析及处理方法

FANUC机器人SRVO-105和SRVO-067故障报警原因分析及处理方法 如下图所示,公司的一台机器人在正常工作时突然报警SRVO-105门打开或紧急停止,同时还有SRVO-067 OHAL2报警(G:1 A:2),按Reset键无法消除报警, 那么遇到这种情况,首先,我们来看一下报警说明书上的解释: 首先…

LeetCode 热题 100 JavaScript--206. 反转链表

/*** Definition for singly-linked list.* function ListNode(val, next) {* this.val (valundefined ? 0 : val)* this.next (nextundefined ? null : next)* }*/ /*** param {ListNode} head* return {ListNode}*/1、逐个断键&#xff0c;将后一个节点放到前面 …

任务14、无缝衔接,MidJourney瓷砖(Tile)参数制作精良贴图

14.1 任务概述 在这个实验任务中,我们将深入探索《Midjourney Ai绘画》中的Tile技术和其在艺术创作中的具有挑战性的应用。此任务将通过理论学习与实践操作相结合的方式,让参与者更好地理解Tile的核心概念,熟练掌握如何在Midjourney平台上使用Tile参数,并实际运用到AI绘画…

初学者自学python哪本书好,python教程自学全套

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python怎么自学,可以达到什么程度&#xff0c;初学者自学python哪本书好&#xff0c;现在让我们一起来看看吧&#xff01; 前言 Python是一个非常适合自学&#xff0c;0基础的话从入门到精通也只需要花3-4个月PYTHON库“…

边写代码边学习之LSTM

1. 什么是LSTM 长短期记忆网络 LSTM&#xff08;long short-term memory&#xff09;是 RNN 的一种变体&#xff0c;其核心概念在于细胞状态以及“门”结构。细胞状态相当于信息传输的路径&#xff0c;让信息能在序列连中传递下去。你可以将其看作网络的“记忆”。理论上讲&a…

Pytorch深度学习-----神经网络之线性层用法

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

MySQL索引3——Explain关键字和索引使用规则(SQL提示、索引失效、最左前缀法则)

目录 Explain关键字 索引性能分析 Id ——select的查询序列号 Select_type——select查询的类型 Table——表名称 Type——select的连接类型 Possible_key ——显示可能应用在这张表的索引 Key——实际用到的索引 Key_len——实际索引使用到的字节数 Ref ——索引命…

【Linux】五、进程

一、冯诺依曼体系结构 存储器&#xff1a;指的是内存&#xff1b; 输入设备&#xff1a;键盘、摄像头、话筒&#xff0c;磁盘&#xff0c;网卡&#xff1b; 输出设备&#xff1a;显示器、音响、磁盘、网卡&#xff1b; 中央处理器&#xff08;CPU&#xff09;&#xff1a;运算器…

【开源项目--稻草】Day04

【开源项目--稻草】Day04 1. 续 VUE1.1 完善VUEAJAX完成注册功能 Spring验证框架什么是Spring验证框架使用Spring-Validation 稻草问答-学生首页显示首页制作首页的流程开发标签列表标签列表显示原理 从业务逻辑层开始编写控制层代码开发问题列表开发业务逻辑层开发页面和JS代码…

HTML5 Canvas(画布)

<canvas>标签定义图形&#xff0c;比如图表和其他图像&#xff0c;你必须用脚本来绘制图形。 在画布上&#xff08; Canvas &#xff09;画一个共红色矩形&#xff0c;渐变矩形&#xff0c;彩色矩形&#xff0c;和一些彩色文字。 什么是 Canvas&#xff1f; HTML5<c…

机器学习深度学习——序列模型(NLP启动!)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——卷积神经网络&#xff08;LeNet&#xff09; &#x1f4da;订阅专栏&#xff1a;机器学习&&深度…

Mr. Cappuccino的第55杯咖啡——Mybatis一级缓存二级缓存

Mybatis一级缓存&二级缓存 概述一级缓存特点演示前准备效果演示在同一个SqlSession中在不同的SqlSession中 源代码怎么禁止使用一级缓存一级缓存在什么情况下会被清除 二级缓存特点演示前准备效果演示在不同的SqlSession中 源代码怎么关闭二级缓存 一级缓存&#xff08;Spr…

Docker 安装 Tomcat

目录 一、查看 tomcat 版本 二、拉取 Tomcat Docker 镜像 三、创建 Tomcat 容器 四、访问 Tomcat 五、停止和启动容器 一、查看 tomcat 版本 访问 tomcat 镜像库地址&#xff1a;https://hub.docker.com/_/tomcat&#xff0c;可以通过 Tags 查看其他版本的 tomcat; 二、拉…

Android Studio 的Gradle版本修改

使用Android Studio构建项目时&#xff0c;需要配置Gradle&#xff0c;与Gradle插件。 Gradle是一个构建工具&#xff0c;用于管理和自动化Android项目的构建过程。它使用Groovy或Kotlin作为脚本语言&#xff0c;并提供了强大的配置能力来定义项目的依赖关系、编译选项、打包方…

HCIA---OSI/RM--开放式系统互联参考模型

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.OSI--开放式系统互联参考模型简介 OSI开放式系统互联参考模型是一种用于计算机网络通信…

解密Redis:应对面试中的缓存相关问题2

面试官&#xff1a;Redis集群有哪些方案&#xff0c;知道嘛&#xff1f; 候选人&#xff1a;嗯~~&#xff0c;在Redis中提供的集群方案总共有三种&#xff1a;主从复制、哨兵模式、Redis分片集群。 面试官&#xff1a;那你来介绍一下主从同步。 候选人&#xff1a;嗯&#xff…

Flutter iOS 集成使用 fluter boost

在 Flutter项目中集成完 flutter boost&#xff0c;并且已经使用了 flutter boost进行了路由管理&#xff0c;这时如果需要和iOS混合开发&#xff0c;这时就要到 原生端进行集成。 注意&#xff1a;之前建的项目必须是 Flutter module项目&#xff0c;并且原生项目和flutter m…