手里一个项目 涉及到订单补差价的支付问题,记录下代码与逻辑
该系统基于Flask框架,并支持多种支付方式的组合,包括直接微信支付、充值账户余额支付和赠送账户余额支付。
本文将详细介绍这一差价支付功能的实现细节,代码主要包括四个部分:差价支付的主函数、三种组合支付的逻辑、余额组合支付的逻辑和充值余额支付的逻辑。
代码原文 :
# 差价支付
def additional_payment_order_payment(user):
from flask import request
data = request.json
order_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 = 0
for 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 * 100
for item in add_pays:
item.pay_order_number = related_order_number
db.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_amount
bonus_amount = user.bonus_amount
# 充值余额 有多少花多少
if recharge_amount > 0:
# 更新用户充值余额
user.recharge_amount -= recharge_amount
recharge_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 -= money
bonus_amount_log = new_amount_log(user, money, '赠送账户',
'赠送账户余额支付差价', order.order_type,
order.order_number)
db.session.add(bonus_amount_log)
# 剩下的 微信支付来
wx_pay = money * 100
for item in all_order:
item.pay_order_number = related_order_number
db.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_amount
recharge_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 -= money
bonus_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 -= money
new_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 request
data = request.json
order_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 = 0
for 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 * 100
for item in add_pays:
item.pay_order_number = related_order_number
db.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_amount
bonus_amount = user.bonus_amount
if recharge_amount > 0:
user.recharge_amount -= recharge_amount
recharge_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 -= money
bonus_amount_log = new_amount_log(user, money, '赠送账户',
'赠送账户余额支付差价', order.order_type,
order.order_number)
db.session.add(bonus_amount_log)
wx_pay = money * 100
for item in all_order:
item.pay_order_number = related_order_number
db.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_amount
if recharge_amount > 0:
user.recharge_amount -= recharge_amount
recharge_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 -= money
bonus_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 -= money
new_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等