如何修复CURLOPT_POSTFIELDS传入$amount后显示null的问题
问题根因
- PHP单引号包裹的字符串不会解析内部变量,你当前代码中
CURLOPT_POSTFIELDS绑定的是单引号包裹的JSON字符串,内部的$amount不会被替换成实际传入的GET参数值,会被作为字面量字符串"$amount"提交给接口,接口无法将该字符串解析为合法数值,自动转换为null。 - 代码存在两处额外隐患:
x-api-key请求头的冒号后未加空格,不符合HTTP头格式规范,部分网关/接口会直接识别为非法请求头- 未对入参做合法性校验,直接透传GET参数,容易出现非法值导致接口报错;
CURLOPT_TIMEOUT设为0代表无限等待,容易导致请求堆积。
修复方案
不要手动拼接JSON字符串,使用PHP数组构造请求结构体,再通过json_encode()函数生成标准格式的JSON串,从根源避免变量不解析、JSON格式错误、字段类型不匹配问题。
修复后的完整代码如下:
<?php // 入参合法性校验 $api = isset($_GET['api']) ? trim($_GET['api']) : ''; $amount = isset($_GET['amount']) && is_numeric($_GET['amount']) ? (float)$_GET['amount'] : 0; if (empty($api) || $amount <= 0) { header('Content-Type: application/json'); echo json_encode(['code' => 400, 'msg' => '非法请求参数'], JSON_PRETTY_PRINT); exit; } $curl = curl_init(); // 数组形式构造POST请求数据 $requestBody = [ 'price_amount' => $amount, 'price_currency' => 'usd', 'pay_currency' => 'btc' ]; curl_setopt_array($curl, array( CURLOPT_URL => 'https://api.googl.com', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 10, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => json_encode($requestBody), CURLOPT_HTTPHEADER => array( 'x-api-key: ' . $api, 'Content-Type: application/json' ), )); $response = curl_exec($curl); $curlErr = curl_error($curl); curl_close($curl); header('Content-Type: application/json'); if ($curlErr) { echo json_encode(['code' => 500, 'msg' => '请求失败:' . $curlErr], JSON_PRETTY_PRINT); exit; } $formattedResp = json_encode(json_decode($response), JSON_PRETTY_PRINT); echo $formattedResp; ?>
注意:不要采用双引号转义拼接JSON的写法,该写法一旦字段包含双引号、换行、特殊字符就会导致JSON格式损坏,接口直接解析失败,以下写法仅作原理参考,禁止生产环境使用:
CURLOPT_POSTFIELDS =>"{ \"price_amount\": $amount, \"price_currency\": \"usd\", \"pay_currency\": \"btc\" }",
内容的提问来源于stack exchange,提问作者user19403029
相关产品推荐
相关产品推荐

