在这种情况下如何编写获取 - django 应用程序付款

how to write the fetch in that case - django app payment

你好,我正在开发一个 django 应用程序 'my app is about paying for someone service' 客户将访问该页面并单击他们选择的人,然后他们将填写表格并单击获取服务,然后在工作的人plateform 将转到另一个页面,他们可以找到想要获得他们服务的人员的表格列表....但我希望在付款完成之前不要发布表格,这样我的数据库就不会崩溃。 所以这是我的 views.py 我实际上有 2 个功能 :

#here where client can select people they are willing to take service from 
@login_required(login_url='login')
def pSelected(request,slug):
    profile = get_object_or_404(Profile,slug=slug)

    form = MessageForm()
    if request.method == 'POST':
        form = MessageForm(request.POST,request.user)
        form.sender = request.user.username
        form.receiver = request.POST.get('receiver', '')
        if form.is_valid():
            form.sender = request.user.username
            form.receiver = request.POST.get('receiver', '')
            messages.success(request, f'succed')
            form.save()
            print(form.sender,form.receiver)
    else:
        form = MessageForm()
    return render(request,'base/p-selected.html',context)
#here for workers in the platefrorm 
@login_required(login_url='login')
def giveService(request):
    requests = Message.objects.all().order_by('-id')

    context={'requests':requests}
    return render(request, 'base/giveService.html',context)

现在在我的 p-selected.html

<form>
<!--I have here for example a form method post *inside of my form I have input get and payment with paypal -->

<input type="submit" value="GET" class="btn get" style="outline: none; margin:auto;"/>

<div id="paypal-button-container"></div>

</form>
<!-- Include the PayPal JavaScript SDK -->
    <script src="https://www.paypal.com/sdk/js?client-id=I-Already-Put-Here-The-Id&currency=USD"></script>

    <script>
        // Render the PayPal button into #paypal-button-container
        paypal.Buttons({

            // Call your server to set up the transaction
            createOrder: function(data, actions) {
                return fetch('/demo/checkout/api/paypal/order/create/', {
                    method: 'post'
                }).then(function(res) {
                    return res.json();
                }).then(function(orderData) {
                    return orderData.id;
                });
            },

            // Call your server to finalize the transaction
            onApprove: function(data, actions) {
                return fetch('/demo/checkout/api/paypal/order/' + data.orderID + '/capture/', {
                    method: 'post'
                }).then(function(res) {
                    return res.json();
                }).then(function(orderData) {
                    // Three cases to handle:
                    //   (1) Recoverable INSTRUMENT_DECLINED -> call actions.restart()
                    //   (2) Other non-recoverable errors -> Show a failure message
                    //   (3) Successful transaction -> Show confirmation or thank you

                    // This example reads a v2/checkout/orders capture response, propagated from the server
                    // You could use a different API or structure for your 'orderData'
                    var errorDetail = Array.isArray(orderData.details) && orderData.details[0];

                    if (errorDetail && errorDetail.issue === 'INSTRUMENT_DECLINED') {
                        return actions.restart(); // Recoverable state, per:
                        // https://developer.paypal.com/docs/checkout/integration-features/funding-failure/
                    }

                    if (errorDetail) {
                        var msg = 'Sorry, your transaction could not be processed.';
                        if (errorDetail.description) msg += '\n\n' + errorDetail.description;
                        if (orderData.debug_id) msg += ' (' + orderData.debug_id + ')';
                        return alert(msg); // Show a failure message (try to avoid alerts in production environments)
                    }

                    // Successful capture! For demo purposes:
                    console.log('Capture result', orderData, JSON.stringify(orderData, null, 2));
                    var transaction = orderData.purchase_units[0].payments.captures[0];
                    alert('Transaction '+ transaction.status + ': ' + transaction.id + '\n\nSee console for all available details');

                    // Replace the above to show a success message within this page, e.g.
                    // const element = document.getElementById('paypal-button-container');
                    // element.innerHTML = '';
                    // element.innerHTML = '<h3>Thank you for your payment!</h3>';
                    // Or go to another URL:  actions.redirect('thank_you.html');
                });
            }

        }).render('#paypal-button-container');
    </script>

我希望在客户完成付款之前,platform 中的工作人员不会收到表格 在那种情况下我该怎么做我已经尝试过但我真的无法成功很多次可能是因为我在 js 方面不是那么好..我希望你们能帮助我我不会忘记你的帮助谢谢你很多。

您示例中的 PayPal 按钮代码用于 server-side 集成。要使用它,您需要做的第一件事是在您的服务器上创建两个实际的 django 路由(一个用于创建,一个用于捕获)调用 PayPal API 和 return JSON 数据结果。

接下来您需要更改 JS 示例中的 fetch('/demo/checkout/api/paypal/order/' 以实际指向您创建的那些工作路线的本地路径。

(或者,您可以切换到 a client-side JS integration 而不是执行此路由和 API 工作...不推荐,client-side 付款用于比您的更简单的用例不需要在成功时触发任何服务器端代码,例如保存交易记录或保存表单数据)

一旦您有一个有效的 PayPal 按钮来简单地处理付款(服务器端或客户端),接下来您需要使用 onApprove 函数中的表单数据。最简单的做法是使用 JS 触发表单提交,但这很糟糕,因为您可能会在没有正确接收和处理信息的情况下收到已完成的付款。

最好的解决方案是将表单数据序列化为JSON对象(使用JS),并将其包含在获取请求到捕获订单路由的body中。这样您的捕获路由可以在捕获之前验证所有表单数据,进行捕获,并在成功后立即将交易记录和提交的表单数据添加到您的 django 后端,就在 returning 那个 JSON 响应之前调用 JS 提取。