7.vue3医疗在线问诊项目 - _极速问诊-支付功能实现 ==> 预支付信息渲染、支付流程解析、订单生成、支付完成

news2024/11/26 3:55:30

7.vue3医疗在线问诊项目 - _极速问诊-支付功能实现 ==> 预支付信息渲染、支付流程解析、订单生成、支付完成

问诊支付-路由和预支付信息渲染{#pay-html}

image-20220824154323546

实现:问诊页面路由配置,获取问诊预支付信息并渲染。

需求:

  1. 配置预订单信息页面路由
  2. 定义 API 函数,获取预支付和患者信息
  3. 获取数据渲染

1)路由配置

路由 router/index.ts

    {
      path: '/consult/pay',
      component: () => import('@/views/consult/ConsultPay.vue'),
      meta: { title: '问诊支付' }
    }

2)定义 API 函数,获取预支付信息

types/consult.d.ts

// 问诊订单预支付传参
export type ConsultOrderPreParams = Pick<PartialConsult, 'type' | 'illnessType'>

// 问诊订单预支付信息
export type ConsultOrderPreData = {
  pointDeduction: number
  couponDeduction: number
  couponId: string
  payment: number  // 应付
  couponId: number
  actualPayment: number // 实付
}

api/consult.ts

import type { ConsultOrderPreData, ConsultOrderPreParams } from '@/types/consult'
// 拉取预支付订单信息
export const getConsultOrderPre = (params: ConsultOrderPreParams) =>
  request.get<ConsultOrderPreData>('/patient/consult/order/pre', { params })

api/user.ts

// 查询患者详情
export const getPatientDetail = (id: string) => request.get<Patient>(`/patient/info/${id}`)

3)获取数据渲染 Consult/ConsultPay.vue

<script setup lang="ts">
import { getConsultOrderPre } from '@/api/consult'
import { getPatientDetail } from '@/api/user'
import { useConsultStore } from '@/stores'
import type { ConsultOrderPreData } from '@/types/consult'
import type { Patient } from '@/types/user'
import { onMounted, ref } from 'vue'

const store = useConsultStore()
// 1. 查询预订单信息
const payInfo = ref<ConsultOrderPreData>()
const loadData = async () => {
  const res = await getConsultOrderPre({
    type: store.consult.type,
    illnessType: store.consult.illnessType
  })
  payInfo.value = res.data
  // 设置默认优惠券
  store.setCunpon(payInfo.value.couponId)
}
// 2. 查询患者信息
const patient = ref<Patient>()
const loadPatient = async () => {
  if (!store.consult.patientId) return
  const res = await getPatientDetail(store.consult.patientId)
  patient.value = res.data
}

onMounted(() => {
  loadData()
  loadPatient()
})

const agree = ref(false)
</script>
<template>
  <div class="consult-pay-page" v-if="payInfo">
    <cp-nav-bar title="支付" />
    <div class="pay-info">
+      <p class="tit">图文问诊 {{ payInfo?.payment }} 元</p>
      <img class="img" src="@/assets/avatar-doctor.svg" />
      <p class="desc">
        <span>极速问诊</span>
        <span>自动分配医生</span>
      </p>
    </div>
    <van-cell-group>
+      <van-cell title="优惠券" :value="`-¥${payInfo.couponDeduction}`" />
+      <van-cell title="积分抵扣" :value="`-¥${payInfo.pointDeduction}`" />
+     <van-cell title="实付款" :value="`¥${payInfo.actualPayment}`" class="pay-price" />
    </van-cell-group>
    <div class="pay-space"></div>
    <van-cell-group>
      <van-cell
        title="患者信息"
+        :value="`${patient?.name} | ${patient?.genderValue} | ${patient?.age}岁`"
      ></van-cell>
+      <van-cell title="病情描述" :label="store.consult.illnessDesc"></van-cell>
    </van-cell-group>
    <div class="pay-schema">
      <van-checkbox v-model="agree">我已同意 <span class="text">支付协议</span></van-checkbox>
    </div>
    <van-submit-bar
      button-type="primary"
+     :price="payInfo.actualPayment * 100"
      button-text="立即支付"
      text-align="left"
    />
  </div>
</template>

注意❓:van-submit-bar组件price要乘于100

