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

Django集成Stripe无法跳转成功页及支付意向字段为空问题

Django Stripe支付:跳转失败与Payment Intent字段空问题排查

一、支付完成后无法跳转成功页面

1. 前端Stripe.js回调逻辑缺失

检查product.html中的支付表单提交处理代码,确认支付成功后是否添加了跳转逻辑。正确示例如下:

const stripe = Stripe('{{ stripe_public_key }}');
const elements = stripe.elements();
const cardElement = elements.create('card');
cardElement.mount('#card-element');

const form = document.getElementById('payment-form');
form.addEventListener('submit', async (e) => {
  e.preventDefault();
  const { error, paymentIntent } = await stripe.confirmCardPayment(
    '{{ client_secret }}',
    {
      payment_method: { card: cardElement }
    }
  );

  if (error) {
    console.error(error.message);
  } else {
    // 支付成功后跳转至成功页
    if (paymentIntent.status === 'succeeded') {
      window.location.href = "{% url 'payment_success' %}";
    }
  }
});
  • 确认是否遗漏paymentIntent.status的状态判断,或跳转URL是否使用Djangourl模板标签避免硬编码错误。

2. Stripe Webhook配置问题

若依赖后端webhook触发跳转,检查:

  • Stripe Dashboard中是否启用payment_intent.succeeded事件的webhook,且URL指向正确的Django视图。
  • 视图是否在处理事件后返回跳转响应(通常前端跳转更可靠,建议优先使用前端回调)。

3. 客户端秘钥传递错误

确认创建Payment Intent的视图是否正确将client_secret传递给前端模板,前端能否正常获取该值。


二、OrderDetail的stripe_payment_intent字段为空

1. 创建Payment Intent时未关联订单

检查views.py中创建Payment Intent的代码,确保生成Intent ID后立即保存到OrderDetail:

from django.shortcuts import get_object_or_404
import stripe

def create_payment(request, order_id):
    order = get_object_or_404(OrderDetail, id=order_id)
    # 转换为最小货币单位(如美分)
    amount = int(order.total_amount * 100)
    
    intent = stripe.PaymentIntent.create(
        amount=amount,
        currency='usd',
        metadata={'order_id': order.id}  # 关联订单ID用于后续webhook处理
    )
    
    # 保存Intent ID到订单
    order.stripe_payment_intent = intent.id
    order.save()  # 必须调用save()完成持久化
    
    return JsonResponse({'clientSecret': intent.client_secret})
  • 确认是否遗漏order.save(),或OrderDetail实例在创建Intent前已保存,导致后续修改未写入数据库。

2. Webhook处理未更新订单

若依赖webhook补存Intent ID,检查webhook视图:

import stripe
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.conf import settings
from .models import OrderDetail

@csrf_exempt
def stripe_webhook(request):
    payload = request.body
    sig_header = request.META.get('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'] == 'payment_intent.succeeded':
        payment_intent = event['data']['object']
        order_id = payment_intent['metadata']['order_id']
        try:
            order = OrderDetail.objects.get(id=order_id)
            # 补存未保存的Intent ID
            if not order.stripe_payment_intent:
                order.stripe_payment_intent = payment_intent.id
                order.save()
        except OrderDetail.DoesNotExist:
            return HttpResponse(status=404)

    return HttpResponse(status=200)
  • 查看Stripe Dashboard的webhook请求记录,确认事件是否正常触发,是否有签名验证或请求失败的情况。

3. 模型字段定义错误

检查models.py中stripe_payment_intent字段的定义:

class OrderDetail(models.Model):
    # 其他字段
    stripe_payment_intent = models.CharField(max_length=255, blank=True, null=True)
    # 确保字段允许为空,避免因缺少值导致保存失败
  • 若字段设置blank=False且无默认值,会触发IntegrityError,查看Django日志确认是否有相关报错。

快速验证步骤

  1. 使用Stripe测试卡号完成支付后,查看Stripe Dashboard的Payment Intent详情,确认ID已生成。
  2. 检查Django admin中对应OrderDetail实例的字段值。
  3. 打开浏览器控制台,查看支付过程中是否有JS报错。
  4. 查看Django日志文件,排查是否有数据库或视图逻辑报错。

内容的提问来源于stack exchange,提问作者Davide Cucciardi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:25:52