【问题标题】:How to get access token from PayPal in MVC如何在 MVC 中从 PayPal 获取访问令牌
【发布时间】:2022-01-03 08:05:49
【问题描述】:

我正在尝试从 PayPal 获取访问令牌。

我已将其设置为 PayPal 中的应用程序,我可以看到我的客户 ID 和密码

我假设我不想在 javascript 前端公开我的秘密,所以我试图从 C# 获取访问代码,将令牌传递到前端,以便我可以进行 AJAX 发布/获取。

但是,它总是以未经授权的方式返回

这是我的努力

var url = "https://api.paypal.com/v1/oauth2/token";

var clientId = "myClientId";
var pwrd = "mySecret";

var client = new WebClient();
client.Credentials = new NetworkCredential(clientId, pwrd);
client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
client.Headers.Add("Accept: application/json");
var result = "";
using (var httpClient = new HttpClient())
{
    var response = await httpClient.PostAsync(url, null);
    result = response.StatusCode.ToString();
}

return View(model: result);
   

我不明白为什么,当我从我的实时应用程序中运行它时,它会失败

编辑

我换了

using (var httpClient = new HttpClient())
{
    var response = await httpClient.PostAsync(url, null);
    result = response.StatusCode.ToString();
}

var clientId = "myClientId";
var seceret = "mySecret";

var client = new HttpClient();

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
    "Basic", Convert.ToBase64String(
        System.Text.ASCIIEncoding.ASCII.GetBytes(
           $"{clientId}:{seceret}")));

 var dict = new Dictionary<string, string>();
 dict.Add("Content-Type", "application/x-www-form-urlencoded");

 var req = new HttpRequestMessage(HttpMethod.Post, url) { Content = new FormUrlEncodedContent(dict) };
 var response = await client.SendAsync(req);

同样的问题仍然存在。我得到一个 401

【问题讨论】:

  • object httpClient 对您的凭据/标头一无所知。请改用客户端。
  • 这能回答你的问题吗? Setting Authorization Header of HttpClient
  • 不,很遗憾 - 我已经走了那条路,同样的问题仍然存在@MarkusSafar。谢谢你的帮助:)

标签: c# paypal


【解决方案1】:

它永远不会授权,因为 HttpClient 变量对您的凭据一无所知。 您在 WebClient 中初始化了它,但您没有使用它。

【讨论】:

  • 我不相信 WebClient 有 post - 这是否意味着我必须使用 UploadString 作为文档显示的帖子,而不是 DownloadString
  • @MyDaftQuestions:这里已经有了答案:stackoverflow.com/questions/14627399/… 您可以只使用 httpClient 来满足您的目的,或者您也可以将UploadString 与 webClient 一起使用。但是选择一个,而不是两个。在您的代码中,客户端对 httpClient 一无所知,反之亦然。
  • 您是否建议我应该使用 HttpClient 而不是 WebClient 来获取访问令牌?
  • @MyDaftQuestions:是的,这次只需在 httpClient 中使用凭据。
  • 我更新了我的帖子 - 即使您提出了更改建议,同样的问题仍然存在 :(
【解决方案2】:

为了详细说明评论和其他答案,您在这里创建一个名为 client 的变量

var client = new WebClient();
client.Credentials = new NetworkCredential(clientId, pwrd);
client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
client.Headers.Add("Accept: application/json");

在接下来的代码中,您什么都不做 使用那个client 变量。以上内容完全被忽略,与此无关:

using (var httpClient = new HttpClient())
{
    var response = await httpClient.PostAsync(url, null);
    result = response.StatusCode.ToString();
}

return View(model: result);

因此,请使用您创建的 client 对象 - 可能使用 UploadValues 或类似的对象。

【讨论】:

  • 感谢您的帮助,我完全理解我做错了什么。但即使使用client 仍然存在未经授权的问题。
  • 如果没有看到您正在使用的完整响应和凭据,任何人都无法提供任何建议。您应该首先在沙盒模式下进行测试,而不是针对 api.paypal.com 进行实时测试
  • 我更新了我的帖子 - 即使您提出了更改建议,同样的问题仍然存在 :(
  • (1) 使用沙盒凭据对 api.sandbox.paypal.com 进行测试,(2) 如果问题仍然存在,请使用正在使用的实际凭据和实际全文更新您的帖子收到的 HTTP 响应,包括其调试 ID
猜你喜欢
  • 2017-03-22
  • 1970-01-01
  • 2018-08-04
  • 2020-10-26
  • 2019-09-09
  • 2021-11-01
  • 2017-07-30
  • 2016-09-12
  • 2016-10-05
相关资源
最近更新 更多