8

ich je hatte Erfolg Objekte mit POST und Content-Type application/xmlQuickbooks Online Abfrage mit Filter zurück 401 jedes Mal

ich Abfrage habe auch Erfolg zu schaffen gemacht mit Content-Type application/x-www-form- urlencoded mit einem leeren Anforderungskörper, der den gesamten Objekttyp zurückgibt, abhängig davon, welchen URI ich angabe.

Ich kann auch das gleiche mit etwas wie PageNum = 1 & ResultsPerPage = 1 in der Anfrage Körper arbeiten und ich habe herausgefunden, wie das in die Signatur zu integrieren, damit ich eine gültige Antwort erhalten.

Aber egal wie ich es formatiere, kann ich nichts anderes als eine 401 Antwort bekommen, wenn ich versuche, einen Filter (etwas grundlegend wie Filter = FAMILYNAME: EQUALS: Doe) zu verwenden. Ich habe die OAuth Core 1.0 Revision A-Spezifikationen darüber gelesen, wie alle Parameternamen und -werte mithilfe der [RFC3986] Prozent-Codierung maskiert werden. Allerdings habe ich das Gefühl, dass ich einen Schritt verpasse oder falsch formatiere. Ich habe bei der Suche in Intuits Foren inkonsistente Informationen darüber gesehen, was genau das richtige Format ist.

Jede Hilfe zu diesem würde sehr geschätzt werden. Ich kämpfe jetzt seit einer guten Woche damit.

Die Antwort, die ich erhalte, wenn ich versuche, einen Filter zu verwenden, ist: HTTP-Status 401 - Nachricht = Ausnahme, die OAuth authentifiziert; errorCode = 003200; status = 401

---- ---- aktualisiert

Ich sehe mir den gleichen Fehler, wenn ich versuche, Filter zu verwenden, um mit der neuen IPP Developer Tools - IPP API Explorer. Ich benutze den IDS V2 QBO API Explorer. Ich bin in der Lage, dieses Tool zu verwenden, um alle Post abrufen und die Antwort zeigt alle meine Kunden, aber wenn ich einen Filter zu verwenden, bekomme ich: Serverfehler 401 - Nicht autorisiert: Zugriff wird aufgrund ungültiger Anmeldeinformationen verweigert. Sie sind nicht berechtigt, dieses Verzeichnis oder diese Seite mit den von Ihnen angegebenen Anmeldeinformationen anzuzeigen.

Irgendwelche Ideen? Wenn ich den gleichen Fehler vom API-Explorer-Tool erhalte, denke ich, dass das Problem komplett anders ist.

---- ---- Schluss aktualisiert

Ich hatte schließlich Erfolg mit Filtern und ich glaube, ich habe herausfinden, was mein Problem war. Ich war immer misstrauisch, dass ich Anfragen mit Paginierung wie "PageNum = 1 & ResultsPerPage = 1" erhalten konnte, aber ich konnte etwas wie "Filter = FAMILYNAME: EQUALS: Doe" nicht bekommen. Ich vermutete dort ein Problem mit dem Leerraum im Filterformat. Was mich daran hinderte, dass ich dies früher aufspürte, war, dass ich die Filter nicht im IDS V2 QBO API Explorer verwenden konnte. Das ließ mich vermuten, dass etwas anderes vor sich ging. Ich beschloss, den API Explorer alle zusammen zu ignorieren und mich darauf zu konzentrieren, warum ich es auf die eine, aber nicht auf die andere Weise zum Laufen bringen konnte.

Ich glaube, dass mein Problem auf eine falsche Codierung des Filters in der Signatur zurückzuführen ist. Das erklärt die 401 ungültigen Signaturfehler, die ich bekommen habe.

"Filter = Name: EQUALS: Doe" wird "Filter = Name% 20% 3AEQUALS% 20% 3ADoe" nach der Normalisierung.

Prozent-Codierung, die "Filter% 3DName% 2520% 253AEQUALS% 2520% 253ADoe" geben sollte.

Im Wesentlichen müssen Sie die Leerstelle und die Doppelpunkte "verdoppeln", aber nicht das Gleichheitszeichen.Ich habe viele Möglichkeiten der Kodierung ausprobiert, aber ich glaube, mein Fehler war, dass ich entweder nicht "doppelt" kodiert habe, oder wenn ich doppelt codiert habe, habe ich das "=" - Zeichen eingefügt. In jedem Fall bricht Ihre Unterschrift. Danke für die Beiträge aller.

