You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中使用Stripe API实现提现功能?

Django + Stripe 测试模式提现功能实现指南

一、核心逻辑梳理

先明确Stripe提现的关键流程:用户提交银行信息 → 创建Stripe外部账户 → 发起转账到该账户。测试模式下直接用Stripe提供的测试凭证,比如美国测试路由号110000000、测试银行账号000123456789。

二、表单实现(forms.py)

创建表单收集用户必要的提现信息:

from django import forms

class WithdrawForm(forms.Form):
    routing_number = forms.CharField(
        max_length=9,
        label="路由号码",
        widget=forms.TextInput(attrs={'placeholder': '测试用:110000000'})
    )
    account_number = forms.CharField(
        max_length=17,
        label="银行账号",
        widget=forms.TextInput(attrs={'placeholder': '测试用:000123456789'})
    )
    amount = forms.DecimalField(
        max_digits=10,
        decimal_places=2,
        label="提现金额",
        min_value=0.01
    )

三、视图实现(views.py)

处理表单提交,调用Stripe API完成提现流程:

import stripe
from django.conf import settings
from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .forms import WithdrawForm

# 初始化Stripe
stripe.api_key = settings.STRIPE_SECRET_KEY

@login_required
def withdraw(request):
    if request.method == 'POST':
        form = WithdrawForm(request.POST)
        if form.is_valid():
            routing_num = form.cleaned_data['routing_number']
            account_num = form.cleaned_data['account_number']
            amount = int(form.cleaned_data['amount'] * 100)  # Stripe以"分"为单位

            try:
                # 1. 获取用户关联的Stripe客户(需提前在用户注册时创建并保存customer_id到用户模型)
                customer = stripe.Customer.retrieve(request.user.profile.stripe_customer_id)

                # 2. 为客户添加外部银行账户
                external_account = customer.external_accounts.create(
                    external_account={
                        'object': 'bank_account',
                        'country': 'US',
                        'currency': 'usd',
                        'routing_number': routing_num,
                        'account_number': account_num
                    }
                )

                # 3. 发起转账
                transfer = stripe.Transfer.create(
                    amount=amount,
                    currency='usd',
                    destination=external_account.id,
                    transfer_group=f"withdraw_{request.user.id}"
                )

                # 可选:将提现记录保存到本地数据库
                # WithdrawRecord.objects.create(
                #     user=request.user,
                #     amount=form.cleaned_data['amount'],
                #     stripe_transfer_id=transfer.id
                # )

                messages.success(request, "提现请求已提交,测试模式下1-2个工作日模拟到账")
                return redirect('user_dashboard')

            except stripe.error.StripeError as e:
                messages.error(request, f"提现失败:{e.user_message}")
            except Exception as e:
                messages.error(request, f"系统错误:{str(e)}")
    else:
        form = WithdrawForm()
    
    return render(request, 'withdraw.html', {'form': form})

四、模板实现(templates/withdraw.html)

渲染提现表单和提示信息:

{% extends 'base.html' %}

{% block content %}
<h2>提现申请</h2>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit" class="btn btn-primary">提交提现</button>
</form>

{% if messages %}
    {% for msg in messages %}
        <div class="alert alert-{{ msg.tags }} mt-3">{{ msg }}</div>
    {% endfor %}
{% endif %}
{% endblock %}

五、URL配置(urls.py)

添加提现页面的路由:

from django.urls import path
from . import views

urlpatterns = [
    path('withdraw/', views.withdraw, name='withdraw'),
    # 其他路由...
]

六、关键注意事项

  • 用户关联Stripe客户:必须为每个用户创建对应的Stripe Customer对象,建议在用户注册时完成并将customer_id存储到用户扩展模型(如Profile)中。
  • 测试模式特性:测试环境下银行账户会自动通过验证,无需处理微存款验证;生产模式需额外实现验证流程。
  • 权限控制:用@login_required确保只有登录用户能访问提现功能。
  • 错误处理:必须捕获Stripe专属异常,返回友好提示,避免暴露服务器内部错误。

内容的提问来源于stack exchange,提问作者Anfique Hussain V

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:23:37