【问题标题】:How to get a paypal access token using http request?如何使用 http 请求获取贝宝访问令牌?
【发布时间】:2015-11-07 11:47:30
【问题描述】:

我需要将我的移动应用与贝宝集成。为此,我选择了 Rest API。但我无法获得访问令牌!我使用 Mozilla Firefox 只是为了测试网络操作。这是我的要求

https://api.sandbox.paypal.com/v1/oauth2/token

这里是标题

ost: api.sandbox.paypal.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:42.0) Gecko/20100101 Firefox/42.0
Accept: application/json
Accept-Language: en-US
Accept-Encoding: gzip, deflate
Cache-Control: max-age=0, no-cache
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Pragma: no-cache
Referer: https://www.mozilla.org/ru/firefox/42.0/whatsnew/?oldversion=41.0.2
Content-Length: 172
Origin: https://www.mozilla.org
Connection: keep-alive

这里是带有参数的主体

username=AWFcJ...FsdE:EFCK..Dfr43d
grant_type=client_credentials

在用户名中,我从仪表板输入了我的客户 ID 和密码。

回应是

400 Bad request. 
error:invalid_client
eror_description:Client credentials are missing

我做错了什么?请帮帮我

【问题讨论】:

    标签: http paypal


    【解决方案1】:

    你好,你的方法是对的

    试试这个

      public string clientId=<your client id>;
      public string secret=<your secret>;
      public string accessToken='';
    
      public void accessToken()
      {
          string input=clientId+':'+secret;
          Blob myBlob = Blob.valueof(input);
          string paramvalue = EncodingUtil.base64Encode(myBlob);
          Http http=new Http();
          HttpRequest req=new HttpRequest();
          req.setMethod('POST');
          string endpoint='https://api.sandbox.paypal.com/v1/oauth2/token?grant_type=client_credentials';
          req.setEndpoint(endpoint);
          req.setHeader('Authorization','Basic '+paramvalue);
          req.setHeader('Accept','application/json');
          req.setHeader('content-type','application/x-www-form-urlencoded');
          req.setHeader('Accept-Language','en_US');
          req.setHeader('Cache-Control','no-cache');
          req.setBody('grant_type=client_credentials');
          HttpResponse res = new HttpResponse();
          res = http.send(req);
          if(res.getStatusCode()==200)
          {
               Map<String, Object> results = (Map<String, Object>) JSON.deserializeUntyped(res.getBody());
               accessToken = (string)results.get('access_token');
               system.debug(accessToken);
          }
    
    
    
      }
    

    【讨论】:

    • 我认为如果你能稍微解释一下你的代码会很棒。
    • 为此,我使用基本身份验证,在基本身份验证中,这里的“输入”是客户端 ID 和机密的连接以及它们之间的 ':',Blob.valueof() 会将字符串转换为 blob 和 EncodingUtil .base64Encode() 将使用该值将其转换为一个值,该值通过键“授权”中的“基本”关键字传递一个键值,正如您在代码中看到的那样。如果你有任何问题,请告诉我
    【解决方案2】:

    您可以试试这个,PayPalConfigDto 包含一些您需要提供的基本内容。请记住,这些值应存储在您应用的应用设置文件中,这只是一个简单的示例:

    public class PayPalConfigDto
    {
        public string BaseUrl { get; set; }
    
        public string TokenUrl => $"{BaseUrl}/v1/oauth2/token";
    
        public string ClientId { get; set; }
    
        public string ClientSecret { get; set; }
    }
    

    PayPal API 响应对象:

    public class TokenDto
    {
        public string Scope { get; set; }
    
        public string Access_token { get; set; }
    
        public string Token_type { get; set; }
    
        public string App_id { get; set; }
    
        public string Expires_in { get; set; }
    
        public string Nonce { get; set; }
    }
    

    PayPalContext 类:

    public class PayPalContext
    {
        private HttpClient _httpClient;
    
        private PayPalConfigDto _payPalConfig;
    
        public PayPalContext(HttpClient httpClient, PayPalConfigDto payPalConfig)
        {
            _httpClient = httpClient;
            _payPalConfig = payPalConfig;
        }
    
        public virtual async Task<string> GetToken()
        {
            var url = $"{_payPalConfig.TokenUrl}?grant_type=client_credentials";
            _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                Convert.ToBase64String(Encoding.ASCII.GetBytes($"{_payPalConfig.ClientId}:{_payPalConfig.ClientSecret}")));
    
            var responseTask = _httpClient.PostAsync(url, null);
            responseTask.Wait();
            var response = responseTask.Result;
    
            var result = await response.Content.ReadAsStringAsync();
            if (!response.IsSuccessStatusCode)
            {
                var errorMessage = response.ToString();
                throw new Exception($"An issue occurred during the trial of getting PayPal token. {errorMessage}");
            }
            var tokenDto = JsonConvert.DeserializeObject<TokenDto>(result);
    
            return tokenDto.Access_token;
        }
    
    }
    

    GetToken 方法需要对凭据进行编码并基于this answer 你可以很容易地做到这一点

    new AuthenticationHeaderValue("Basic",
                Convert.ToBase64String(Encoding.ASCII.GetBytes($"{_payPalConfig.ClientId}:{_payPalConfig.ClientSecret}")));
    

    要测试所有内容,您只需创建一个简单的测试类,例如:

    //[Ignore]
    public class PayPalContextTests
    {
        readonly PayPalConfigDto PayPalConfig = new PayPalConfigDto()
        {
            BaseUrl = "https://api.sandbox.paypal.com",
            ClientId = "your ClientId",
            ClientSecret = "your ClientSecret"
        };
    
        [Test]
        public async Task Should_return_valid_token()
        {
            var httpClient = new HttpClient();           
            var context = new PayPalContext(httpClient, PayPalConfig);
            var token = await context.GetToken();
            Assert.IsFalse(string.IsNullOrEmpty(token));
        }
    }
    

    如果您想通过 Postman 获取令牌,我还认为 this 可能会有所帮助,这是您可以在 the main PayPal documentation 中找到的内容的提示

    【讨论】:

      猜你喜欢
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 2018-02-01
      • 1970-01-01
      • 2013-12-01
      • 2021-11-10
      • 2015-02-13
      相关资源
      最近更新 更多