问诊支付-流程{#pay-line}

了解支付流程

image-20220816220114053

支付流程:

  1. 点击支付按钮,调用生成订单接口,得到 订单ID,打开选择支付方式对话框

  2. 选择支付方式,(测试环境需要配置 回跳地址)调用获取支付地址接口,得到支付地址,跳转到支付宝页面

    • 使用支付宝APP支付(在手机上且安装沙箱支付宝)

    • 使用浏览器账号密码支付 (测试推荐

  3. 支付成功回跳到问诊室页面

回跳地址:开发中自行定义

http://localhost/room 

支付宝沙箱账号:

买家账号:jfjbwb4477@sandbox.com
登录密码:111111
支付密码:111111

问诊支付-生成订单{#pay-create-order}

实现:打开弹层选择支付方式,创建订单,进行支付

image-20221012173426419

1)打开选择支付方式抽屉

const agree = ref(false)
const show = ref(false)
// 支付方式
const paymentMethod = ref<0 | 1>()
const submit = async () => {
  if (!agree.value) return Toast('请勾选我已同意支付协议')
  // 打开
  show.value = true
}
    <div class="pay-schema">
+      <van-checkbox v-model="agree">我已同意 <span class="text">支付协议</span></van-checkbox>
    </div>
    <!-- 3. 支付 -->
    <van-submit-bar
      button-type="primary"
      :price="payInfo.actualPayment * 100"
      button-text="立即支付"
      text-align="left"
+      loading
+      @click="submit"
    />
<!-- 支付弹层 -->
<van-action-sheet v-model:show="show" title="选择支付方式">
  <div class="pay-type">
    <p class="amount">¥{{ payInfo.actualPayment.toFixed(2) }}</p>
    <van-cell-group>
      <van-cell title="微信支付" @click="paymentMethod = 0">
        <template #icon><cp-icon name="consult-wechat" /></template>
        <template #extra><van-checkbox :checked="paymentMethod === 0" /></template>
      </van-cell>
      <van-cell title="支付宝支付" @click="paymentMethod = 1">
        <template #icon><cp-icon name="consult-alipay" /></template>
        <template #extra><van-checkbox :checked="paymentMethod === 1" /></template>
      </van-cell>
    </van-cell-group>
    <div class="btn">
      <van-button type="primary" round block>立即支付</van-button>
    </div>
  </div>
</van-action-sheet>

2)准备创建订单api函数

// 生成订单
export const createConsultOrder = (data: PartialConsult) =>
  request.post<{ id: string }>('/patient/consult/order', data)

3)打开抽屉的时候生成订单ID,成功后清空本地存储的问诊订单信息

+ import { ...,createConsultOrder } from '@/api/consult'

const agree = ref(false)
const show = ref(false)
const paymentMethod = ref<0 | 1>()
+ const orderId = ref('')
+ const loading = ref(false)
const submit = async () => {
  if (!agree.value) return Toast('请勾选我已同意支付协议')
+  loading.value = true
+  const res = await createConsultOrder(store.consult)
+  orderId.value = res.data.id
+  loading.value = false
+  store.clear() // 订单生成后清除pinia中的数据
  // 打开
  show.value = true
}

说明❓:订单创建成功后,清除store中数据,刷新页面接口异常

问诊支付-进行支付{#pay-logic}

实现:获取支付地址,进行订单支付

image-20220824154549604

需求:

  1. 生成订单后:不可回退,用户离开页面前确认
  2. 生成订单后:不可关闭支付抽屉
  3. 获取后台支付地址,跳转支付

1)生成订单后不可回退

import { onBeforeRouteLeave } from 'vue-router'
onBeforeRouteLeave(() => {
  if (orderId.value) return false
})

2)生成订单后不可关闭支付抽屉

  <van-action-sheet
    v-model:show="show"
    title="选择支付方式"
    :close-on-popstate="false"
+    :before-close="onClose"
+    :closeable="false"
  >

image-20230611213541359

const router = useRouter()
const onClose = () => {
  return Dialog.confirm({
    title: '关闭支付',
    message: '取消支付将无法获得医生回复,医生接诊名额有限,是否确认关闭?',
    cancelButtonText: '仍要关闭',
    confirmButtonText: '继续支付',
    confirmButtonColor: 'var(--cp-primary)'
  })
    .then(() => {
      return false
    })
    .catch(() => {
      orderId.value = '' // 清空后才能跳转页面
      router.push('/user/consult')
      return true
    })
}

image-20230611213939730

3)生成支付地址的 API 函数

// 获取支付地址  0 是微信  1 支付宝
export const getConsultOrderPayUrl = (data: {
  paymentMethod: 0 | 1
  orderId: string
  payCallback: string
}) => request.post<{ payUrl: string }>('/patient/consult/pay', data)

4)点击抽屉支付按钮,跳转到支付宝页面

image-20221012181407640
<div class="btn">
  <van-button @click="pay" type="primary" round block>立即支付</van-button>
