Tôi đang cố gắng gọi PayPal api từ mã của tôi. Tôi thiết lập tài khoản sandbox và nó hoạt động khi tôi sử dụng curl nhưng mã của tôi không hoạt động theo cùng một cách, thay vào đó trả lại 401 Unauthorized.Paypal REST api gọi hoạt động từ cURL nhưng không phải từ mã C#
Đây là lệnh curl như 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: Rõ ràng .Credentials
không làm các trick, thay vì thiết lập Authorization
tiêu đề bằng tay làm việc (xem code)
Dưới đây là đoạn code (tỉa về bản chất của nó):
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);
Đây là yêu cầu f đang rom bắt bởi Fiddler (thô), không có thông số cho phép đối với một số lý do:
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ó một không gian thiếu trong chấp nhận tiêu đề nhưng tôi không thể nhìn thấy bất cứ thứ gì rõ ràng. Bạn đã thử chụp hai yêu cầu để xem có gì khác biệt không, ví dụ: sử dụng Wireshark hoặc một proxy như Fiddler? – Rup
@Rup Tôi đã thử với Fiddler, vẫn gặp khó khăn trong nắm bắt được yêu cầu curl nhưng yêu cầu mã không chứa header Auth (xem cập nhật) –
Có một số thư viện HTTP ví dụ Apache sẽ không gửi thông tin đăng nhập trừ khi được yêu cầu bởi máy chủ từ xa, nhưng tôi không biết .NET cũng vậy. Hoặc ít nhất nó phải trả lời 401 cho họ. Có thể có một cách để buộc nó quá vào đối tượng yêu cầu? – Rup