+0

Scheint dumm, aber haben Sie versucht, die Räume mit% 20 zu ersetzen? – armani

+0

Ich verwende eine Funktion, um die RFC3986-Codierung für mich zu tun, aber ich habe auch versucht, manuell zu codieren und ein paar andere Möglichkeiten, die Codierung vergeblich zu tun. Danke für die Eingabe. – JoshASI

+0

vielen Dank für die Erstellung Ihrer eigenen OAuth-Signaturen ... Ich war dort, das Zeug das Leben treibt mich verrückt –

Antwort

1

Erhalten Sie eine 401 mit der gleichen Anfrage im API Explorer?

http://ippblog.intuit.com/blog/2013/01/new-ipp-developer-tool-api-explorer.html

Auch verwenden Sie die statische Basis-URL oder zur Laufzeit abrufen?

https://ipp.developer.intuit.com/0010_Intuit_Partner_Platform/0050_Data_Services/0400_QuickBooks_Online/0100_Calling_Data_Services/0010_Getting_the_Base_URL

Wenn Sie die statische Basis-URL verwenden, versuchen Sie auf die Runtime-Basis-URL Wechsel zu sehen, wenn Sie den Fehler weiterhin erhalten.

+0

Vielen Dank für den Link zum neuen IPP Developer Tool. Das ist sehr nützlich. Allerdings bekomme ich ähnliche Ergebnisse, obwohl ich eine etwas andere Antwort bekam. Ich hatte Erfolg damit, alle mit einer leeren Körperanforderung abzurufen. Wenn ich jedoch versuche, einen Filter in den Körper einzugeben, erhalte ich die Antwort: 401 - Nicht autorisiert: Der Zugriff wird aufgrund ungültiger Anmeldeinformationen verweigert. Sie sind nicht berechtigt, dieses Verzeichnis oder diese Seite mit den von Ihnen angegebenen Anmeldeinformationen anzuzeigen. – JoshASI

+0

Ich verwende die statische Basis-URL. Ich werde sehen, wie ich zur Runtime-Basis-URL wechsle und meine Ergebnisse posten kann. Vielen Dank. – JoshASI

+0

Ich suche immer noch mit der statischen Basis-URL. Allerdings mache ich mir Sorgen, dass ich die Filter nicht im IPP Developer Tool API Explorer arbeiten lassen kann. Mit dem IDS V2 QBO API Explorer kann ich erreichen, dass alle Kunden abgefragt werden, indem der Anfragetext leer gelassen wird. Wenn ich jedoch versuche, einen Filter wie "Filter = FAMILYNAME: EQUALS: Doe" einzugeben, bekomme ich die 401 - Unauthorized: Zugriff wird wegen ungültiger Anmeldeinformationen verweigert. Dies ist das gleiche Verhalten, das ich sehe, wenn ich versuche, Filter über die POST-Aufrufe meiner Software zu verwenden.Ich fange an zu vermuten, dass hier noch etwas anderes vor sich geht. Hat jemand irgendwelche Ideen? – JoshASI

1

peterl hat hier eine meiner Fragen beantwortet, die auch deine beantworten kann. Ich hatte versucht, die Filter in den Körper zu bringen, wenn sie in den Header hätten gehen sollen. Hier war peterls Codebeispiel für den Erhalt aller unbezahlten Rechnungen (offener Kontostand größer als 0.00) für einen bestimmten Kunden.

http://pastebin.com/raw.php?i=7VUB6whp

