paypal 结账 onApprove 功能

Posted

技术标签:

【中文标题】paypal 结账 onApprove 功能【英文标题】:paypal checkout onApprove function 【发布时间】:2020-06-20 15:04:12 【问题描述】:

大家好,我正在使用 PayPal 结帐 API 从我的网站进行付款

这是我用来在服务器端捕获产品的代码,它运行良好

<?php
require('../ini.php');

require 'vendor/autoload.php';
$ids = [
  'id' =>     getSetting('paypalLiveKey','return',$con),
  'secret' => getSetting('paypalSecretKey','return',$con)
];


$apiContext = new \PayPal\Rest\ApiContext(
  new \PayPal\Auth\OAuthTokenCredential(
    $ids['id'],
    $ids['secret']
  )
);


$redirectUrls = (new \PayPal\Api\RedirectUrls())
    ->setReturnUrl('/include/paypalPHP/payProducts.php')
    ->setCancelUrl('/checkout.php');


$list = new \PayPal\Api\ItemList();


$item = (new \PayPal\Api\Item())
    ->setName('title')
    ->setPrice('100')
    ->setCurrency('USD')
    ->setQuantity('1');

  $list->addItem($item);


$details = (new \PayPal\Api\Details())
    ->setSubtotal($total )
    ->setTax('0.00')
    ->setShipping('0.00')
    ->setShippingDiscount('0.00');

$amount = (new \PayPal\Api\Amount())
    ->setTotal('100')
    ->setCurrency("USD")
    ->setDetails($details);

$transaction = (new \PayPal\Api\Transaction())
    ->setItemList($list)
    ->setDescription('New Payment from ')
    ->setAmount($amount)
    ->setCustom('site');

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

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


try 
  $payment->Create($apiContext);
  // header("location: ".$payment->getApprovalLink());

  echo json_encode([
    'token' => $payment->getToken(),

  ]);
 catch (\PayPal\Exception\PayPalConnectionException $e)
  header('loaction: '.ERROR_PAGE);
  var_dump(json_decode($e->getData()));

我用来付款的第二个代码

<?php
require('../ini.php');

require 'vendor/autoload.php';
$ids = [
  'id' =>     getSetting('paypalLiveKey','return',$con),
  'secret' => getSetting('paypalSecretKey','return',$con)
];

$apiContext = new \PayPal\Rest\ApiContext(
  new \PayPal\Auth\OAuthTokenCredential(
    $ids['id'],
    $ids['secret']
  )
);


$payment = \PayPal\Api\Payment::get($_POST['paymentID'],$apiContext);

$execution = (new \PayPal\Api\PaymentExecution())
        ->setPayerId($_POST['payerID'])
        ->setTransactions($payment->getTransactions());

try
    $payment->execute($execution,$apiContext);

    // payment is done

    echo json_encode([
        'id' => $payment->getId()
      ]);

    var_dump($payment->getTransactions()[0]->getCustom());
    var_dump($payment);

catch(\PayPal\Exeception\PayPalConnectionException $e)
    header('loaction: '.ERROR_PAGE);
    var_dump(json_decode($e->getData()));

我在客户端用来获取这些代码的代码

paypal.Buttons(

    // Set up the transaction
    createOrder: function(data, actions) 
        return fetch('/include/paypalPHP/prepareProducts.php', 
            method: 'post',
            headers: 
            'content-type': 'application/json'
            ,
        ).then(function(res) 
            return res.json();
        ).then(function(data) 
            return data.token;
        );
    ,

    // Finalize the transaction
    onApprove: function(data, actions) 
        return fetch('/include/paypalPHP/payProducts.php', 
            method: 'post',
            headers: 
                'content-type': 'application/json'
            ,
            body: JSON.stringify(
                paymentID: data.paymentID,
                payerID:   data.payerID
            )
        )
    


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

现在,如果我点击 paypal 按钮,产品项目显示良好,但问题是当他在 PayPal 窗口上点击支付时,没有支付任何费用,我认为问题出在 onApprove 功能

请帮忙

【问题讨论】:

这段代码需要在运行时运行和调试,所以你最好自己做。查找错误并在每个步骤中打印出所有内容,这样您就可以找到它没有按预期运行的原因。在 PHP 方面,您应该使用 v2 SDK,github.com/paypal/Checkout-PHP-SDK 我在没有客户端的情况下使用相同的代码,只需打开捕获付款的页面并取消注释此代码标题(“位置:”.$payment->getApprovalLink()),付款就完成了但是通过使用客户端代码捕获是好的,但是支付没有做任何事情并且没有出现控制台错误 那很好,还是需要有人在运行时一步步调试,才能找到实际发生的情况,应该就是你了。 (也许别人有时间运行你的代码并提供免费的调试服务;我当然没有) 好的,没关系,但是你能告诉我支付宝结账的过程吗?我的意思是第一个代码将你的产品发送到贝宝,他们用令牌响应然后第二个代码做什么? 【参考方案1】:

问题在于setReturnUrl,因为它不应该与批准功能帖子的页面相同。所以你必须把它改成别的东西

【讨论】:

以上是关于paypal 结账 onApprove 功能的主要内容,如果未能解决你的问题,请参考以下文章

是否提供带有快速结账功能的定期付款资料?

Paypal 集成,如何使用 createOrder onApprove?

Paypal 创建订阅 onApproval GET 超时

收到 onApprove PayPal 后发送邮件

PayPal 智能按钮:是不是有任何方式 onApprove 在付款未完成的情况下运行?

PayPal onApprove 不调用 ajax 函数