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

使用Django+Braintree Drop-in UI支付成功后无法跳转问题求助

问题:Braintree沙箱支付成功后无法重定向到Done页面,仅刷新当前页

我在商店网站的支付模块使用Braintree沙箱环境,期望支付成功后将用户重定向至Done页面,但实际当前页面仅重新加载,请求协助解决。


相关代码

1. payment_process视图代码

def payment_process(request):
    order_id = request.session.get('order_id')
    order = get_object_or_404(Order, id=order_id)
    total_cost = order.get_total_cost()
    if request.method == 'POST':
        nonce = request.POST.get('paymentMethodNonce', None)
        result = gateway.transaction.sale({
            'amount': f'{total_cost:.2f}',
            'payment_method_nonce': nonce,
            'options': {
                'submit_for_settlement': True
            }
        })
        if result.is_success:
            order.paid = True
            order.braintree_id = result.transaction.id
            order.save()
            return redirect('payment:done')
        else:
            return redirect('payment:canceled')
    else:
        client_token = gateway.client_token.generate()
        return render(request, 'payment/process.html', {'order': order, 'client_token': client_token})

2. 支付页面代码(标注为Done.html,实际应为process.html)

{% extends "shop/base.html" %}

{% block title %} Pay by credit card {% endblock %}

{% block sidenavigation %}

{% endblock %}

{% block content %}
    <h1>Pay by credit card</h1>

    <!-- includes the Braintree JS client SDK -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
    <script src="https://js.braintreegateway.com/web/dropin/1.14.1/js/dropin.min.js"></script>

    <form method="post" autocomplete="off">
        {% if braintree_error %}
            <div class="alert alert-danger fade in">
                <button class="close" data-dismiss="alert">&times;</button>
                {{ braintree_error|safe }}
            </div>
        {% endif %}
        <div class="braintree-notifications"></div>
        <div id="braintree-dropin"></div>
        <input style="background-color: #0783ca" id="submit-button" class="btn btn-success btn-lg btn-block"
               type="button" value="Pay now!"/>
    </form>

    <script>
        var braintree_client_token = "{{ client_token}}";
        var button = document.querySelector('#submit-button');

        braintree.dropin.create({
            authorization: "{{client_token}}",
            container: '#braintree-dropin',
            card: {
                cardholderName: {
                    required: false
                }
            }
        }, function (createErr, instance) {
            button.addEventListener('click', function () {
                instance.requestPaymentMethod(function (err, payload) {
                    console.log('ok')
                    $.ajax({
                        type: 'POST',
                        url: '{% url "payment:process" %}',
                        data: {
                            'paymentMethodNonce': payload.nonce,
                            'csrfmiddlewaretoken': '{{ csrf_token }}'
                        },
                    }).done(function (result) {
                        //do accordingly
                    });
                });
            });
        });
    </script>

{% endblock %}

相关截图说明

  • 点击“Pay now!”按钮后的终端日志截图
  • 点击“Pay now!”按钮前的process.html页面截图
  • 点击“Pay now!”按钮后的process.html页面截图

解决方案

问题核心:你用AJAX发送支付请求,但视图返回的redirect对AJAX请求无效——AJAX只会接收响应内容,不会自动触发页面跳转。

1. 修改视图,返回JSON响应

将原有的redirect改为返回包含跳转URL的JSON数据,让前端处理跳转逻辑:

from django.http import JsonResponse
from django.urls import reverse

def payment_process(request):
    order_id = request.session.get('order_id')
    order = get_object_or_404(Order, id=order_id)
    total_cost = order.get_total_cost()
    if request.method == 'POST':
        nonce = request.POST.get('paymentMethodNonce', None)
        result = gateway.transaction.sale({
            'amount': f'{total_cost:.2f}',
            'payment_method_nonce': nonce,
            'options': {
                'submit_for_settlement': True
            }
        })
        if result.is_success:
            order.paid = True
            order.braintree_id = result.transaction.id
            order.save()
            return JsonResponse({'status': 'success', 'redirect_url': reverse('payment:done')})
        else:
            return JsonResponse({'status': 'error', 'redirect_url': reverse('payment:canceled')})
    else:
        client_token = gateway.client_token.generate()
        return render(request, 'payment/process.html', {'order': order, 'client_token': client_token})

2. 修改前端AJAX回调,手动跳转

在JS的$.ajax.done方法中,根据返回的JSON数据执行页面跳转:

$.ajax({
    type: 'POST',
    url: '{% url "payment:process" %}',
    data: {
        'paymentMethodNonce': payload.nonce,
        'csrfmiddlewaretoken': '{{ csrf_token }}'
    },
}).done(function (result) {
    if (result.status === 'success') {
        window.location.href = result.redirect_url;
    } else {
        window.location.href = result.redirect_url;
    }
}).fail(function() {
    alert('支付请求失败,请稍后重试');
});

3. 额外检查

确保urls.py中已正确定义payment:done和payment:canceled的路由,指向对应的视图页面。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:31:19