基于Flask的python后端,组合支付记录,充值余额+赠送余额+微信支付功能实现详解

手里一个项目 涉及到订单补差价的支付问题,记录下代码与逻辑
该系统基于Flask框架,并支持多种支付方式的组合,包括直接微信支付、充值账户余额支付和赠送账户余额支付。

本文将详细介绍这一差价支付功能的实现细节,代码主要包括四个部分:差价支付的主函数、三种组合支付的逻辑、余额组合支付的逻辑和充值余额支付的逻辑。

代码原文 :

# 差价支付
def additional_payment_order_payment(user):from flask import requestdata = request.jsonorder_id = data.get('order_id')if not order_id:return reg_func(400, None, '订单id不能为空')add_pays = XOrderAdditionalPayment.query.filter_by(order_id=order_id,additional_payment_status='待支付',is_del=0).all()if not add_pays:return reg_func(400, None, '不存在补差信息')order = XOrder.query.filter_by(id=order_id).first()money = 0for item in add_pays:money += item.additional_payment_amount# 差价支付订单号 微信支付用related_order_number = random_order_number('B')# 充值余额recharge_amount = user.recharge_amount# 赠送余额bonus_amount = user.bonus_amount# 用户总余额all_amount = recharge_amount + bonus_amount# 直接微信支付if all_amount == 0:wx_pay = money * 100for item in add_pays:item.pay_order_number = related_order_numberdb.session.commit()return xcx_pay(user.wx_xcx_openid, int(wx_pay), related_order_number)# 如果充值余额足够支付elif recharge_amount >= money:return recharge_amount_pay(user, money, add_pays, order)# 如果余额足够支付elif all_amount >= money:return recharge_balance_and_bonus_payment(user, order, money, add_pays)else:return three_way_combination_payment(user, order, money, add_pays, related_order_number)# 余额不足,需要微信支付# 三种组合支付
def three_way_combination_payment(user, order, money, all_order, related_order_number):# 充值余额recharge_amount = user.recharge_amountbonus_amount = user.bonus_amount# 充值余额 有多少花多少if recharge_amount > 0:# 更新用户充值余额user.recharge_amount -= recharge_amountrecharge_amount_log = new_amount_log(user, recharge_amount, '充值账户','充值账户余额支付差价', order.order_type,order.order_number)# 增加支付记录db.session.add(recharge_amount_log)money -= recharge_amount# 充值账户的钱也干完if bonus_amount > 0:# 赠送账户扣款user.bonus_amount -= moneybonus_amount_log = new_amount_log(user, money, '赠送账户','赠送账户余额支付差价', order.order_type,order.order_number)db.session.add(bonus_amount_log)# 剩下的 微信支付来wx_pay = money * 100for item in all_order:item.pay_order_number = related_order_numberdb.session.commit()return xcx_pay(user.wx_xcx_openid, int(wx_pay), related_order_number)# 余额组合支付
def recharge_balance_and_bonus_payment(user, order, money, all_order):# 充值余额recharge_amount = user.recharge_amount# 充值余额 有多少花多少if recharge_amount > 0:# 更新用户充值余额user.recharge_amount -= recharge_amountrecharge_amount_log = new_amount_log(user, recharge_amount, '充值账户','充值账户余额支付差价', order.order_type,order.order_number)# 增加支付记录db.session.add(recharge_amount_log)money -= recharge_amount# 赠送账户扣款user.bonus_amount -= moneybonus_amount_log = new_amount_log(user, money, '赠送账户','赠送账户余额支付差价', order.order_type,order.order_number)db.session.add(bonus_amount_log)for item in all_order:item.additional_payment_status = '已支付'item.additional_payment_time = datetime.now()item.additional_payment_method = '余额支付'try:db.session.commit()return reg_func(200, None, '支付成功')except SQLAlchemyError as e:return reg_func(400, str(e), f'支付失败:请重试')# 赠送余额支付金额# bonus_amount_spay -= recharge_amount_pay# 充值余额支付
def recharge_amount_pay(user, money, all_order, order):# 修改用户充值余额账户user.recharge_amount -= moneynew_log = new_amount_log(user, money, '充值账户', '充值账户余额支付差价',order.order_type,order.order_number)db.session.add(new_log)for item in all_order:item.additional_payment_status = '已支付'item.additional_payment_time = datetime.now()item.additional_payment_method = '余额支付'try:db.session.commit()return reg_func(200, None, '支付成功')except SQLAlchemyError as e:return reg_func(400, str(e), f'支付失败:请重试')

详细介绍: 由GPT协助撰稿

详细介绍文章

概述

在电子商务和在线交易平台中,用户常常会遇到需要补交差价的情况。为了优化用户体验,我们设计并实现了一套灵活的差价支付系统。该系统基于Flask框架,支持多种支付方式,包括直接微信支付、充值账户余额支付和赠送账户余额支付等多种组合支付方式。

