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

调用XERO API换取accessToken报错unsupported_grant_type求助

你的代码存在3处直接导致报错的问题,按影响优先级排序:

核心错误1:表单参数传递位置错误

application/x-www-form-urlencoded类型的POST参数需要放在请求体中传递,对应requests.post的data入参。你当前将参数字符串传给了params入参,这个参数会把所有内容拼接在URL末尾作为查询参数发送,Xero的token端点不会从URL查询参数中读取grant_type字段,找不到该字段就会直接返回unsupported_grant_type错误。

核心错误2:Base64编码方式不符合规范

HTTP Basic 认证要求使用标准Base64算法编码client_id:client_secret字符串,你使用的base64.urlsafe_b64encode是URL安全变种编码,会将标准Base64结果中的+//替换为-/_,会导致Authorization头校验失败(该问题通常会触发invalid_client报错,你当前因为参数位置错误先触发了授权类型错误)。

潜在错误3:手动拼接参数字符串带入多余空格

你用反斜杠做字符串多行拼接时,每行参数前的缩进空格会被带入最终的字符串内容,导致参数名、参数值前携带多余空格,即使修正了参数位置问题,也会触发参数校验失败。


修正后的代码

import base64
import requests

# 替换为你的应用实际配置
CLIENT_ID = "你的应用Client ID"
CLIENT_SECRET = "你的应用Client Secret"
AUTH_CODE = "授权流程获取到的一次性code"
REDIRECT_URI = "https://developer.xero.com/"  # 需和Xero后台配置的回调地址完全一致

# 标准Base64编码生成Authorization头
auth_raw = f"{CLIENT_ID}:{CLIENT_SECRET}"
basic_auth_token = base64.b64encode(auth_raw.encode("utf-8")).decode("utf-8")

# 表单参数用字典格式传递,requests会自动完成x-www-form-urlencoded格式编码
form_payload = {
    "grant_type": "authorization_code",
    "code": AUTH_CODE,
    "redirect_uri": REDIRECT_URI
}

resp = requests.post(
    url="https://identity.xero.com/connect/token",
    headers={"Authorization": f"Basic {basic_auth_token}"},
    data=form_payload
)

print(resp.status_code)
print(resp.json())

额外排查提示

  • 授权码code有效期仅10分钟,且只能使用一次,过期或重复使用都会返回错误,需要重新走授权流程获取新code。
  • 不需要手动设置Content-Type请求头,传入字典类型的data参数时,requests会自动添加正确的application/x-www-form-urlencoded头,避免手动书写时格式错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 08:48:25