1

首先,我没有使用 Xero api。我认为这比 Xero 更像是一个 OAuth2 问题。

不太确定问题是一般的 OAuth2 问题还是 OAuth2 的 Xero 实现。我可以成功地进行身份验证,从 Xero 获取我的令牌等。我什至可以成功地向他们的端点发出获取发票和联系人的请求。我的问题是尝试发布任何内容,即创建发票。

服务器响应 400 Bad request。通过将 XML 放入他们的 API 测试器中,我已经通过实际发布数据确认是正确的,并且一切都很好。

发布请求不应该是httpwebequest带有查询字符串的标准 (POST)?oauth_signature=[sig here]以及通过流编码和发送的实际发布数据 URL 吗?我的实施是否正确,我应该在其他地方寻找问题吗?以表格形式发送的数据是否应该包含在签名中?

{
    byte[] reqData = encode.GetBytes(postData);

    HttpWebRequest request = WebRequest.CreateHttp(url + querystring) as HttpWebRequest;
    request.Method = "POST";
    try {
        using (Stream stream = request.GetRequestStream) {
            stream.Write(reqData, 0, reqData.Length);
        }

        using (HttpWebResponse response = request.GetResponse) {
            Stream dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);

            dynamic responseFromServer = reader.ReadToEnd();
            return responseFromServer;
        }

    } catch (Exception ex) {
    }
}
4

2 回答 2

4

Xero 使用 OAuth1.0a,而不是 OAuth2。OAuth 签名需要作为标头而不是查询字符串提供。我相信它应该与您发出的成功 GET 请求完全相同。

https://oauth.net/core/1.0a/#rfc.section.5.4.1

OAuth 协议参数通过以下方式在授权标头中发送:

参数名称和值按照参数编码进行编码。对于每个参数,名称后面紧跟一个 '=' 字符(ASCII 码 61)、一个 '"' 字符(ASCII 码 34)、参数值(可以为空)和另一个 '"' 字符(ASCII 码34)。根据 [RFC2617],参数由逗号字符(ASCII 代码 44)和可选线性空格分隔。根据 [RFC2617] 第 1.2 节添加和解释 OPTIONAL 领域参数。

于 2017-11-12T20:08:29.063 回答
1

对于那些现在发现这个的更新,Xero API 现在在公共 Beta 中具有 OAuth2 https://developer.xero.com/documentation/oauth2/overview

于 2019-10-09T21:03:16.443 回答