You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PayPal REST API生产与沙箱环境支付无法完成问题求助

PayPal REST API集成问题

问题现象

  • 生成支付订单并获取重定向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;

$requestBody = [
    'intent' => 'CAPTURE',
    'purchase_units' => [[
        'amount' => [
            'currency_code' => 'EUR',
            'value' => $send_total, // cart total
        ],
    ]],
    'redirect_urls' => [
        'return_url' => $thank_you_link, 
        'cancel_url' => $cart_link,
    ]
];
$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;

排查与修复方案

1. 校验跳转URL合法性

  • 确保$thank_you_link和$cart_link是完整的HTTPS URL(生产环境强制要求,沙箱环境建议统一使用HTTPS)
  • 检查URL无特殊字符或编码错误,PayPal会严格校验跳转地址格式
  • 直接访问这两个URL,确认页面能正常加载,无重定向循环或服务器错误

2. 订单金额与货币规范

  • 确认$send_total是精确到分的有效数值格式(如"10.00"而非"10"),PayPal要求金额必须符合币种的精度要求
  • 沙箱环境中,测试卡的币种需与订单currency_code(EUR)匹配,使用对应币种的测试卡

3. 补充订单必要字段

当前请求的purchase_units缺少风控依赖的标识字段,建议补充:

'purchase_units' => [[
    'reference_id' => 'order-' . uniqid(), // 唯一订单标识
    'description' => '商品订单支付', // 订单描述
    'amount' => [
        'currency_code' => 'EUR',
        'value' => $send_total,
        'breakdown' => [ // 可选但建议补充,明确金额构成
            'item_total' => [
                'currency_code' => 'EUR',
                'value' => $send_total
            ]
        ]
    ],
]],

4. 捕获详细API错误信息

取消注释var_dump($responseData);,查看订单创建返回的完整响应内容;沙箱环境可通过开发者仪表盘,根据debug_id查询详细日志,定位支付失败的具体原因

5. 检查HTTP请求细节

  • 确认json_encode($requestBody)无编码错误,可先输出编码后的字符串验证格式正确性
  • 生产环境中,确保服务器SSL证书配置正常,curl能信任PayPal的API证书(可添加CURLOPT_SSL_VERIFYPEER => true并配置正确的CA证书)

6. 信用卡支付问题排查

沙箱环境使用测试卡需严格遵循规则:

  • EUR币种测试卡示例:4111 1111 1111 1111,有效期设为任意未来日期,CVV填任意3位
  • 若提示卡片被拒,可更换其他测试卡,或查看支付失败的具体错误码(如INSUFFICIENT_FUNDS、INVALID_CARD等)针对性处理

内容的提问来源于stack exchange,提问作者Rashod Chamikara Bandara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:56:36