</div>
// 跳转支付
const pay = async () => {
  if (paymentMethod.value === undefined) return Toast('请选择支付方式')
  Toast.loading('跳转支付')
  const res = await getConsultOrderPayUrl({
    orderId: orderId.value,
    paymentMethod: paymentMethod++.value,
    payCallback: 'http://localhost/room'
  })
  window.location.href = res.data.payUrl
}

说明❓:选择继续浏览器支付,使用账号密码登录即可

小结:

前端支付准备什么?

  1. 创建订单
  2. 获取支付地址,跳转支付宝平台支付,支付成功回跳

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

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

相关文章

[学习笔记] [机器学习] 12. [上] HMM 隐马尔可夫算法(马尔科夫链、HMM 三类问题、前后后向算法、维特比算法、鲍姆-韦尔奇算法、API 及实例)

学习目标&#xff1a; 了解什么是马尔科夫链知道什么是 HMM 模型知道前向后向算法评估观察序列概率知道维特比算法解码隐藏状态序列了解鲍姆-韦尔奇算法知道 HMM 模型 API 的使用 1. 马尔科夫链 学习目标&#xff1a; 知道什么是马尔科夫链 在机器学习算法中&#xff0c;马…

【MySQL入门】-- 数据库介绍

目录 1.为什么要使用数据库&#xff1f; 2.数据库相关概念 3.数据库与数据库管理系统的关系 4.常见数据库排名 5.常见数据库的简单介绍 6.MySQL介绍 7.MySQL版本的选择 8.关系型数据库和非关系型数据库 9.关系型数据库设计规则以及规范 10.表的关系&#xff08;一对…

【Proteus仿真】51单片机+ADC0808模数转换数码管显示

【Proteus仿真】51单片机+ADC0808模数转换数码管显示 📺Proteus仿真演示: 📗ADC0808主要数据参数简介 8路输入通道,8位A/D转换器,即分辨率为8位:0 - 255。转换时间为100μs(时钟为640KHz时),130μs(时钟为500KHz时)。模拟输入电压范围0~+5V,不需零点和满刻度校准。…

谷粒商城第一天-项目概述、架构、Linux环境搭建

目录 一、学习的内容 一、常见的商城模式 二、谷粒商城项目的微服务架构 三、谷粒商城项目的微服务划分 四、谷粒商城项目的亮点 五、微服务的基本的概念 二、完成的进度 三、学到的东西 四、总结 6月9日正式下决心开始学习谷粒商城项目&#xff0c;之前早就听说谷粒商…

Powerjob部署安装

安装思路: 1、本地环境和具体生产环境都要安装部署jdk-------------------参考jdk安装 2、本地部署maven-------------------参考maven安装 3、本地部署powerjob 4、生成jar包,上传生产环境启动 部署: 1、下载上传Powerjob包,本次选取4.0.1版本 https://github.com/Powe…

arx程序与cgal冲突的地方,记录一下

arx本身是个dll&#xff0c;而且运行库是 /md&#xff0c;多线程&#xff0c;无论debug还是release都是/md&#xff0c;而不是/mtd cgal编译出来的库&#xff0c;release版本是Mt&#xff0c;debug版本是MTd 感觉debug版本是MTd对arx没用&#xff0c;不知道这种看法对不对&…

stable diffusion webui 安装部署(linux系统)

文中部署stable diffusion webui所使用的机器是腾讯云服务器linux系统&#xff0c;centos7 一 环境准备 在这里使用anaconda安装&#xff0c;优势就是可以方便地安装和管理软件包&#xff0c;同一系统上可以同时使用不同版本的 Python 和第三方软件包。如果你需要安装多个系统…

图像目标检测 - CenterNet: Objects as Points (arXiv 2019)

CenterNet: Objects as Points - 目标作为点&#xff08;arXiv 2019&#xff09; 摘要1. 引言2. 相关工作3. 准备工作4. 目标作为点4.1 3D 检测4.2 人体姿态估计 5. 实施细节6. 实验6.1 目标检测6.1.1 附加实验 6.2 3D 检测6.3 姿态估计 7. 结论References附录A&#xff1a;模型…

华为防火墙之攻击防范

1.DoS攻击简介 攻击和防御技术发展史 DoS是Denial of Service的简称&#xff0c;即拒绝服务。造成DoS的攻击行为被称为DoS攻击&#xff0c;其目的是使计算机或网络无法正常提供服务。 2.单包攻击及防御 最常见的DoS攻击就是单包攻击&#xff0c;一般都是以个人为单位的攻击者…

