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
相关产品推荐
相关产品推荐

