8

Ho avuto successo la creazione di oggetti con il post e l'applicazione Content-Type/xmlinterrogazione QuickBooks in linea con filtro ritorna ogni volta 401

Ho anche avuto successo l'esecuzione di query utilizzando l'applicazione Content-Type/x-www-form- urlencoded con un corpo di richiesta vuoto che restituisce tutto il tipo di oggetto a seconda dell'URI specificato.

Posso anche ottenere lo stesso funzionamento con qualcosa come PageNum = 1 & ResultsPerPage = 1 nel corpo della richiesta e ho capito come incorporarlo nella firma in modo da ottenere una risposta valida.

Tuttavia, indipendentemente dal modo in cui lo formatto, non riesco a ottenere nulla di diverso da una risposta 401 quando cerco di utilizzare un filtro (qualcosa di base come Filter = FAMILYNAME: EQUALS: Doe). Ho letto le specifiche di OAuth Core 1.0 Revision A su come tutti i nomi e i valori dei parametri sono sfuggiti utilizzando la codifica percentuale [RFC3986]. Tuttavia mi sento come se mi mancasse un passaggio o la formattazione in modo errato. Ho visto informazioni incoerenti nella mia ricerca nei forum di Intuit su quale sia esattamente il formato corretto.

Qualsiasi aiuto su questo sarebbe molto apprezzato. Ho lottato con questo per una buona settimana ora.

La risposta che ottengo quando si tenta di utilizzare un filtro è: Stato HTTP 401 - messaggio = Eccezione di autenticazione OAuth; errorCode = 003.200; statusCode = 401

---- ---- Aggiornamento

sto sto vedendo lo stesso errore quando provo ad utilizzare i filtri con i nuovi IPP Developer Tools - IPP API Explorer. Sto usando IDS V2 QBO API Explorer. Sono in grado di utilizzare questo strumento per recuperare tutti i messaggi e la risposta mostra tutti i miei clienti, ma quando provo a utilizzare un filtro ottengo: Errore server 401 - Non autorizzato: accesso negato a causa di credenziali non valide. Non si dispone dell'autorizzazione per visualizzare questa directory o pagina utilizzando le credenziali fornite.

Qualsiasi idea? Se ricevo lo stesso errore dallo strumento API Explorer, mi viene da pensare che il problema sia qualcosa di completamente diverso.

---- ---- aggiornamento finale

ho finalmente avuto successo con filtri e credo di avere a capire che cosa il mio problema era. Ho sempre avuto il sospetto di essere in grado di ottenere query con paginazione come "PageNum = 1 & ResultsPerPage = 1" per funzionare, ma non è stato possibile ottenere qualcosa come "Filter = FAMILYNAME: EQUALS: Doe". Sospettavo che ci fosse un problema con lo spazio bianco nel formato del filtro. Ciò che mi ha impedito di rintracciarlo prima era che non riuscivo a far funzionare i filtri in IDS V2 QBO API Explorer. Questo mi ha fatto sospettare che stava succedendo qualcos'altro. Ho deciso di ignorare l'API Explorer tutti insieme e concentrarsi sul motivo per cui avrei potuto farlo funzionare in un modo, ma non nell'altro.

Credo che il mio problema sia dovuto alla codifica impropria del valore del filtro nella firma. Ciò spiega i 401 errori di firma non valida che stavo ottenendo.

"Filtro = Nome: UGUALI: Daina" diventa "Filtro = Nome% 20% 3AEQUALS% 20% 3ADoe" dopo la normalizzazione.

Codifica percentuale che dovrebbe fornire "Filtro% 3DName% 2520% 253AEQUALS% 2520% 253ADoe".

In sostanza è necessario "raddoppiare" lo spazio e i due punti, ma non il segno di uguale.Ho provato molte permutazioni per eseguire la codifica, ma credo che il mio errore fosse che non ero una codifica "doppia", o quando stavo eseguendo una doppia codifica includevo il segno "=". In entrambi i casi si spezza la tua firma. Grazie per l'input di tutti.