回归预测 | MATLAB实现SSA-CNN-BiGRU麻雀算法优化卷积双向门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现SSA-CNN-BiGRU麻雀算法优化卷积双向门控循环单元多输入单输出回归预测 预测效果 基本介绍 MATLAB实现SSA-CNN-BiGRU麻雀算法优化卷积双向门控循环单元多输入单输出回归预测&#xff0c;运行环境Matlab2020b及以上。优化正则化率、学习率、隐藏层单元数。…

大数据Doris(四十二):Routine Load导入Kafka数据到Doris

文章目录 Routine Load导入Kafka数据到Doris 一、创建 Doris 表 二、创建 Kafka topic 三、创建 Routine Load

PTA OJ 合集 C语言

目录 7-1 查找整数 7-2 大笨钟的心情 7-3 将数组中的数逆序存放 7-6 矩阵运算 7-7 求矩阵的局部极大值 7-8 矩阵A乘以B 7-9 找鞍点 6-1 查找数组元素最大值 6-2 在数组中查找指定元素 7-5 求数列之和[A] 6-3 使用函数的选择法排序 6-5 计算天数[2] 6-4 求矩阵不靠…

ABAP 新语法--Open SQL

1. 常量 1.1 常量赋值 常量字段可以用来为内表中的部分字段赋初始值&#xff0c;字段类型和长度依据输入常量的值决定 SELECTmara~matnr, " 物料号mara~matkl, " 物料组mara~mtart, " 物料类型 AS lkenz, " 删除标识&#xff0c;常量空字符串123 AS fla…

STM32 Proteus仿真自动红外避障小车前进后退左右转 -0040

STM32 Proteus仿真自动红外避障小车前进后退左右转 -0040 Proteus仿真小实验&#xff1a; STM32 Proteus仿真自动红外避障小车前进后退左右转 -0040 功能&#xff1a; 硬件组成&#xff1a;STM32F103C LCD1602 L298N电机控制电路2个电机一个左轮一个右轮 2个按键(模拟两个避…

Web安全:bWAPP 靶场搭建.(集成了各种常见漏洞和最新漏洞的开源Web应用程序)

Web安全&#xff1a;bWAPP 靶场搭建. bWAPP是一个集成了了常见漏洞的 web 应用程序&#xff0c;目的是作为漏洞测试的演练场&#xff0c;帮助安全爱好者&#xff0c;开发人员和学生发现和防止Web漏洞。它有超过100个网络漏洞数据&#xff0c;包括所有主要的已知网络漏洞. 目录…

谷粒商城第三天-微服务中基本组件的使用

目录 一、前言 二、学习的内容 一、Nacos的服务注册/发现 1. 导依赖&#xff0c;nacos-discovery java.lang.AbstractMethodError: org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.cho 2. 在application.yml中声明nacos服务器的ip地址和端口号&…

MySQL常见问题

优化慢查询 慢查询可能出现的情况&#xff1a; 聚合查询多表查询表数据量过大深度分页查询 表象&#xff1a;页面加载过慢&#xff0c;接口压测响应时间过长&#xff08;超过1s&#xff09; 如何定位慢查询&#xff1f; 方案一&#xff1a;开源工具 可以使用相应的调试工具&a…

数据库SQL查询(一)

本文介绍SQL查询&#xff0c;如何在海量数据中筛选想要数据&#xff1b; 数据库管理系统选择&#xff1a;关系型数据库mysql 数据库管理工具选择&#xff1a;navicat 本文中查询语句和查询案例参考自&#xff1a;https://edu.csdn.net/course/detail/27673?ops_request_mis…

管理类联考——英语——趣味篇——背诵单词

考友方法推荐 词根词缀巧记考研英语大纲词汇 ⼀、词根词缀构词法的威⼒ 《考研英语⼤纲》要求考⽣掌握 5500 个词汇及相关词组&#xff0c;我们将这 5500 个单词&#xff0c;分成了三类&#xff0c;通过第⼀类“3450 基础⾼频词汇”的学习&#xff0c;考⽣夯实了基础&#xf…

Fmoc-保护氨基酸合成中的新型底物:Fmoc-Thr(Ac4Manα1-2Ac3Manα)-OH,CAS:482576-73-8

文章关键词&#xff1a;糖化学试剂&#xff0c;多肽合成&#xff0c;Fmoc-保护氨基酸&#xff0c;糖基化修饰一、产品描述&#xff1a; 西安凯新生物科技有限公司供应的​Fmoc-Thr(Ac4Manα1-2Ac3Manα)-OH&#xff0c;多肽固相合成法&#xff0c;基于Fmoc化学合成&#xff0c…