本篇文章将详细介绍这一差价支付功能的实现,包括每个函数的功能和实现逻辑,以及在实际应用中的优势和可扩展性。

系统设计思路

差价支付系统的设计旨在满足以下几个关键需求:

  1. 多种支付方式的灵活组合:用户可以使用不同的支付方式组合来完成差价支付,确保用户在支付时有多种选择。
  2. 便捷的支付流程:系统自动判断用户账户余额和支付需求,提供最佳的支付方式,简化支付流程。
  3. 安全性和可靠性:通过Flask和SQLAlchemy,确保数据的安全性和支付流程的可靠性。
代码实现

下面是差价支付系统的详细代码实现,包括四个主要部分:差价支付主函数、三种组合支付的逻辑、余额组合支付的逻辑和充值余额支付的逻辑。

1. 差价支付主函数

additional_payment_order_payment函数是整个支付流程的入口。它负责处理用户的差价支付请求,首先从请求数据中提取订单ID,并检查是否存在未支付的补差信息。如果用户的余额不足以支付差价,系统会生成一个新的微信支付订单号,并根据用户的余额情况选择适当的支付方式。

def additional_payment_order_payment(user):from flask import requestdata = request.jsonorder_id = data.get('order_id')if not order_id:return reg_func(400, None, '订单id不能为空')add_pays = XOrderAdditionalPayment.query.filter_by(order_id=order_id,additional_payment_status='待支付',is_del=0).all()if not add_pays:return reg_func(400, None, '不存在补差信息')order = XOrder.query.filter_by(id=order_id).first()money = 0for item in add_pays:money += item.additional_payment_amountrelated_order_number = random_order_number('B')recharge_amount = user.recharge_amountbonus_amount = user.bonus_amountall_amount = recharge_amount + bonus_amountif all_amount == 0:wx_pay = money * 100for item in add_pays:item.pay_order_number = related_order_numberdb.session.commit()return xcx_pay(user.wx_xcx_openid, int(wx_pay), related_order_number)elif recharge_amount >= money:return recharge_amount_pay(user, money, add_pays, order)elif all_amount >= money:return recharge_balance_and_bonus_payment(user, order, money, add_pays)else:return three_way_combination_payment(user, order, money, add_pays, related_order_number)

功能说明

  • 订单ID校验:从请求数据中获取订单ID,检查是否为空。

  • 查询未支付的补差信息:从数据库中查询所有未支付的补差记录。

  • 计算应支付的总金额:遍历所有未支付记录,计算需要支付的总金额。

  • 选择支付方式:根据用户的余额情况,选择合适的支付方式:

    • 如果用户没有任何余额,则直接通过微信支付。
    • 如果用户的充值余额足够支付,则使用充值余额支付。
    • 如果用户的总余额(充值余额+赠送余额)足够支付,则使用余额组合支付。
    • 如果余额不足,则进行三种支付方式的组合支付。
2. 三种组合支付

three_way_combination_payment函数处理当用户的总余额不足以支付差价时的情况。系统会优先使用充值余额支付,再使用赠送余额支付,最后剩余部分通过微信支付来完成。

def three_way_combination_payment(user, order, money, all_order, related_order_number):recharge_amount = user.recharge_amountbonus_amount = user.bonus_amountif recharge_amount > 0:user.recharge_amount -= recharge_amountrecharge_amount_log = new_amount_log(user, recharge_amount, '充值账户','充值账户余额支付差价', order.order_type,order.order_number)db.session.add(recharge_amount_log)money -= recharge_amountif bonus_amount > 0:user.bonus_amount -= moneybonus_amount_log = new_amount_log(user, money, '赠送账户','赠送账户余额支付差价', order.order_type,order.order_number)db.session.add(bonus_amount_log)wx_pay = money * 100for item in all_order:item.pay_order_number = related_order_numberdb.session.commit()return xcx_pay(user.wx_xcx_openid, int(wx_pay), related_order_number)

功能说明

  • 优先使用充值余额:如果用户有充值余额,系统会首先使用充值余额支付,并记录相关的支付日志。
  • 使用赠送余额支付剩余部分:如果用户还有未支付的金额,则使用赠送余额支付,并记录支付日志。
  • 微信支付剩余金额:如果余额仍然不足,剩余的金额通过微信支付来完成,确保整个支付过程的顺利进行。
3. 余额组合支付

recharge_balance_and_bonus_payment函数在用户的充值余额和赠送余额合计足够支付差价时使用。它优先使用充值余额支付,剩余部分由赠送余额支付。

