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

PHP调用需身份验证的SNCF API遇SSL及认证问题求助

解决SNCF API身份验证与PHP请求错误问题

看起来你在调用SNCF的API时踩了几个典型的坑,包括SSL报错、请求方式错误以及curl配置顺序问题,咱们一步步来修复:

原代码的核心问题

  • 提前执行无认证的file_get_contents:你先调用了file_get_contents($host),这个请求完全没带身份验证信息,服务器返回的异常响应直接触发了SSL错误,这是第一个报错的根源。
  • 错误的请求方式:SNCF的这个班次查询接口是GET请求,但你强行设置了CURLOPT_POST = 1,接口根本无法处理这种不符合预期的请求。
  • curl选项顺序搞反了:CURLOPT_RETURNTRANSFER被放在curl_exec之后,导致curl直接输出响应内容,而不是把结果返回给变量供后续处理。
  • 不必要的Content-Type设置:你指定了application/xml,但接口返回的是JSON数据,而且GET请求本来就不需要这个头。

修正后的PHP代码

<?php
// API请求地址
$apiUrl = 'https://api.sncf.com/v1/coverage/sncf/stop_areas/stop_area:OCE:SA:87391003/departures?datetime=20180323T085700';
// 你的API Token(作为Basic Auth的用户名,密码留空)
$token = "d96395d8-342d-4be4-8ed3-5909624abc57";

// 初始化curl实例
$ch = curl_init($apiUrl);

// 配置curl核心选项
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json')); // 告诉服务器我们要JSON格式的响应
curl_setopt($ch, CURLOPT_USERPWD, $token . ":"); // Basic Auth:用户名是token,密码为空字符串
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 让curl返回结果而不是直接输出到页面

// 本地环境如果遇到SSL证书验证失败,可以临时加这两行(生产环境不建议禁用,建议安装根CA证书)
// curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

// 执行请求并获取响应
$response = curl_exec($ch);

// 检查curl是否执行出错
if(curl_errno($ch)) {
    echo 'Curl执行错误: ' . curl_error($ch);
    curl_close($ch);
    exit;
}

// 关闭curl资源
curl_close($ch);

// 解析JSON响应
$data = json_decode($response);

// 检查JSON解析是否成功
if($data === null) {
    echo 'JSON解析失败,原始响应内容:' . $response;
    exit;
}

// 遍历输出出发方向信息
if(isset($data->departures)) {
    foreach ($data->departures as $departure) {
        echo $departure->display_informations->direction . '<br />';
    }
} else {
    echo '未获取到班次数据,原始响应内容:' . $response;
}
?>

关键修复点说明

  1. 移除无效的file_get_contents调用:所有请求都通过curl处理,确保身份验证信息被正确携带。
  2. 恢复GET请求方式:去掉了POST相关的配置,贴合接口的实际要求。
  3. 调整curl选项顺序:把CURLOPT_RETURNTRANSFER放在curl_exec之前,确保响应结果能被捕获到变量中。
  4. 添加错误处理逻辑:增加了curl执行错误和JSON解析错误的检查,方便你快速定位问题。
  5. 优化请求头:用Accept: application/json明确告诉服务器我们期望的响应格式,去掉了无用的Content-Type头。

如果还是遇到SSL证书问题,大概率是你的服务器缺少对应的根CA证书,生产环境建议安装官方CA证书包,本地测试可以临时用注释里的两行跳过验证。

内容的提问来源于stack exchange,提问作者Will

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:55:34