QuickBooks Online沙箱创建发票返回400 Bad Request问题求助
我之前在开发QBO集成时也碰到过一模一样的沙箱创建条目报400的问题,结合你描述的情况(查询正常但创建失败,复制API Explorer数据也不行),给你几个实用的排查方向:
先抓准QBO返回的具体错误信息:400错误不是只有一个原因,QBO的响应体里会有详细的错误描述,比如某个字段无效、权限不足等。你一定要把响应的JSON内容打印出来,重点看
errors数组里的message和detail字段,这是最快定位问题的方法。检查请求体里的「示例ID」是否有效:API Explorer里的默认数据用的是QBO的示例测试数据,比如
CustomerRef的value可能是个假ID,并不存在于你的沙箱环境中。你可以先通过查询请求Select * from Customer拿到自己沙箱里真实的客户ID,替换掉请求体里的示例ID再试——我当初就是踩了这个坑!核对请求头的完整性:QBO对请求头的要求很严格,必须确保:
Content-Type严格设置为application/jsonAccept设置为application/jsonAuthorization头的Bearer token是有效的(沙箱token有效期很短,容易过期)- 别忘了带上
Request-ID(虽然不是强制,但有助于Intuit排查问题)
验证数据类型和格式:QBO对JSON数据类型的校验非常严格,比如
Amount必须是数字类型(不能是字符串),DocNumber不能包含特殊字符,日期格式必须是YYYY-MM-DD。你可以用JSON校验工具检查请求体的格式是否正确,有没有多余的逗号、未闭合的引号等小问题。确认应用权限范围:虽然你能成功查询发票,但创建条目可能需要额外的权限。登录Intuit开发者后台,找到你的应用,检查权限设置里是否勾选了对应资源的
Create权限(比如Invoice的Create权限)——默认权限可能只有Read权限,需要手动开启。对比API Explorer的原始请求:在API Explorer里把能成功的请求导出为curl或者Postman格式,然后和你代码里发送的请求做逐行对比,包括请求头、请求体、URL路径(沙箱的URL是
https://sandbox-quickbooks.api.intuit.com/v3/company/{companyId}/invoice,别把companyId写错了)。
另外,你提到代码是var princip...,如果是在.NET环境下,要确保用HttpClient发送请求时,是用JsonContent.Create()或者JsonConvert.SerializeObject正确序列化对象,而不是手动拼接JSON字符串,手动拼接很容易出现格式错误。
内容的提问来源于stack exchange,提问作者Arshdeep Singh