def recharge_balance_and_bonus_payment(user, order, money, all_order):recharge_amount = user.recharge_amountif recharge_amount > 0:user.recharge_amount -= recharge_amountrecharge_amount_log = new_amount_log(user, recharge_amount, '充值账户','充值账户余额支付差价', order.order_type,order.order_number)db.session.add(recharge_amount_log)money -= recharge_amountuser.bonus_amount -= moneybonus_amount_log = new_amount_log(user, money, '赠送账户','赠送账户余额支付差价', order.order_type,order.order_number)db.session.add(bonus_amount_log)for item in all_order:item.additional_payment_status = '已支付'item.additional_payment_time = datetime.now()item.additional_payment_method = '余额支付'try:db.session.commit()return reg_func(200, None, '支付成功')except SQLAlchemyError as e:return reg_func(400, str(e), f'支付失败:请重试')

功能说明

  • 优先使用充值余额:系统会首先使用用户的充值余额支付,并记录支付日志。
  • 使用赠送余额支付剩余部分:如果充值余额不足,则使用赠送余额支付剩余部分,并更新支付状态。
  • 处理支付异常:如果支付过程中发生异常,系统会捕获并返回错误信息,确保用户能够及时了解支付情况。
4. 充值余额支付

recharge_amount_pay函数在用户的充值余额足以支付差价的情况下使用。它会直接从充值余额中扣除相应的金额,并更新相关支付记录。

def recharge_amount_pay(user, money, all_order, order):user.recharge_amount -= moneynew_log = new_amount_log(user, money, '充值账户', '充值账户余额支付差价',order.order_type,order.order_number)db.session.add(new_log)for item in all_order:item.additional_payment_status = '已支付'item.additional_payment_time = datetime.now()item.additional_payment_method = '余额支付'try:db.session.commit()return reg_func(200, None, '支付成功')except SQLAlchemyError as e:return reg_func(400, str(e), f'支付失败:请重试')

功能说明

  • 直接使用充值余额支付:在用户的充值余额足够支付的情况下,系统会直接从充值余额中扣除相应金额,更新相关的支付日志和支付状态。
  • 处理支付异常:如果支付过程中发生错误,系统会捕获并返回错误信息,以便用户可以重新尝试支付。
实现效果与优势

通过这套差价支付系统,用户可以根据自身的余额情况选择最合适的支付方式,灵活应对各种支付需求。系统不仅简化了支付流程,还提高了支付的安全性和用户体验。以下是这套系统的几个显著优势:

  1. 灵活的支付方式:支持多种支付方式和组合,用户可以根据实际情况选择最佳的支付方式。
  2. 便捷的支付流程:自动化处理支付逻辑,减少用户的操作步骤,提高支付效率。
  3. 高效的支付处理:使用Flask和SQLAlchemy等

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

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

相关文章

46-1 护网溯源 - 钓鱼邮件溯源

一、客户提供钓鱼邮件样本 二、行为分析 三、样本分析 对钓鱼邮件中的木马程序1111.exe文件进行了分析,提交了360安全大脑沙箱云和微步在线云沙箱。 360安全大脑沙箱云显示,该1111.exe文件存在危险,因此在解压时需要谨慎操作,以免触发木马程序。 建议使用360压缩软件进行…

面试(02)————Java集合篇

目录 一、为什么数组索引是从0开始?如果从1开始不行吗? 二、ArrayList底层的实现原理是什么? ​编辑三、ArrayList list new ArrayList(10)中的list扩容几次? 四、如何实现数组与List之间的转换? 五、ArrayList…

Swift 序列(Sequence)排序面面俱到 - 从过去到现在(三)

概述 在上一篇 Swift 序列(Sequence)排序面面俱到 - 从过去到现在(二) 博文中,我们介绍了如何构建一个自定义类型中“多属性”排序的通用实现。 而在本课中我们将再接再厉介绍 iOS 15+ 中新的排序机制,并简要剖析就地排序(In-place sorting)对运行性能有着怎样的显著影…

基础乐理入门

基础概念 乐音:音高(频率)固定,振动规则的音。钢琴等乐器发出的是乐音,听起来悦耳、柔和。噪音:振动不规则,音高也不明显的音。风声、雨声、机器轰鸣声是噪音,大多数打击乐器&#…

【RK3568】制作Android11开机动画

Android 开机 logo 分为两种:静态显示和动态显示。静态显示就是循环显示一张图片;动态显示就是以特定帧率顺序显示多张图片 1.准备 android logo 图片 Android logo最好是png格式的,因为同一张图片的情况下,png 格式的比 jpg和b…

线性表和链表

一,线性结构 1.Array Array文档:可以自行阅读相关文档来了解Array class array.array(typecode[, initializer]) array.append(x):添加元素到数组末尾 array.count(x):计算元素出现次数 array.extend(iterable):将迭代…

shell编程(二)——字符串与数组

