
本文详解 PHP 中调用 RESTful API 的常见陷阱,重点解决因请求体格式、Header 设置或 JSON 解析不当导致的 NULL 响应问题,并提供可直接运行的完整示例。
本文详解 php 中调用 restful api 的常见陷阱,重点解决因请求体格式、header 设置或 json 解析不当导致的 `null` 响应问题,并提供可直接运行的完整示例。
在 PHP 中使用 cURL 调用外部 API(如 Paymee 沙箱支付接口)时,看似与 Python 逻辑一致,但细微差异极易引发失败——最典型表现就是 json_decode(curl_exec(...), true) 返回 NULL。这并非 API 拒绝服务,而是请求未被正确识别或响应未被妥善处理。
根本原因有三点:
✅ 请求体必须为 JSON 字符串(而非 PHP 关联数组);
✅ Content-Type: application/json 必须显式声明;
✅ 需检查 cURL 错误并验证 HTTP 状态码,避免静默失败。
以下为修正后的完整 PHP 示例(已通过 Paymee 沙箱环境实测):
<?php
// 1. 构建请求数据并转为 JSON 字符串
$data = [
'vendor' => 1265,
'amount' => 45,
'note' => 'Commande #1324'
];
$json_data = json_encode($data);
// 2. 设置请求头(含 Authorization 和 Content-Type)
$headers = [
'Authorization: Token 12345678900987654321234567890',
'Content-Type: application/json',
'Accept: application/json'
];
// 3. 初始化 cURL
$ch = curl_init('https://sandbox.paymee.tn/api/v1/payments/create');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data); // ✅ 关键:传入 JSON 字符串,非数组
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 开发环境可临时禁用证书验证(生产务必启用)
// 4. 执行请求并检查错误
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
// 5. 安全解析 JSON 响应
if ($response === false) {
die("cURL Error: " . $error);
}
if ($http_code !== 200 && $http_code !== 201) {
die("HTTP Error: " . $http_code);
}
$result = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
die("JSON Parse Error: " . json_last_error_msg());
}
// 输出结果(与 Python 行为完全一致)
var_dump($result);
// 示例成功输出:['status' => true, 'message' => 'Success', 'code' => 50, 'data' => ['token' => '773b718a...', 'amount' => 45.0]]
?>⚠️ 关键注意事项:
- ❌ 错误写法:CURLOPT_POSTFIELDS 直接传入数组(cURL 会以 application/x-www-form-urlencoded 格式发送,API 拒绝解析);
- ✅ 正确写法:json_encode() 后传字符串,并配 Content-Type: application/json;
- 始终检查 curl_exec() 是否返回 false(网络失败)、HTTP 状态码(4xx/5xx)、json_last_error()(JSON 格式错误);
- 生产环境务必移除 CURLOPT_SSL_VERIFYPEER => false,并配置 CA 证书路径。
掌握此模式后,你可复用于任何标准 JSON REST API——无需依赖第三方库,原生 cURL 即可稳定、高效完成认证请求与结构化解析。
立即学习“PHP免费学习笔记(深入)”;



















