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

GoToTraining API拒绝JSON请求?PHP创建培训遇问题

解决GoToTraining API POST请求被拒绝的问题

看起来你在对接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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:06:15