QuickBooks API创建客户POST请求失败:认证错误代码100求助
看起来你遇到了QuickBooks API POST请求的认证问题,不过既然GET请求一切正常,说明你的基础OAuth2认证流程是通的,大概率是POST请求的细节没踩对QB API的要求,下面是几个常见的排查方向:
1. 检查OAuth2令牌的权限范围
创建客户需要com.intuit.quickbooks.accounting这个读写权限,如果你的令牌只有只读权限(比如com.intuit.quickbooks.accounting.readonly),POST写操作肯定会被拦截。你可以通过QB开发者后台查看令牌的权限,或者重新引导用户授权时,确保申请了正确的读写scope。
2. 强制设置POST请求的Content-Type头
QB API要求POST/PUT请求必须携带application/json的Content-Type头,很多OAuth2客户端库不会自动帮你设置这个,导致服务器无法正确解析请求体,进而触发看似是认证的通用错误。
以你用的Ruby OAuth2库为例,手动添加头并把哈希转成JSON字符串:
at.post( "https://quickbooks.api.intuit.com/v3/company/#{realm_id}/customer", new_customer.to_json, headers: { "Content-Type" => "application/json" } )
3. 确认Realm ID完全正确
虽然GET请求正常,但还是要核对POST请求里的realm_id和GET时用的是否完全一致——有时候变量传递或复制粘贴时容易出现拼写错误,导致请求指向错误的公司实体,触发认证错误。
4. 排查请求体的格式细节
你的客户数据大致没问题,但有两个小细节可以先调整试试:
CountrySubDivisionCode:法国的地区代码应该是具体的大区标识(比如IDF对应法兰西岛),而不是国家代码FR,QB API对这个字段的校验比较严格,错误值可能导致请求被拒绝(服务器有时候会把格式错误映射成通用认证错误)。- 拼写修正:
DonwtownLA应该是DowntownLA,虽然这个不影响认证,但建议修正避免后续其他问题。
你也可以先简化请求体,只传必填字段(比如DisplayName、GivenName、FamilyName),看看能不能成功创建客户,再逐步添加其他字段定位问题。
5. 验证令牌有效性(概率较低)
虽然GET正常,但也可以确认下令牌的expires_at时间,或者尝试刷新令牌后再发起POST请求排除过期问题。
内容的提问来源于stack exchange,提问作者Jordan Mcn

