退款功能实现思路

news2024/9/23 11:26:03

实现退款功能涉及到订单状态的更新、退款记录的保存、与支付服务的对接,以及确保退款操作的幂等性和可靠性。

1、首先使用一个事务保存以下数据

(1)更新订单状态。

(2)保存取消订单记录,记录取消的原因等信息。

(3)保存退款记录。

2、事务提交后先启动一个线程请求支付服务的退款接口

3、定时任务扫描退款记录表,对未退款的记录请求支付服务进行退款,退款成功更新订单的退款状态。

说明:

第2步的作用为了第一时间申请退款,因为定时任务会有一定的延迟。

第3步的作用是由定时任务去更新退款的状态,因为调用了退款接口只是申请退款了,退款结果可能还没有拿到,通过定时任务再次请求支付服务的退款接口,拿到退款结果,更新订单的退款状态,并删除退款记录。

1. 退款功能实现的整体流程

退款功能一般是在订单取消或其他原因触发退款时进行,主要包括以下步骤:

  1. 更新订单状态:订单被取消或需要退款时,更新订单状态为“待退款”或“退款中”。
  2. 保存取消订单记录:保存订单取消的原因及时间,便于后续查看订单的取消历史。
  3. 保存退款记录:记录退款的相关信息,包括退款金额、申请时间、退款渠道、退款状态等。
  4. 调用支付服务的退款接口:使用独立线程或异步任务立即请求支付服务的退款接口。
  5. 定时任务扫描未完成退款的记录:定时任务负责轮询退款记录,重新请求支付服务获取退款结果,并更新订单的退款状态。

2. 数据表设计

为了实现退款功能,通常需要设计以下几张表:

2.1 订单表 (orders)

订单表保存订单的基础信息,包括订单状态字段,需要增加退款状态相关的字段。

  • id:订单 ID。
  • status:订单状态(如待支付、已支付、已取消、待退款、退款成功等)。
  • refund_status:退款状态(如退款中、退款成功、退款失败等)。
  • refund_amount:退款金额。
  • pay_channel:支付渠道(如微信支付、支付宝等)。

2.2 退款记录表 (refund_record)

记录每次退款的详细信息。

  • id:退款记录 ID。
  • order_id:关联的订单 ID。
  • refund_amount:退款金额。
  • refund_channel:退款渠道(微信支付、支付宝等)。
  • refund_status:退款状态(如退款中、退款成功、退款失败等)。
  • apply_time:退款申请时间。
  • refund_time:退款成功时间。
  • refund_reason:退款原因。
  • retry_count:重试次数(用于定时任务追踪退款状态)。

2.3 取消订单记录表 (cancel_order_record)

记录订单取消的信息,包括取消的原因等。

  • id:取消记录 ID。
  • order_id:关联的订单 ID。
  • cancel_reason:取消原因。
  • cancel_time:取消时间。

3. 详细退款流程

3.1 发起退款申请

  • 用户在前端取消订单时,业务系统会调用后端接口执行取消订单并发起退款。
  • 在这个过程中,系统会更新订单状态为“退款中”,并保存取消订单记录和退款记录。
  • 同时,会异步调用支付服务的退款接口,发起退款请求。

3.2 退款状态更新

  • 如果退款请求成功,支付服务会返回退款结果,系统将订单状态更新为“退款成功”,同时更新退款记录。
  • 如果退款请求失败或超时,系统会将退款状态设置为“退款中”,定时任务会定期重新请求退款。

3.3 定时任务轮询

  • 定时任务负责扫描退款记录表中的未完成退款记录,重新调用支付服务获取退款结果,并更新订单状态。
  • 如果退款成功,订单状态更新为“退款成功”,退款记录表中的记录也会被删除或标记为完成。

4. 并发与幂等性处理

  • 幂等性:退款接口的设计必须确保幂等性,避免重复退款。例如,通过 orderIdrefundRecordId 进行唯一性校验。
  • 事务控制:保存订单、取消记录和退款记录的操作需要放在一个事务中,确保所有数据一致性。如果任何一步失败,整个操作会回滚。

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

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

相关文章

实操学习——个人资料的录入、修改、密码的修改

实操学习——个人资料的录入、修改、密码的修改 一、个人资料的录入和修改知识补充:装饰器二、密码的修改知识补充:docker的关闭与启动 一、个人资料的录入和修改 在users的app下创建一个用户详情表 from django.contrib.auth.models import User from…

C/C++逆向:switch语句逆向分析

在逆向分析中,switch语句会被编译器转化为不同的底层实现方式,这取决于编译器优化和具体的场景。常见的实现方式包括以下几种: ①顺序判断(if-else链): 编译器将switch语句转化为一系列的if-else语句。这…

【第十四章:Sentosa_DSML社区版-机器学习时间序列】

目录 【第十四章:Sentosa_DSML社区版-机器学习时间序列】 14.1 ARIMAX 14.2 ARIMA 14.3 HoltWinters 14.4 一次指数平滑预测 14.5 二次指数平滑预测 【第十四章:Sentosa_DSML社区版-机器学习时间序列】 14.1 ARIMAX 1.算子介绍 考虑其他序列对一…

Flutter鸿蒙化(windows)

