如何使用 Paypal Checkout 的服务器实现(PHP)从支付页面发送值?

How to send values from payment page using the server implementation(PHP) of Paypal Checkout?

我正在尝试根据 this page, and setting up a transaction as per this page 实施 PayPal Checkout 的服务器集成。

据我从其他帖子中了解到,“最佳”方法是创建 2 条路线,使用 createOrderonApprove 方法来创建和验证已执行的订单。

我已成功安装 Checkout PHP SDK,并且我可以使用此代码启动交易:

客户端javascript (checkoutpage.php):

paypal.Buttons({

            // Call your server to set up the transaction
            createOrder: function(data, actions) {
                return fetch('createorder.php', {
                    method: 'post'
                }).then(function(res) {
                    return res.json();
                }).then(function(orderData) {
                  //  console.log(orderData);
                    return orderData.id;
                });
            },

            //onApprove function below left out for clarity purposes
            onApprove: function(data) {}

}).render('#paypal-button-container');

和服务器端PHP代码(createorder.php):

<?php
namespace Sample\CaptureIntentExamples;
require __DIR__ . '/route/to/paypal/autoload.php';
use Sample\PayPalClient;
use PayPalCheckoutSdk\Orders\OrdersCreateRequest;

class CreateOrder
{
  public static function createOrder($debug=false)
  {
    $request = new OrdersCreateRequest();
    $request->prefer('return=representation');
    $request->body = self::buildRequestBody();

    $client = PayPalClient::client();
    $response = $client->execute($request);
    if ($debug)
    {
      echo json_encode($response->result, JSON_PRETTY_PRINT);
    }
    return $response;
  }
    private static function buildRequestBody()
    {
        return array(
            'intent' => 'CAPTURE',
            'application_context' =>
                array(
                    'return_url' => 'https://example.com/return',
                    'cancel_url' => 'https://example.com/cancel'
                ),
            'purchase_units' =>
                array(
                    0 =>
                        array(
                            'amount' =>
                                array(
                                    'currency_code' => 'USD',
                                    'value' => '2.00'
                                )
                        )
                )
        );
    }
}

if (!count(debug_backtrace()))
{
  CreateOrder::createOrder(true);
}
?>

至此,交易已启动,数据位于 createorder.php 页面的 purchase_units 数组中。我的问题是如何将这些值从 checkoutpage.php 发送到 createorder.php 页面,同时维护服务器端 PHP 实施?而不是像这样设置 100% 客户端:

        createOrder: function(data, actions) {
            return actions.order.create({
                purchase_units: [{
                    amount: {
                        value: '88.44'
                    }
                }]
            });
        },

原因是价格、商品数量、运费等值可以在结帐页面中使用 JS 动态更改,而在其他情况下使用静态 DB 值。

提前致谢

我终于找到了解决方案:

客户端:

             createOrder: function(data, actions) {
                return fetch('createorder.php', {
                    method: 'post',
                    headers: {
                        'content-type': 'application/json',
                    },
                    body: JSON.stringify({
                        "intent": "CAPTURE",
                        "purchase_units": [
                            {
                                "amount": {
                                    "currency_code": "USD",
                                    "value": "100.00"
                                }
                            }
                        ]
                    })
                }).then(function(res) {
                    return res.json();
                }).then(function(orderData) {
                  //  console.log(orderData);
                    return orderData.id;

                });
            },

和服务器端PHP:

<?php
namespace Sample\CaptureIntentExamples;
require __DIR__ . '/route/to/paypal/autoload.php';
use Sample\PayPalClient;
use PayPalCheckoutSdk\Orders\OrdersCreateRequest;
class CreateOrder
{
  public static function createOrder($debug=false)
  {
    $request = new OrdersCreateRequest();
    $request->prefer('return=representation');
    $request->body =  file_get_contents('php://input');
    $client = PayPalClient::client();
    $response = $client->execute($request);
    if ($debug)
    {
      echo json_encode($response->result, JSON_PRETTY_PRINT);
    }
    return $response;
  }
}
if (!count(debug_backtrace()))
{
  CreateOrder::createOrder(true);
}
?>