调用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
相关产品推荐
相关产品推荐

