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?