本文为shell 编程的第二篇,介绍shell中的字符串和数组相关内容。 一、字符串 shell 字符串可以用单引号 ‘’,也可以用双引号 “”,也可以不用引号。 单引号的特点 单引号里不识别变量单引号里不能出现单独的单引号(使用转义符…

ChatTTS增强版V2,批量导出srt,语速控制,情感控制,支持朗读数字,问题修复

ChatTTS增强版最新版本已经发布,本次更新我主要增加了多文本批量、SRT导出、语速控制、情感控制、停顿控制等新功能,并针对上一版本中存在的数字读音异常、随机uv_break等问题进行了修复。 视频版本 【ChatTTS增强版V2,批量导出srt&#xff…

Java - Date类与Calendar类

在Java中,Date 类和 Calendar 类都被用于处理日期和时间,但它们之间存在一些重要的差异。下面是对这两个类的简要说明以及它们之间的主要区别。 Date 类 java.util.Date 类表示一个特定的时间点(精确到毫秒)。它包含自1970年1月…

Android AAudio——C API控制音频流(四)

上一篇文章我们介绍了 C API 中音频流的创建流程,以及打开音频流操作,这里我们再来看一下音频流的其他操作流程 一、音频流操作介绍 1、操作流程图 下图是状态变化流程图,虚线框表示瞬时状态,实线框表示稳定状态。 2、操作函数 上图中主要包含下面几个操作函数: aaudio…

代码随想录训练营Day30

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、重新安排行程 前言 提示:这里可以添加本文要记录的大概内容: 今天是跟着代码随想录刷题的第30天,主要是复习了回溯算法…

ubuntu上存在多个版本python,根据需要选择你想使用的python版本

文章目录 前言一、二、使用步骤总结 前言 参考1 一、 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 1二、使用步骤 总结

2022 hnust 湖科大 javaweb课设 数据库课设 报告+源代码+流程图文件+课设指导书+附赠数据库课堂实验指导书

2022 hnust 湖科大 javaweb课设 数据库课设 报告源代码流程图文件课设指导书附赠数据库课堂实验指导书 描述 湖南科技大学大二下学期先后开展java web和数据库课程设计,两个课设项目可以通用,老师一般会允许自拟选题,所以在此统一打包&…

打造无障碍网络体验:Edge 浏览器代理服务器设置指南

引言 无论你是指尖飞快的技术达人,还是刚踏入IT世界的探索者,网络配置中的代理服务器设置可能都会让你掉几根头发。今天,我们聚焦的是 Microsoft Edge 浏览器中的代理服务器设置,特别是如何配置哪些地址不用通过代理服务器&#…

批量高效调整图片像素:自定义缩小bmp图片,画质优先,一键实现高效优化

图片已经成为我们生活中不可或缺的一部分。无论是社交媒体分享,还是工作文件传输,图片总是扮演着重要的角色。然而,有时候,我们可能会面临一个问题:图片像素过大,不仅占用过多的存储空间,还可能…

了解 Babel 的底层原理

1. 了解Babel的基本概念和作用 Babel 是一个 JavaScript 编译器,也是一个工具链,主要用于将 ECMAScript 2015(即ES6)代码转换为当前和旧版浏览器或环境中向后兼容的 JavaScript 版本(如ES5)。Babel 的主要…

【环境搭建】1.阿里云ECS服务器 安装jdk8

在阿里云服务器上安装 JDK 8 可以通过以下步骤完成。假设你使用的是 CentOS 或者其他基于 Red Hat 的发行版或Alibaba Cloud Linux 3.2104 LTS 64位。 1.更新系统软件包 sudo yum update -y2.安装 OpenJDK 8 使用 yum 包管理器安装 OpenJDK 8 sudo yum install -y java-1.8…

Linux编译器-gcc或g++的使用

一.安装gcc/g 在linux中是不会自带gcc/g的,我们需要编译程序就自己需要安装gcc/g。 很简单我们使用简单的命令安装gcc:sudo yum install -y gcc。 g安装:sudo yum install -y gcc-c。 我们知道Windows上区分文件,都是使用文件…

如何使用Python的Turtle模块绘制小猪

一、前置条件 在开始学习如何使用Python的Turtle模块进行绘画之前,请确保你的电脑已安装Python环境。如果尚未安装Python,你可以从Python官网下载并安装最新版本。 Turtle模块是Python内置的一个用于绘图的库,通常不需要额外安装。如果你发…

反转链表 (oj题)

一、题目链接 https://leetcode.cn/problems/reverse-linked-list/submissions/538124207 二、题目思路 1.定义三个指针,p1先指向NULL p2指向头结点 p3指向第二个结点 2.p2的next指向p1。然后移动指针,p1来到p2的位置,p2来到p3的位置&…