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

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

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

系统设计思路

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

  1. 多种支付方式的灵活组合:用户可以使用不同的支付方式组合来完成差价支付,确保用户在支付时有多种选择。
  2. 便捷的支付流程:系统自动判断用户账户余额和支付需求,提供最佳的支付方式,简化支付流程。
  3. 安全性和可靠性:通过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'支付失败:请重试')

功能说明

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈钇谷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值