使用PayPal API时已批准订单未显示在交易记录且余额未更新
问题根源与解决方案
核心问题
当你创建意图为CAPTURE的PayPal订单时,APPROVED状态仅代表用户已同意授权付款,但并未完成实际的资金捕获。只有调用专门的捕获接口,才能触发资金划转,订单才会出现在交易记录中。你的当前代码仅检查了订单状态,缺少关键的捕获步骤。
修正后的后端代码
在检测到订单状态为APPROVED后,添加资金捕获的请求逻辑:
$orderId = $_POST['orderId']; $clientId = '你的LIVE环境Client ID'; $clientSecret = '你的LIVE环境Client Secret'; // 1. 验证订单状态 $checkUrl = "https://api.paypal.com/v2/checkout/orders/$orderId"; $headers = array( 'Content-Type: application/json', 'Authorization: Basic ' . base64_encode($clientId . ':' . $clientSecret), ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $checkUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $response = curl_exec($ch); curl_close($ch); if ($response) { $responseData = json_decode($response, true); $orderStatus = $responseData['status']; if ($orderStatus === 'APPROVED') { // 2. 关键步骤:调用捕获接口完成收款 $captureUrl = "https://api.paypal.com/v2/checkout/orders/$orderId/capture"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $captureUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $captureResponse = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($captureResponse && $httpCode === 201) { $captureData = json_decode($captureResponse, true); // 捕获成功,可记录交易ID、金额等信息到数据库 echo 'SUCCESS: 资金已捕获'; } else { // 捕获失败,处理错误逻辑 echo 'ERROR: 资金捕获失败'; // 建议记录错误响应便于排查 error_log('PayPal捕获错误: ' . $captureResponse); } } else { echo 'ERROR: 订单未批准'; } } else { echo 'ERROR: 无法获取订单信息'; }
额外注意事项
- 捕获接口返回
201 Created状态码才代表捕获成功,此时订单会进入交易记录,资金会划转至你的PayPal账户。 - 务必处理捕获过程中的错误(如网络问题、PayPal返回的错误码),避免遗漏收款。
- 建议在代码中添加日志记录,记录订单ID、捕获响应等信息,方便后续排查问题。
内容的提问来源于stack exchange,提问作者Mystical
相关产品推荐
相关产品推荐

