通过 REST API 开发 PHP Paypal 集成。 在创建支付意图以获取 url 以将用户重定向到支付网关时,它工作正常。 我也得到了重定向网址。 示例重定向 url 实时模式
https://www.paypal.com/checkoutnow?token=7JR976187U6560045
但是当我们进入付款页面时,我们可以选择登录Paypal帐户或使用信用卡或借记卡作为客人付款。
但对于已登录的用户,它显示选择要支付的付款方式(卡),但是当我们点击继续或查看时,它总是不会继续下一步或感谢您的页面,它会重新加载回同一页面而不会显示任何错误或警告。
这也发生在沙盒模式下。
当我们选择通过信用卡支付而不登录时,它会加载卡详细信息输入页面,但在添加购物车后,它不会接受付款并显示卡被拒绝的消息。卡有资金。沙盒中发生了一些带有测试卡详细信息的事情。
以下是用于生成付款意图的示例代码。
//first get the access token
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://api.paypal.com/v1/oauth2/token",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "grant_type=client_credentials",
CURLOPT_HTTPHEADER => array(
"Authorization: Basic " . base64_encode(PAYPAL_ID.":".PAYPAL_SECRET),
"Content-Type: application/x-www-form-urlencoded"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
exit();
}
$responseData = json_decode($response);
$accessToken = $responseData->access_token;
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.paypal.com/v2/checkout/orders",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode($requestBody),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Authorization: Bearer $accessToken"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
exit();
}
$responseData = json_decode($response);
//var_dump($responseData);
if ($responseData->status !== 'CREATED') {
echo "Order creation failed: " . $responseData->debug_id;
exit();
}
$orderId = $responseData->id;
$_SESSION['paypal_id'] = $orderId;
$approveUrl = '';
foreach ($responseData->links as $link) {
if ($link->rel === 'approve') {
$approveUrl = $link->href;
break;
}
}
if (!$approveUrl) {
echo "Approve URL not found";
exit();
}
$data_back = array();
$data_back['url'] = $approveUrl;
尝试了实时模式和沙盒模式。
您缺少捕获步骤。
从您的站点重定向到 PayPal 时(不推荐),您创建的订单必须有一个 return_url,以便付款人可以在批准付款后重定向回来。然后您需要通过另一个 API 调用来捕获付款。
最好的用户体验不是重定向,而是将 API 订单创建和捕获与 JS SDK 配对用于审批流程。这使您的网站始终在后台加载,在此处记录(那里的示例使用 Node.js 作为后端,但您当然可以在包括 PHP 在内的任何环境中实现它)。
在您捕获付款之前,不会有 PayPal 交易。在捕获 API 调用之后,您可以显示成功或失败的消息。执行捕获 API 调用的服务器路由还应验证 API 响应中捕获的金额是否正确,然后再将结果存储为成功付款并使用结果自动执行任何操作。