PHP调用PayU支付API返回HTML而非JSON问题解决方案咨询
问题根源
你当前配置的cURL开启了自动跟随跳转(CURLOPT_FOLLOWLOCATION => true),且关闭了响应头获取,所以会直接拿到302跳转目标页面的HTML内容,无法获取到接口原始响应的Location头和JSON数据。
修复步骤
1. 调整cURL核心配置
修改两个关键参数:
- 将
CURLOPT_FOLLOWLOCATION设置为false,禁止cURL自动跟随302跳转 - 将
CURLOPT_HEADER设置为true,开启响应头获取,才能提取Location字段
2. 处理响应数据,构造预期返回格式
修改后的完整PHP代码如下:
$curl = curl_init(); $data = $data->get_params(); $data['order']['customerIp'] = $_SERVER['REMOTE_ADDR']; $extOrderId = generateRandomString(); // 提前存储后续返回使用 $data['order']['extOrderId'] = $extOrderId; $postdata = json_encode($data['order']); curl_setopt_array($curl, array( CURLOPT_URL => 'https://secure.snd.payu.com/api/v2_1/orders', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_HEADER => true, // 开启响应头获取 CURLOPT_FOLLOWLOCATION => false, // 关闭自动跳转 CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => $postdata, CURLOPT_HTTPHEADER => array( 'Content-Type: application/json', 'Authorization: Bearer '.$data['token'] ), )); $response = curl_exec($curl); // 分离响应头和响应体 $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE); $headers = substr($response, 0, $headerSize); $body = substr($response, $headerSize); $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); // 提取需要的字段 $redirectUri = ''; if ($httpCode == 302) { // 匹配Location头内容 if (preg_match('/Location:\s*(.*?)\s*\r\n/i', $headers, $matches)) { $redirectUri = trim($matches[1]); } // 解析原始响应体的JSON数据 $responseData = json_decode($body, true); } // 构造预期返回格式 $return = [ 'status' => [ 'statusCode' => $httpCode == 302 ? 'SUCCESS' : 'ERROR' ], 'redirectUri' => $redirectUri, 'orderId' => $responseData['orderId'] ?? '', 'extOrderId' => $extOrderId ]; return rest_ensure_response($return);
3. 前端Angular跳转处理
拿到后端返回的JSON结果后直接跳转即可:
// 调用后端接口拿到响应后 if (res.status.statusCode === 'SUCCESS') { window.location.href = res.redirectUri; }
补充说明
如果接口原始响应体本身就包含完整的JSON结构,可以直接解析$body变量获取全部字段,无需手动拼接返回值。
内容的提问来源于stack exchange,提问作者Michał B
相关产品推荐
相关产品推荐

