从C#中使用Paypal REST API

Ona*_*gac 0 c# paypal paypal-sandbox

我试图根据他们的cURL示例使用REST API进行简单的测试:https: //developer.paypal.com/docs/integration/direct/make-your-first-call/

curl -v https://api.sandbox.paypal.com/v1/oauth2/token \
-H "Accept: application/json" \
-H "Accept-Language: en_US" \
-u "EOJ2S-Z6OoN_le_KS1d75wsZ6y0SFdVsY9183IvxFyZp:EClusMEUk8e9ihI7ZdVLF5cZ6y0SFdVsY9183IvxFyZp" \
-d "grant_type=client_credentials"
Run Code Online (Sandbox Code Playgroud)

我的C#:

var h = new HttpClientHandler();
h.Credentials = new NetworkCredential("client_id", "secret");
var client = new HttpClient();

client.BaseAddress = new Uri("https://api.sandbox.paypal.com/v1/oauth2/token");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("Accept-Language", "en_US");

var requestContent = new FormUrlEncodedContent(new[] {
     new KeyValuePair<string, string>("grant_type", "client_credentials"),
});

HttpRequestMessage req = new HttpRequestMessage(System.Net.Http.HttpMethod.Post, "https://api.sandbox.paypal.com/v1/oauth2/token");

req.Content = new StringContent("grant_type=client_credentials");

var r = client.SendAsync(req).Result;
Run Code Online (Sandbox Code Playgroud)

错误返回:

StatusCode: 415, ReasonPhrase: 'Unsupported Media Type', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { PROXY_SERVER_INFO: host=slcsbjava2.slc.paypal.com;threadId=13873 Paypal-Debug-Id: 6bc39da1e021d SERVER_INFO: identitysecuretokenserv:v1.oauth2.token&CalThreadId=351&TopLevelTxnStartTime=14649fa185e&Host=slcsbidensectoken501.slc.paypal.com&pid=25122 CORRELATION-ID: 6bc39da1e021d Transfer-Encoding: chunked Date: Thu, 29 May 2014 21:54:25 GMT Server: Apache-Coyote/1.1 }
Run Code Online (Sandbox Code Playgroud)

我需要更改什么来修复我的代码?

小智 7

我知道这个问题已经过了一年多了,但我想我会发布我在这个主题上发现的内容,因为那里没有多少.在弄乱了这个问题的时间比我想承认的要长得多,我终于开始工作了.问题中发布的内容与我的答案中的内容之间的最大区别在于身份验证以及发布到正文(正文的通知,而不是使用StringContent,我正在使用FormUrlEncodedContent - 这是在问题,但后来从未使用过)

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

using (HttpClient client = new HttpClient())
{
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    client.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue("en_US"));

    var clientId = "<client_id>";
    var clientSecret = "<client_secret>";
    var bytes = Encoding.UTF8.GetBytes($"{clientId}:{clientSecret}");

    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(bytes));

    var keyValues = new List<KeyValuePair<string, string>>();
    keyValues.Add(new KeyValuePair<string, string>("grant_type", "client_credentials"));
    var responseMessage = await client.PostAsync("https://api.sandbox.paypal.com/v1/oauth2/token", new FormUrlEncodedContent(keyValues));
    viewModel.ResponseMessage = await responseMessage.Content.ReadAsStringAsync();
}
Run Code Online (Sandbox Code Playgroud)

执行此操作后,我能够在responseMessage中获取json响应,然后为我的代码获取持有者令牌.