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; } ?>
关键修复点说明
- 移除无效的
file_get_contents调用:所有请求都通过curl处理,确保身份验证信息被正确携带。 - 恢复GET请求方式:去掉了POST相关的配置,贴合接口的实际要求。
- 调整curl选项顺序:把
CURLOPT_RETURNTRANSFER放在curl_exec之前,确保响应结果能被捕获到变量中。 - 添加错误处理逻辑:增加了curl执行错误和JSON解析错误的检查,方便你快速定位问题。
- 优化请求头:用
Accept: application/json明确告诉服务器我们期望的响应格式,去掉了无用的Content-Type头。
如果还是遇到SSL证书问题,大概率是你的服务器缺少对应的根CA证书,生产环境建议安装官方CA证书包,本地测试可以临时用注释里的两行跳过验证。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

