用户批准后如何取消Paypal订单? (API v2)

Posted

技术标签:

【中文标题】用户批准后如何取消Paypal订单? (API v2)【英文标题】:How to cancel a Paypal Order after user approvation? (API v2) 【发布时间】:2022-01-15 01:38:02 【问题描述】:

我实际上是在尝试创建一个使用 Papal API v2 的应用程序。

我成功创建了订单并在沙盒上赚钱。 我使用 JS Paypal 方法 onApprove 调用 order.capture 以获取订单并在我的系统上创建订阅。 但是,如果我的服务器端代码有问题,如果出现问题,我如何阻止 paypal API 上的订单以停止从用户那里获取资金?

        paypal.Buttons(
            locale: 'it_IT',
            style: 
                shape: 'pill',
                color: 'blue',
                layout: 'vertical',
                label: 'buynow',
                fundingicons: 'true',
            ,
            createOrder: function (data, actions) 
                return actions.order.create(my_PlanOrderDef);
            ,
            onApprove: function (data, actions) 
                console.log(data)
                console.log(actions)
                return actions.order.capture().then(function (details) 
                    if (!CloseProcess(details)) 
                        console.log("FAIL! HERE SOMETHING GOING BAD ON MY LOGIC, AND I NEED TO CANCEL THE ORDER PAYMENT");
                        return false;
                    
                );
            ,
            onError: function (err) 
                console.log(err);
            
        ).render('#btnPaypalContainer');

CloseProcess 方法只是调用我的服务器端逻辑来在我的系统上创建订阅。 我可能错过了 paypal v2 逻辑中的某些内容,所以向我道歉,有什么想法可以完成这项任务吗?

谢谢

【问题讨论】:

【参考方案1】:

订单一经创建,有效期为 72 小时。

订单获得批准后,有效期为 3 小时。

没有取消订单的方法。

如果您不想使用订单,请丢弃其 id 并且不要捕获它。


要更改为用于订单创建和捕获的服务器端集成,请按照Set up standard payments 指南在您的服务器上创建 2 条路由,一条用于“创建订单”,一条用于“捕获订单”documented here。两个路由都应该只返回 JSON 数据(没有 html 或文本)。在第二条路线中,当捕获 API 成功时,您应该将其生成的付款详细信息存储在您的数据库中(特别是 purchase_units[0].payments.captures[0].id,这是 PayPal 交易 ID)并执行任何必要的业务逻辑(例如发送确认电子邮件或预订产品)立即将您的返回 JSON 转发给前端调用者。

将这 2 条路由与前端审批流程配对:https://developer.paypal.com/demo/checkout/#/pattern/server

【讨论】:

您好,谢谢您的澄清,对我来说,如果在买家批准后出现问题,我还不清楚会发生什么。我在沙箱中看到,在用户批准后,订单付款立即处理并完成。但是,如果在关闭贝宝批准窗口后我的系统出现问题,并且由于技术原因我无法处理订单,则客户端无法阻止贝宝从买家那里获得资金。可以吗? 付款未处理,审核通过后自动完成。它仅在捕获后完成。因此,如果您不希望立即完成,请不要立即捕获。服务器端创建和捕获是最强大的解决方案,您需要停止使用 actions.order.create() 并停止使用 actions.order.capture() 并更改为服务器端 REST API 集成。用这些细节更新答案。 不清楚是什么导致CloseProcess(details) 在您的示例中失败,但该逻辑可能在捕获之前发生。或者,如果该逻辑必须在成功捕获后发生,那么当该逻辑失败时,您将需要退还付款。 谢谢,通常在 CloseProcess 中不会发生任何不好的事情,但是该方法在服务器端传达付款已被用户批准,因此它在我的数据库中创建了订单。无论如何,如果在订单创建过程中出现问题,我认为我可以在客户端停止订单捕获。 我的想法是在服务器端处理订单,但阅读 v2 API 文档后我认为我可以通过 javascript 仅在客户端创建订单,Paypal 文档对我来说有点不清楚。无论如何,如果我完全理解您的回复,最快的解决方案是: onApprove: function (data, actions) if (!CloseProcess()) console.log("FAIL") return false; else return actions.order.capture().then(function (details) ); ,

以上是关于用户批准后如何取消Paypal订单? (API v2)的主要内容,如果未能解决你的问题,请参考以下文章

执行付款后调用的 PayPal REST API 取消 URL

PayPal API v2 取消订单

PayPal - 使用 API 和 PA 密钥取消预先批准的付款

通过 API 取消 PayPal 订单

如何更新 Paypal 订单的税务信息?

Paypal REST API - 协议是不是取消?