Sto provando a chiamare Paypal api dal mio codice. Ho configurato l'account sandbox e funziona quando uso curl, ma il mio codice non funziona allo stesso modo, restituendo invece 401 Non autorizzato.Paypal REST la chiamata api funziona da cURL ma non dal codice C#
Ecco il comando di arricciatura come documented by Paypal
curl https://api.sandbox.paypal.com/v1/oauth2/token -H "Accept: application/json" -H "Accept-Language: en_US" -u "A****:E****" -d "grant_type=client_credentials"
UPDATE: A quanto pare il .Credentials
non fa il trucco, invece impostazione Authorization
intestazione lavora manualmente (vedi codice)
Ecco il codice (rifilato alla sua essenza):
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://api.sandbox.paypal.com/v1/oauth2/token");
request.Method = "POST";
request.Accept = "application/json";
request.Headers.Add("Accept-Language:en_US")
// this doesn't work:
**request.Credentials = new NetworkCredential("A****", "E****");**
// DO THIS INSTEAD
**string authInfo = Convert.ToBase64String(System.Text.Encoding.Default.GetBytes("A****:E****"));**
**request.Headers["Authorization"] = "Basic " + authInfo;**
using (StreamWriter swt = new StreamWriter(request.GetRequestStream()))
{
swt.Write("grant_type=client_credentials");
}
request.BeginGetResponse((r) =>
{
try
{
HttpWebResponse response = request.EndGetResponse(r) as HttpWebResponse; // Exception here
....
} catch (Exception x) { .... } // log the exception - 401 Unauthorized
}, null);
Questa è la richiesta f Codice rom catturato da Fiddler (grezzo), non ci sono parametri di autorizzazione per qualche motivo:
POST https://api.sandbox.paypal.com/v1/oauth2/token HTTP/1.1
Accept: application/json
Accept-Language: en_US
Host: api.sandbox.paypal.com
Content-Length: 29
Expect: 100-continue
Connection: Keep-Alive
grant_type=client_credentials
C'è uno spazio mancante nell'intestazione accettare, ma non riesco a vedere qualsiasi altra cosa ovvia. Hai provato a catturare le due richieste per vedere cosa è diverso, ad es. usando wireshark o un proxy come Fiddler? – Rup
@Rup Ho provato con Fiddler, avendo ancora problemi a catturare la richiesta di arricciatura ma la richiesta di codice non contiene le intestazioni Auth (vedi aggiornamento) –
Sì alcune librerie HTTP, ad es. Apache non invierà le credenziali a meno che non le venga richiesto dal server remoto, ma non sapevo che anche .NET lo fosse. O almeno dovrebbe rispondere al 401 con loro. Potrebbe esserci un modo per forzarlo anche sull'oggetto richiesta? – Rup