如何在没有重定向或智能按钮的情况下批准 PayPal 订单 ID

How to approve a PayPal Order ID without a redirect or smart button

我的目的似乎与之前发布的这个问题相似

我已经实现了一个休息端点来完成订单支付而不使用重定向 link 和默认智能按钮生成

我正在使用沙箱环境和 PayPal 服务器端 SDK V2

所以我使用 API OrdersCreateRequest() 创建了一个订单,然后我得到了一个订单 ID

{
"id": "xxxxxxxxxxxxxxxx",
"status": "CREATED",
"links": [
    {
        "href": "https://api.sandbox.paypal.com/v2/checkout/orders/0XY49131JG183432Y",
        "rel": "self",
        "method": "GET"
    },
    {
        "href": "https://www.sandbox.paypal.com/checkoutnow?token=0XY49131JG183432Y",
        "rel": "approve",
        "method": "GET"
    },
    {
        "href": "https://api.sandbox.paypal.com/v2/checkout/orders/0XY49131JG183432Y",
        "rel": "update",
        "method": "PATCH"
    },
    {
        "href": "https://api.sandbox.paypal.com/v2/checkout/orders/0XY49131JG183432Y/capture",
        "rel": "capture",
        "method": "POST"
    }
]
 }

我完全按照文档中的官方示例进行操作,但我无法授权订单

    @PostMapping( "payWorkerWithPaypal/{paypalWorkerEmail}/{totalAmount}")
    public Order payWorkerWithPaypal(@PathVariable("paypalWorkerEmail") String 
   
    paypalWorkerEmail,@PathVariable("totalAmount") String totalAmount) throws IOException {

    Order order = null;

    PayPalHttpClient client = new PayPalHttpClient(environment);

    OrderRequest orderRequest = new OrderRequest();

    orderRequest.checkoutPaymentIntent("CAPTURE");

    List<PurchaseUnitRequest> purchaseUnitRequests = new ArrayList<PurchaseUnitRequest>();

    PurchaseUnitRequest purchaseUnitRequest = new PurchaseUnitRequest();

     purchaseUnitRequest.amountWithBreakdown(new 
     AmountWithBreakdown().currencyCode("USD").value(totalAmount));

    Payee payee = new Payee();

    payee.email(paypalWorkerEmail);

    purchaseUnitRequest.payee(payee);

    Payer payer = new Payer();

    payer.email("outsourcingpaypal@gmail.com");

    purchaseUnitRequests.add(purchaseUnitRequest);

    orderRequest.purchaseUnits(purchaseUnitRequests);

    orderRequest.payer(payer);

    OrdersCreateRequest requestCreateOrder = new OrdersCreateRequest().requestBody(orderRequest);

    try {       
   
    HttpResponse<Order> responseOrderCreated = client.execute(requestCreateOrder);

        order = responseOrderCreated.result(); 

        System.out.println("Order ID: " + order.id());

        OrdersAuthorizeRequest requestAuthorizeRequest = new OrdersAuthorizeRequest(order.id());

        HttpResponse<Order> responseAuthorizeOrder =  client.execute(requestAuthorizeRequest);

        order = responseAuthorizeOrder.result();

        OrdersCaptureRequest requestCaptureOrder = new OrdersCaptureRequest(order.id());

        HttpResponse<Order> responseCaptureOrder =  client.execute(requestCaptureOrder);

        order = responseCaptureOrder.result();

} catch (IOException ioe) {     System.out.println(ioe.getMessage());       }        return order;
}

我得到了带有描述的响应对象

Payer has not yet approved the Order for payment

如何使用我的方法直接批准订单?

the smart button 或重定向到 v2/checkout/orders approval_url 是买家表示同意并批准 PayPal 付款的仅有的两个选项。

智能按钮总体上是目前最好的选择,因为它提供了现代的“在上下文中”体验(让您的网站在后台加载,而不是将买家重定向到另一个可能不熟悉的网站)页)-- 以及可能提供多种替代付款方式,具体取决于您 configure the button.