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

如何在Django中保存收货地址实现Stripe Checkout自动填充?

问题:Stripe Checkout如何自动填充收货地址?

我在Django视图中设置了shipping_address_collection,代码如下:

# "views.py"

import stripe
from django.shortcuts import redirect

def test(request):
    customer = stripe.Customer.search(query="email:'test@gmail.com'", limit=1)
    checkout_session = stripe.checkout.Session.create(
        customer=customer["data"][0]["id"] if customer['data'] else None,
        line_items=[
            {
                "price_data": {
                    "currency": "USD",
                    "unit_amount_decimal": 1000,
                    "product_data": {
                        "name": "T-shirt",
                    },
                },
                "quantity": 2,
            }
        ],
        payment_method_options={ 
            "card": {
                "setup_future_usage": "on_session",
            },
        },
        shipping_address_collection={
            "allowed_countries": ['US']
        },
        mode='payment',
        success_url='http://localhost:8000',
        cancel_url='http://localhost:8000'
    )

    return redirect(checkout_session.url, code=303) 

目前支付详情可通过setup_future_usage自动保存,但每次进入Stripe Checkout时,收货地址仍需手动填写。请问如何保存收货地址以实现自动填充?是否存在类似setup_future_usage的机制?


解决方案

Stripe Checkout没有专门对应收货地址的setup_future_usage参数,但满足以下条件即可实现自动填充:

  • 关联的Customer对象已保存收货地址:创建Checkout Session时指定customer参数,且该Customer对象存在shipping字段(包含完整地址信息),Stripe Checkout会自动填充该地址。
  • 支付成功后同步收货地址到Customer:若用户首次填写地址,需在支付完成后通过Stripe Webhook提取地址,更新到对应Customer对象中,下次创建Session时即可自动填充。

具体实现步骤

  1. 检查Customer的收货地址状态
    可以通过API查询目标Customer是否已保存地址:

    customer = stripe.Customer.retrieve(customer_id)
    print(customer.shipping)  # 返回None则说明未保存地址
    

    也可直接在Stripe Dashboard查看Customer详情确认。

  2. 通过Webhook同步收货地址
    配置Webhook监听checkout.session.completed事件,在回调中提取地址并更新Customer:

    # 示例Webhook处理视图
    def stripe_webhook(request):
        payload = request.body
        sig_header = request.META['HTTP_STRIPE_SIGNATURE']
        event = None
    
        try:
            event = stripe.Webhook.construct_event(
                payload, sig_header, settings.STRIPE_WEBHOOK_SECRET
            )
        except (ValueError, stripe.error.SignatureVerificationError):
            return HttpResponse(status=400)
    
        if event['type'] == 'checkout.session.completed':
            session = event['data']['object']
            # 仅当session有收货地址且关联Customer时执行更新
            if session.get('shipping') and session.get('customer'):
                stripe.Customer.modify(
                    session['customer'],
                    shipping=session['shipping']
                )
    
        return HttpResponse(status=200)
    
  3. 验证自动填充效果
    当Customer保存收货地址后,再次创建Checkout Session并指定该Customer,Stripe Checkout页面会自动填充已保存的地址,用户无需重复填写。


内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:03:36