【问题标题】:How to make PayPalCheckout return value by post method?如何通过 post 方法使 PayPalCheckout 返回值?
【发布时间】:2021-07-07 10:01:37
【问题描述】:

我按照示例使用PayPalCheckoutSdk 库,我有以下内容:

<?php
    require __DIR__ . '/PayPalCheckout/vendor/autoload.php';

    use PayPalCheckoutSdk\Core\PayPalHttpClient;
    use PayPalCheckoutSdk\Core\SandboxEnvironment;

    $clientId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    $clientSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

    $environment = new SandboxEnvironment($clientId, $clientSecret);
    $client = new PayPalHttpClient($environment);

    $invoiceNumber = uniqid();
    
    $items = array();

    $items[0] = [
        'name' => 'HTML5',
        'description' => 'Video streaming service',
        'type' => 'SERVICE',
        'sku' => 'sku03',
        'unit_amount' =>
            [
                'currency_code' => 'USD',
                'value' => '90.00',
            ],
        'quantity' => '1',
        'category' => 'DIGITAL_GOODS',
    ];
    $new_item = [
        'name' => 'CSS3',
        'description' => 'Video streaming service',
        'type' => 'SERVICE',
        'sku' => 'sku02',
        'unit_amount' =>
            [
                'currency_code' => 'USD',
                'value' => '45.00',
            ],
        'quantity' => '2',
        'category' => 'DIGITAL_GOODS',
    ];

    array_push($items , $new_item);

    use PayPalCheckoutSdk\Orders\OrdersCreateRequest;
    $request = new OrdersCreateRequest();

    $request->prefer('return=representation');

    $request->body = [
        'intent' => 'CAPTURE',
        'application_context' => [
            'brand_name' => 'COMPANY',
            'locale' => 'us-US',
            'user_action' => 'PAY_NOW',
            "cancel_url" => "http://localhost/PayPal/cancel.php",
            "return_url" => "http://localhost/PayPal/return.php",
            'landing_page' => 'BILLING',
        ],
        'purchase_units' => [0 => [
            'reference_id' => $invoiceNumber,
            'amount' => [
                'currency_code' => 'USD',
                'value' => '160.00',
                'breakdown' => [
                    'item_total' => [
                        'currency_code' => 'USD',
                        'value' => '180.00',
                    ],
                    'shipping_discount' => [
                        'currency_code' => 'USD',
                        'value' => '20.00',
                    ],
                ],
            ],
            'items' =>
                $items,
        ]],
    ];

    try {
        $response= $client->execute($request);

        if ($response->statusCode == 201){
            for ($i = 0; $i < count($response->result->links); ++$i){
                $link = $response->result->links[$i];
                if ($link->rel =='approve') {
                    header("location: $link->href");
                }
            }
        } else {
            exit(1);
        }
    } catch (HttpException $ex) {
        echo $ex->statusCode;
        print_r($ex->getMessage());
    }
?>

我正在通过get方法print_r($_REQUEST);接收数据:

Array ( [token] => 3JX899952R0552721 [PayerID] => J95XSJRX4WXVS

并且,该信息在文件return.php 中处理,该文件具有以下代码:https://ideone.com/ncVjIt

我希望能够通过post方式接收信息,我应该进行哪些配置以使数据通过post而不是通过get发送?

【问题讨论】:

  • 你不能。在贝宝网站上付款后,用户在自己的浏览器中被重定向回指定的return_url。该重定向意味着 GET 请求,您无法将其转换为 POST。
  • @CBroe 我认为这是可能的,在您的示例中,观察到三个链接(自我、批准、捕获),其中两个来自 get 方法,最后一个来自 post 方法。
  • “在您的示例中观察到三个链接(自我、批准、捕获)” - 我不知道您在说什么。 // 从支付网关向您的服务器发出的 POST 请求通常是这些网关提供的一个选项(“webhook”),但这会在后台发生。
  • @CBroe 我指的是 Github 文档中的输出数据示例。好的,我明白了,如果表单通过 post 方法接收数据,显然一切都会有所不同。

标签: php paypal paypal-sandbox checkout


【解决方案1】:

如 cmets 中所述,您无法将重定向方法从 PayPal 更改回来。它始终是附加到您的 return_url 的 GET 字符串。

但是,理想且推荐的解决方案是不使用任何重定向。完全没有。相反,使用 PayPal-Checkout-SDK 您必须在服务器上创建两条路由,一条用于“创建订单”,一条用于“捕获订单”documented here,只返回 JSON 数据(无 HTML 或文本)。后者应该(成功时)在返回之前将付款详细信息存储在您的数据库中(特别是purchase_units[0].payments.captures[0].id,PayPal 交易 ID)

将这两个纯 JSON 路由与以下不使用任何重定向的审批流程配对,而是在付款审批期间始终将您的网站加载在后台(灯箱):https://developer.paypal.com/demo/checkout/#/pattern/server

【讨论】:

    猜你喜欢
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多