手里一个项目 涉及到订单补差价的支付问题,记录下代码与逻辑
该系统基于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框架,支持多种支付方式,包括直接微信支付、充值账户余额支付和赠送账户余额支付等多种组合支付方式。
本篇文章将详细介绍这一差价支付功能的实现,包括每个函数的功能和实现逻辑,以及在实际应用中的优势和可扩展性。
系统设计思路
差价支付系统的设计旨在满足以下几个关键需求:
- 多种支付方式的灵活组合:用户可以使用不同的支付方式组合来完成差价支付,确保用户在支付时有多种选择。
- 便捷的支付流程:系统自动判断用户账户余额和支付需求,提供最佳的支付方式,简化支付流程。
- 安全性和可靠性:通过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'支付失败:请重试')
功能说明:
- 直接使用充值余额支付:在用户的充值余额足够支付的情况下,系统会直接从充值余额中扣除相应金额,更新相关的支付日志和支付状态。
- 处理支付异常:如果支付过程中发生错误,系统会捕获并返回错误信息,以便用户可以重新尝试支付。
实现效果与优势
通过这套差价支付系统,用户可以根据自身的余额情况选择最合适的支付方式,灵活应对各种支付需求。系统不仅简化了支付流程,还提高了支付的安全性和用户体验。以下是这套系统的几个显著优势:
- 灵活的支付方式:支持多种支付方式和组合,用户可以根据实际情况选择最佳的支付方式。
- 便捷的支付流程:自动化处理支付逻辑,减少用户的操作步骤,提高支付效率。
- 高效的支付处理:使用Flask和SQLAlchemy等