public List<Intuit.Ipp.Data.Qbo.Invoice> GetQboUnpaidInvoices(DataServices dataServices, int startPage, int resultsPerPage, IdType CustomerId) 
{ 
    StringBuilder requestXML = new StringBuilder(); 
    StringBuilder responseXML = new StringBuilder(); 

    var requestBody = String.Format("PageNum={0}&ResultsPerPage={1}&Filter=OpenBalance :GreaterThan: 0.00 :AND: CustomerId :EQUALS: {2}", startPage, resultsPerPage, CustomerId.Value); 

    HttpWebRequest httpWebRequest = WebRequest.Create(dataServices.ServiceContext.BaseUrl + "invoices/v2/" + dataServices.ServiceContext.RealmId) as HttpWebRequest; 
    httpWebRequest.Method = "POST"; 
    httpWebRequest.ContentType = "application/x-www-form-urlencoded"; 
    httpWebRequest.Headers.Add("Authorization", GetDevDefinedOAuthHeader(httpWebRequest, requestBody)); 
    requestXML.Append(requestBody); 
    UTF8Encoding encoding = new UTF8Encoding(); 
    byte[] content = encoding.GetBytes(requestXML.ToString()); 
    using (var stream = httpWebRequest.GetRequestStream()) 
    { 
     stream.Write(content, 0, content.Length); 
    } 
    HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse; 
    using (Stream data = httpWebResponse.GetResponseStream()) 
    { 
     Intuit.Ipp.Data.Qbo.SearchResults searchResults = (Intuit.Ipp.Data.Qbo.SearchResults)dataServices.ServiceContext.Serializer.Deserialize<Intuit.Ipp.Data.Qbo.SearchResults>(new StreamReader(data).ReadToEnd()); 
     return ((Intuit.Ipp.Data.Qbo.Invoices)searchResults.CdmCollections).Invoice.ToList(); 
    } 

} 

protected string GetDevDefinedOAuthHeader(HttpWebRequest webRequest, string requestBody) 
{ 

    OAuthConsumerContext consumerContext = new OAuthConsumerContext 
    { 
     ConsumerKey = consumerKey, 
     ConsumerSecret = consumerSecret, 
     SignatureMethod = SignatureMethod.HmacSha1, 
     UseHeaderForOAuthParameters = true 

    }; 

    consumerContext.UseHeaderForOAuthParameters = true; 

    //URIs not used - we already have Oauth tokens 
    OAuthSession oSession = new OAuthSession(consumerContext, "https://www.example.com", 
          "https://www.example.com", 
          "https://www.example.com"); 


    oSession.AccessToken = new TokenBase 
    { 
     Token = accessToken, 
     ConsumerKey = consumerKey, 
     TokenSecret = accessTokenSecret 
    }; 

    IConsumerRequest consumerRequest = oSession.Request(); 
    consumerRequest = ConsumerRequestExtensions.ForMethod(consumerRequest, webRequest.Method); 
    consumerRequest = ConsumerRequestExtensions.ForUri(consumerRequest, webRequest.RequestUri); 
    if (webRequest.Headers.Count > 0) 
    { 
     ConsumerRequestExtensions.AlterContext(consumerRequest, context => context.Headers = webRequest.Headers); 
     if (webRequest.Headers[HttpRequestHeader.ContentType] == "application/x-www-form-urlencoded") 
     { 
      Dictionary<string, string> formParameters = new Dictionary<string, string>(); 
      foreach (string formParameter in requestBody.Split('&')) 
      { 
       formParameters.Add(formParameter.Split('=')[0], formParameter.Split('=')[1]); 
      } 
      consumerRequest = consumerRequest.WithFormParameters(formParameters); 
     } 
    } 

    consumerRequest = consumerRequest.SignWithToken(); 
    return consumerRequest.Context.GenerateOAuthParametersForHeader(); 
} 

Sie können hier auf Stackoverflow meiner ursprünglichen Frage sehen: Query for All Invoices With Open Balances using QuickBooks Online (QBO) Intuit Partner Platform (IPP) DevKit.

2

Ich glaube, dass mein Problem auf eine falsche Codierung des Filters in der Signatur zurückzuführen ist. Das erklärt die 401 ungültigen Signaturfehler, die ich bekommen habe.

Ich habe ein Online-Tool verwendet, um mir die Schritte zur ordnungsgemäßen Unterzeichnung einer OAuth-Anfrage zu erklären. Während ich diese Schritte durchführte, erkannte ich, dass mein Problem bei den Schritten lag, bei denen Sie die Anforderungsparameter normalisierten und sie dann prozentual codierten. Ich habe das '=' des Filters in den Normalisierungsschritt aufgenommen, wodurch die Signatur unterbrochen wird.

http://hueniverse.com/2008/10/beginners-guide-to-oauth-part-iv-signing-requests/

Dank für jeden Eingang: Das Werkzeug, das ich verwendet, finden Sie unter.

+0

Tolles Werkzeug - Dadurch konnte ich feststellen, dass eine Abfrage, die ich gegen QBOv3 der API ausgeführt habe, nicht korrekt codiert wurde und somit meine OAuth-Signatur ungültig wurde und zu der gleichen Meldung führte. = Ausnahme beim Authentifizieren von OAuth; errorCode = 003200; statusCode = 401 Problem bei jeder Anfrage. – JaredC

Verwandte Themen