GoToTraining API拒绝JSON请求?PHP创建培训遇问题
看起来你在对接GoToTraining API创建培训时遇到了请求被拒的问题,我帮你梳理几个常见的排查方向和解决办法:
1. 核对JSON结构与API文档的一致性
GoToTraining的API对JSON格式要求非常严格,你代码里的times数组看起来被截断了,这很可能是问题根源之一。根据API文档,times数组里的每个时间对象至少需要包含**startDate、startTime**,以及durationInMinutes(或者endDate+endTime)。比如正确的结构应该是:
'times' => array( array( 'startDate' => date('Y-m-d', strtotime($_POST['acf']['your_start_date_field'])), 'startTime' => date('H:i:s', strtotime($_POST['acf']['your_start_time_field'])), 'durationInMinutes' => 90 // 或者填写endDate和endTime ) )
另外,建议你用json_encode($my_data_array, JSON_PRETTY_PRINT)把数组转成格式化的JSON,和API文档里的示例JSON逐字段对比,检查是否有拼写错误(比如timeZone的大小写是否和文档一致)。
2. 验证ACF数据的有效性
直接从$_POST['acf']取值很容易踩坑,建议先做存在性和有效性检查:
- 检查字段是否存在:比如你用
get_the_title()的那个字段,先确认$_POST['acf']['field_5ab508b853122']确实传递了有效的文章ID,避免get_the_title()返回空值; - 日期格式验证:
strtotime()如果无法解析ACF的日期格式,会返回false,导致startDate变成1970-01-01,这肯定会被API拒绝。如果ACF日期字段用的是默认的Ymd格式,要确保转换正确,或者直接用ACF的get_field()函数(如果在循环或正确的上下文里)来获取格式化后的日期。
示例代码:
// 安全获取ACF数据 $training_post_id = $_POST['acf']['field_5ab508b853122'] ?? null; $name = $training_post_id ? get_the_title($training_post_id) : ''; $description = $_POST['acf']['field_5ab50b2406457'] ?? ''; $start_date_raw = $_POST['acf']['your_start_date_field'] ?? ''; $start_time_raw = $_POST['acf']['your_start_time_field'] ?? ''; // 验证日期时间有效性 $start_date = strtotime($start_date_raw) ? date('Y-m-d', strtotime($start_date_raw)) : ''; $start_time = strtotime($start_time_raw) ? date('H:i:s', strtotime($start_time_raw)) : ''; if (empty($name) || empty($start_date) || empty($start_time)) { // 处理必填字段缺失的情况 die('必填字段不完整'); }
3. 检查请求头是否正确设置
POST请求必须携带正确的请求头,这是很多人容易忽略的点:
$headers = array( 'Content-Type: application/json', // 必须设置,告诉API你发送的是JSON 'Authorization: Bearer ' . $your_access_token // 别忘了有效的授权令牌! );
如果没有设置Content-Type,API可能无法解析你的请求;如果授权令牌过期或无效,也会直接拒绝请求。
4. 捕获API的错误响应
别只知道请求被拒,一定要获取API返回的具体错误信息,这是最快定位问题的方法。用cURL发送请求时,捕获响应和HTTP状态码:
$api_endpoint = 'https://api.gototraining.com/v1/trainings'; $ch = curl_init($api_endpoint); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($my_data_array)); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 生产环境建议开启 $response = curl_exec($ch); $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 打印调试信息 echo "HTTP状态码: " . $http_status . "<br>"; echo "API响应: " . $response;
API通常会返回明确的错误提示,比如“缺少startTime字段”、“日期格式不符合要求”、“授权失败”等,根据提示针对性修复即可。
5. 确认所有必填字段都已包含
最后再对照GoToTraining API的官方文档,确认你提交的数组包含了所有必填字段。比如name、timeZone、times是核心必填项,某些场景下可能还需要language、maxRegistrants等字段,务必严格按照文档要求来。
内容的提问来源于stack exchange,提问作者slashbob

