PayPal智能支付按钮与服务器端REST API的集成

7

我知道有一些关于PayPal集成的问题,但是我正在尝试使用智能按钮和REST API实现PayPal Express Checkout,但并没有成功。

我的目标是:

  1. 创建一个支付授权(带有 payidorderid

  2. 将此 payid 发送给客户端(JavaScript)进行批准。

  3. 支付后重定向到确认页面。

我已经使用下面的代码创建了一个付款授权:

<?php

// 1. Autoload the SDK Package. This will include all the files and classes to your autoloader
// Used for composer based installation
require __DIR__  . '/PayPal-PHP-SDK/autoload.php';
// Use below for direct download installation
// require __DIR__  . '/PayPal-PHP-SDK/autoload.php';


// After Step 1
$apiContext = new \PayPal\Rest\ApiContext(
        new \PayPal\Auth\OAuthTokenCredential(
            'client id',     // ClientID
            'cliente secret'      // ClientSecret
        )
);

// After Step 2
$payer = new \PayPal\Api\Payer();
$payer->setPaymentMethod('paypal');

$amount = new \PayPal\Api\Amount();
$amount->setTotal('1.00');
$amount->setCurrency('USD');

$transaction = new \PayPal\Api\Transaction();
$transaction->setAmount($amount);

$redirectUrls = new \PayPal\Api\RedirectUrls();
$redirectUrls->setReturnUrl("https://example.com/your_redirect_url.html")
    ->setCancelUrl("https://example.com/your_cancel_url.html");

$payment = new \PayPal\Api\Payment();
$payment->setIntent('sale')
    ->setPayer($payer)
    ->setTransactions(array($transaction))
    ->setRedirectUrls($redirectUrls);


    // After Step 3
try {
    $payment->create($apiContext);
    echo $payment;

    echo "\n\nRedirect user to approval_url: " . $payment->getApprovalLink() . "\n";
      echo $data= json_encode($payment->id, JSON_PRETTY_PRINT), "\n";
    echo "</br>";echo "</br>";
    echo $data= $payment->id;
}
catch (\PayPal\Exception\PayPalConnectionException $ex) {
    // This will print the detailed information on the exception.
    //REALLY HELPFUL FOR DEBUGGING
    echo json_encode($ex->getData()->id, JSON_PRETTY_PRINT), "\n";
    echo "</br>";echo "</br>";
    echo $ex->getData()->id;
}
?>

以下是我的设置(如有错误请更正):

  1. 用户选择物品并提交表单。

  2. 用户将被重定向到一个新页面,填写姓名和其他个人信息,然后提交表格以保存在数据库中并生成付款授权。

  3. 用户应该被重定向到最终页面,显示智能按钮以完成付款。

  4. 用户应该被重定向到确认页面,确认他的付款已经成功完成。

问题是,我卡在步骤2,因为一旦我生成了付款授权,我不知道如何将此id(和其他必需参数)传递给客户端,在这个新页面中显示智能支付按钮以完成交易。

我正在遵循PayPal文档中的教程,但我无法理解。

JavaScript调用我的服务器以获取payid,它有效,但它会生成一个新的payid和一个新的付款订单,我希望使用之前创建的那个,当用户提交表单时,然后以某种方式将其传递到具有智能按钮的最终页面以完成交易,并重定向到确认页面。

我的Javascript:

<script>
   paypal.Button.render({  
      onApprove: function(data) {
      return fetch('/my-server/get-paypal-transaction', {
        headers: {
          'content-type': 'application/json'
        },
        body: JSON.stringify({
          orderID: data.orderID
        })
      }).then(function(res) {
        return res.json();
      }).then(function(details) {
        alert('Transaction approved by ' + details.payer_given_name);

    }, '#paypal-button');
</script>

问题在于,它生成了一个新的orderID、一个新的交易,而我想检索在步骤2中用户提交表单时生成的交易,但是我不知道该怎么做。
最终我需要的是:
  1. 获取付款授权并将其传递给客户端(最终页面上的按钮)

  2. 在支付完成后重定向用户。


PayPal的文档混乱不堪。他们引用了存档的Git,却没有引用这里提供的Git和代码集。简直是彻头彻尾的骗局。 - Martin
1个回答

6

1
非常感谢您的回答。我对此有些疑惑...但我想和您澄清一些事情。假设我使用这个旧版本,如果JavaScript发出请求新的付款授权,我该如何获取用户提交表单时先前生成的payid呢?因为正确的做法是:1.将数据插入数据库。2.生成订单。3.将用户重定向到带有payid的支付页面,对吗?如果是这样,那么是否应该通过URL参数将payid传递到最终(支付)页面?我正在努力弄清楚。 - Thiago Guimarães
2
你在 createOrder 中的 JavaScript 应该获取你希望用户批准的 PAYID/OrderID。 - Preston PHX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接