如何在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
相关产品推荐
相关产品推荐

