PayPal:创建和获取订单

Posted

技术标签:

【中文标题】PayPal:创建和获取订单【英文标题】:PayPal: Create and Capture Order 【发布时间】:2020-02-10 22:34:17 【问题描述】:

我正在关注此示例 (https://developer.paypal.com/docs/checkout/reference/server-integration/set-up-transaction/#on-the-server) 以让 PayPal 在服务器上运行。

我已完成创建订单,但它没有同时捕获订单。是否可以同时创建和捕获订单?

var request = new OrdersCreateRequest();
request.Prefer("return=representation");
request.RequestBody(BuildRequestBody());

var response = await PayPalClient.client().Execute(request);  //this will only create the order. How to capture it at the same time?

当我试图捕捉订单时:

//continue from above
var result = response.Result<Order>();

var requestCapture = new OrdersCaptureRequest(result.Id);
requestCapture.Prefer("return=representation");
requestCapture.RequestBody(new OrderActionRequest());

response = await PayPalClient.Client().Execute(requestCapture);

我得到错误:

"name":"UNPROCESSABLE_ENTITY",
"details":  [
                "issue":"ORDER_NOT_APPROVED",
                "description":"Payer has not yet approved the Order for payment. Please redirect the payer to the 'rel':'approve' url returned as part of the HATEOAS links within the Create Order call or provide a valid payment_source in the request."
            ],
"message": "The requested action could not be performed, semantically incorrect, or failed business validation.",
"links":    [
                "href": "https://developer.paypal.com/docs/api/orders/v2/#error-ORDER_NOT_APPROVED",
                "rel": "information_link",
                "method": "GET"
            ]

我的问题是,是否可以同时同时创建订单、授权和捕获?

谢谢

【问题讨论】:

我什至无法从 var response = await PayPalClient.client().Execute(request) 得到回复; :( 它应该给你某种响应,即使它不起作用(例如超时)。你得到了什么回应? 这就是我没有接到这个电话的原因,var response = await PayPalHttpClient(currentShoppingCart).Execute(request);去并且永远不会回来,我可以在沙盒 API 调用中看到带有橙色感叹号警告的请求,但不知道问题是什么:( 挂起吗?这可能不是因为贝宝。可能是因为死锁...你是通过async函数调用这个函数还是创建Task来调用await PayPalClient.client().Execute(request); 对不起,为了一些更重要的工作,我把它停了一会儿,所以基本上有一个异步任务,如果它有成功状态,我已经设置它返回订单。当我离开时,它注意到在我将货币设置为 AUD 时出现错误,并且所有价格也必须为 AUD,但即使我更改了此设置,paypal 沙箱中的请求现在变为绿色(而不是橙色) 直到至少大约 30 多秒才恢复订单,这不切实际:( 【参考方案1】:

在使用OrdersCaptureRequest 之前,您必须从OrdersCreateRequest 的响应中重定向到 [rel] => 批准链接:

    $client = PayPalClient::client();
    $response = $client->execute($request);
    $res_links = $response->result->links;
    $approve_index = array_search('approve',array_column($res_links,'rel'));
    redirect($res_links[$approve_index]->href,'location',302);`

然后使用OrdersCaptureRequest

【讨论】:

【参考方案2】:

我认为即使在沙盒环境中,也无法在 PayPal 中同时创建、授权和捕获订单。您必须分别执行每个步骤。 关于ORDER_NOT_APPROVED 错误,您可以像@raj-kamal 所说的那样让用户批准订单,或者您可以制作Paypal-Auth-Assertion 并将其发送到标题中。此标头是一个 API 客户端提供的 JSON Web Token (JWT) 断言,用于识别商家。

参考:https://developer.paypal.com/docs/api/reference/api-requests/#paypal-auth-assertion

注意:

要使用此标头,您必须获得代表商家的同意。

【讨论】:

以上是关于PayPal:创建和获取订单的主要内容,如果未能解决你的问题,请参考以下文章

Paypal API 调用以获取订单详情

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

PayPal:是不是可以仅通过订单 ID/详细信息为订单付款

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

Paypal 订单信息/数据采集

PayPal 订单付款的 INTERNAL_SERVICE_ERROR