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

如何用cURL和PHP实现OAuth2?请求返回400错误

解决Swiftdil OAuth2 Token接口400 Bad Request问题

看起来你在调用Swiftdil的OAuth2令牌接口时碰到了400错误,咱们一步步来排查和解决这个问题:

问题回顾

你参考的官方Curl示例是:

curl -X POST https://sandbox.swiftdil.com/v1/oauth2/token \
-H 'Content-Type: application/x-www-form-urlencoded' \
-u 'your_username:your_password'

你的PHP代码尝试复刻这个请求,但返回了HTTP/1.1 400 Bad Request,没有拿到预期的令牌响应。

可能的问题点及修复方案

1. 缺少必填的POST请求参数(核心问题)

仔细看OAuth2的密码模式规范,很多服务即使使用了基础认证,也要求必须提交grant_type=password这个表单参数——你的代码里完全没有设置POST数据,这大概率是400错误的根源。

给代码添加POST参数:

// 新增这行,构造并传递grant_type参数
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
    'grant_type' => 'password'
]));

2. 调整响应头输出设置

你的代码开启了CURLOPT_HEADER, 1,这会让输出包含HTTP响应头,虽然不是错误原因,但会干扰你查看接口返回的JSON错误详情。可以暂时把它改成0,这样能直接看到接口返回的具体错误提示,方便进一步排查。

3. 可选:手动构造基础认证头(排查用)

虽然Curl的CURLOPT_USERPWD会自动处理基础认证,但如果你的用户名/密码包含特殊字符,可能会出现编码问题。可以尝试手动构造Authorization头来替代:

// 注释掉原来的CURLOPT_USERPWD
// curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);

// 手动构造基础认证头
$auth = base64_encode($username . ":" . $password);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/x-www-form-urlencoded',
    "Authorization: Basic {$auth}"
]);

4. 增强错误排查信息

可以添加更详细的Curl错误输出,帮助定位问题:

if(curl_errno($ch)) {
    echo 'Curl请求错误: ' . curl_error($ch);
}

修复后的完整代码示例

<?php
// Api Credentials
$url = 'https://sandbox.swiftdil.com/v1/oauth2/token';
$username = "my_username";
$password = "my_password";

// Set up api environment
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
// 关闭头输出,方便查看JSON响应内容
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
// 必须添加的grant_type参数
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
    'grant_type' => 'password'
]));

// Give back curl result
$output = curl_exec($ch);
$info = curl_getinfo($ch);
$curl_error = curl_error($ch);
curl_close($ch);

print_r($output);
print_r($info);
print_r($curl_error);
?>

额外建议

如果修改后还是报错,建议先用Postman等接口测试工具复刻官方的Curl请求,确认你的用户名、密码和参数都能正常获取令牌后,再对比PHP代码的请求差异,这样能更快定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:53:56