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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:09:03