Flutter鸿蒙化(windows) 参考资料Window配置Flutter的鸿蒙化环境下载配置环境变量HarmonyOS的环境变量配置配置Flutter的环境变量Flutter doctor -v 检测的问题flutter_flutter仓库地址的警告问题Fliutter doctor –v 报错[!] Android Studio (version 2…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-18

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-18 1. The Application of Large Language Models in Primary Healthcare Services and the Challenges W YAN, J HU, H ZENG, M LIU, W LIANG - Chinese General Practice, 2024 人工智能大语言模型在基层医疗…

软媒市场新探索:软文媒体自助发布,开启自助发稿新篇章

在繁华喧嚣的软媒市场中,每一个声音都在竭力呼喊,每一个品牌都在奋力展现。而软文,作为一种温柔而坚韧的营销力量,正逐渐崭露头角。特别是软文媒体自助发布平台的出现,更是为企业提供了一个全新的、高效的自助发稿渠道。 软媒市场自助发布平台,正如其名,是一个让企业能够自主发…

离职员工客户如何管理?解锁2024企业微信新功能

公司里员工来来去去很正常,但每次有人走,老板们都会头疼,因为客户信息得有人接着管。客户对公司来说太重要了,不能丢。2024年,企业微信出了个新招,就是员工离职后,客户信息可以轻松转给新来的员…

JVM的基本概念

目录 一、JVM的内存划分 二、JVM的类加载过程 三、JVM的垃圾回收机制(GC) 四、分代回收 一、JVM的内存划分 一个运行起来的Java进程,就是一个Java虚拟机,就需要从操作系统中申请一大块内存。申请的内存会划分为不同的区域&…

Maven笔记(一):基础使用【记录】

Maven笔记(一)-基础使用 Maven是专门用于管理和构建Java项目的工具,它的主要功能有: 提供了一套标准化的项目结构 Maven提供了一套标准化的项目结构,所有IDE(eclipse、myeclipse、IntelliJ IDEA 等 项目开发工具) 使…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-17

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-17 1. Large Language Models in Biomedical and Health Informatics: A Review with Bibliometric Analysis H Yu, L Fan, L Li, J Zhou, Z Ma, L Xian, W Hua, S He… - Journal of Healthcare …, 2024 生物…

HarmonyOS应用开发(组件库)--组件模块化开发、工具包、设计模式(持续更新)

致力于,UI开发拿来即用,提高开发效率 正则表达式...手机号校验...邮箱校验 文件判断文件是否存在 网络下载下载图片从沙箱中图片转为Base64格式从资源文件中读取图片转Base64 组件输入框...矩形输入框...输入框堆叠效果(用于登录使用&#xf…

【自动驾驶】决策规划算法(二)参考线模块Ⅰ| 平滑算法与二次规划

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

(学习记录)使用 STM32CubeMX——GPIO引脚输入配置

STM32F103C8T6的GPIO引脚输入配置 时钟配置 (学习记录)使用 STM32CubeMX——配置时钟(入门)https://blog.csdn.net/Wang2869902214/article/details/142423522 GPIO 引脚输出配置 (学习记录)使用 STM32…

Springcloud框架-能源管理系统-能源管理系统源码-能源在线监测平台-双碳平台

一、介绍 基于SpringCloud的能管管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码 有需者咨询,非诚勿扰; 二、软件架构 二、功能介绍 三、数字大屏展示 四、数据采集原理 五、软件截图

macos pyenv 安装python tk 、tkinter图形库方法步骤和使用总结

在macos中, pyenv 是一款用来管理多版本python 的工具, 我们常用的tk图形库是一个独立的工具库,我们在python里面使用的tkinter模块仅是调用这个独立的tk图形库, 所以如果我们希望在python里面使用它, 就必须要先安装t…

委托的注册及注销+观察者模式

事件 委托变量如果公开出去,很不安全,外部可以随意调用 所以取消public,封闭它,我们可以自己书写两个方法,供外部注册与注销,委托调用在子方法里调用,这样封装委托变量可以使它更安全,这个就叫…

金融加密机的定义与功能

金融加密机是一种用于保护金融交易数据和信息安全的重要安全设备。它通过硬件和软件的多重保障,确保金融交易中的敏感数据不被泄露或篡改。以下是关于金融加密机的详细介绍: 一、定义与功能 金融加密机是一种硬件安全设备,通过实现各种密码算…

深度deepin初体验(一)系统详细安装过程 | 国产系统

这里写自定义目录标题 深度deepin初体验(一)系统详细安装过程1.介绍2.安装要求3.环境4.创建虚拟机/系统升级系统选择语言硬盘分区备份文件拷贝系统重启常规设置 深度deepin初体验(一)系统详细安装过程 1.介绍 深度deepin是在debi…

Python开发深度学习常见安装包 error 解决

Python Python 是一种广泛使用的高级编程语言,它以其清晰的语法和代码可读性而闻名。Python 支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。由于其简洁性和强大的标准库,Python 成为了数据科学、机器学习、网络开发、自动化脚…

气膜馆:新型场馆的盈利之道—轻空间

气膜馆作为一种创新的场馆形式,凭借其先进的技术和灵活的应用,正在快速崛起,展现出广阔的市场前景与丰富的盈利潜力。通过多元化的经营模式,气膜馆为创业者提供了前所未有的商机。本文将深入分析气膜馆的盈利模式及其在市场中的竞…