+0

Sembra stupido, ma hai provato a sostituire gli spazi con% 20? – armani

+0

Sto utilizzando una funzione per eseguire la codifica RFC3986 per me, ma ho anche provato a eseguire manualmente la codifica e pochi altri metodi per eseguire la codifica. Grazie per l'input. – JoshASI

+0

complimenti a te per aver creato le tue firme OAuth ... Sono stato lì roba che mi fa impazzire –

risposta

1

Ottieni un 401 con la stessa richiesta in Esplora API?

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

Inoltre, si sta utilizzando l'URL di base statica o il recupero è in fase di esecuzione?

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

Se si utilizza l'URL di base statica, prova a passare a l'URL di base di runtime per vedere se è ancora ottenere l'errore.

+0

Grazie per il link al nuovo strumento di sviluppo IPP. È molto utile Tuttavia sto ottenendo risultati simili usando questo, anche se ho avuto una risposta leggermente diversa. Ho avuto successo con il recupero di tutti con una richiesta di corpo vuoto. Tuttavia, quando provo a inserire un filtro nel corpo, ottengo la risposta: 401 - Non autorizzato: accesso negato a causa di credenziali non valide. Non si dispone dell'autorizzazione per visualizzare questa directory o pagina utilizzando le credenziali fornite. – JoshASI

+0

Sto usando l'URL di base statico. Vedrò di passare all'URL di base del runtime e pubblicare i miei risultati. Grazie. – JoshASI

+0

Sto ancora utilizzando l'URL di base statico. Tuttavia, sono preoccupato che non riesca a far funzionare i filtri in Explorer API dello strumento di sviluppo IPP. Utilizzando l'API Explorer di QBO IDS V2 posso ottenerlo per recuperare tutti i clienti lasciando vuoto il corpo della richiesta. Tuttavia, se provo a inserire un filtro come "Filter = FAMILYNAME: EQUALS: Doe" ottengo il 401 - Non autorizzato: accesso negato a causa di un errore di credenziali non valido. Questo è lo stesso comportamento che vedo quando provo a utilizzare i filtri tramite le chiamate POST del mio software.Sto iniziando a sospettare che ci sia qualcos'altro qui. Qualcuno ha qualche idea? – JoshASI

1

peterl ha risposto a una delle mie domande qui che potrebbero anche rispondere alle tue. Stavo provando a mettere i filtri nel corpo quando avrebbero dovuto entrare nell'intestazione. Ecco un esempio di codice di peterl per ottenere tutte le fatture non pagate (saldo aperto superiore a 0,00) per un determinato cliente.

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(); 
} 

È anche possibile vedere la mia domanda originale qui su StackOverflow: Query for All Invoices With Open Balances using QuickBooks Online (QBO) Intuit Partner Platform (IPP) DevKit.

2

Credo che il mio problema sia dovuto alla codifica impropria del valore del filtro nella firma. Ciò spiega i 401 errori di firma non valida che stavo ottenendo.

Ho utilizzato uno strumento online per eseguire le operazioni necessarie per firmare correttamente una richiesta Oauth. Passando attraverso questi passaggi mi sono reso conto che il mio problema era con i passaggi in cui normalizzi i parametri della richiesta e poi li codifica in percentuale. Stavo includendo il '=' del filtro nella fase di normalizzazione, che spezza la tua firma. Lo strumento che ho usato sono disponibili all'indirizzo:

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

Grazie per l'input di tutti.

+0

Grande strumento - utilizzandolo sono stato in grado di scoprire che una query che stavo eseguendo contro QBOv3 dell'API non era codificata correttamente e pertanto rendeva la mia firma OAuth non valida e risultante nello stesso messaggio = Eccezione che autentica OAuth; errorCode = 003.200; statusCode = 401 problemi su ogni richiesta. – JaredC

Problemi correlati