PayPal Rest API 实时和沙盒支付未被捕获

问题描述 投票:0回答:1

通过 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;


尝试了实时模式和沙盒模式。

php rest paypal paypal-sandbox
1个回答
0
投票

您缺少捕获步骤。

从您的站点重定向到 PayPal 时(不推荐),您创建的订单必须有一个 return_url,以便付款人可以在批准付款后重定向回来。然后您需要通过另一个 API 调用来捕获付款。

最好的用户体验不是重定向,而是将 API 订单创建和捕获与 JS SDK 配对用于审批流程。这使您的网站始终在后台加载,在此处记录(那里的示例使用 Node.js 作为后端,但您当然可以在包括 PHP 在内的任何环境中实现它)。

在您捕获付款之前,不会有 PayPal 交易。在捕获 API 调用之后,您可以显示成功或失败的消息。执行捕获 API 调用的服务器路由还应验证 API 响应中捕获的金额是否正确,然后再将结果存储为成功付款并使用结果自动执行任何操作。

© www.soinside.com 2019 - 2024. All rights reserved.