如何使用http请求获取paypal访问令牌?

如何使用http请求获取paypal访问令牌?,http,paypal,Http,Paypal,我需要将我的移动应用程序与paypal集成。为此,我选择了RESTAPI。但我无法获得访问令牌!我使用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 Fi

我需要将我的移动应用程序与paypal集成。为此,我选择了RESTAPI。但我无法获得访问令牌!我使用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
这是一具带着params的尸体

username=AWFcJ...FsdE:EFCK..Dfr43d
grant_type=client_credentials
在用户名中,我从仪表板中输入了我的客户Id和密码

回应是

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

我做错了什么?请帮帮我你好,你的方法是对的

试试这个

  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);
      }



  }
公共字符串clientId=;
公共字符串secret=;
公共字符串accessToken='';
public void accessToken()
{
字符串输入=clientId+':'+secret;
Blob myBlob=Blob.valueof(输入);
字符串paramvalue=EncodingUtil.base64Encode(myBlob);
Http=newhttp();
HttpRequest req=新的HttpRequest();
请求设置方法(“POST”);
字符串端点https://api.sandbox.paypal.com/v1/oauth2/token?grant_type=client_credentials';
请求setEndpoint(端点);
请求setHeader('Authorization'、'Basic'+参数值);
req.setHeader('Accept','application/json');
请求setHeader('content-type','application/x-www-form-urlencoded');
请求setHeader('Accept-Language','en_-US');
请求setHeader('Cache-Control','no-Cache');
请求setBody('grant_type=client_credentials');
HttpResponse res=新的HttpResponse();
res=http.send(req);
如果(res.getStatusCode()==200)
{
Map results=(Map)JSON.deserializeUntyped(res.getBody());
accessToken=(字符串)results.get('access_token');
系统调试(accessToken);
}
}

您好,您的方法是正确的

试试这个

  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);
      }



  }
公共字符串clientId=;
公共字符串secret=;
公共字符串accessToken='';
public void accessToken()
{
字符串输入=clientId+':'+secret;
Blob myBlob=Blob.valueof(输入);
字符串paramvalue=EncodingUtil.base64Encode(myBlob);
Http=newhttp();
HttpRequest req=新的HttpRequest();
请求设置方法(“POST”);
字符串端点https://api.sandbox.paypal.com/v1/oauth2/token?grant_type=client_credentials';
请求setEndpoint(端点);
请求setHeader('Authorization'、'Basic'+参数值);
req.setHeader('Accept','application/json');
请求setHeader('content-type','application/x-www-form-urlencoded');
请求setHeader('Accept-Language','en_-US');
请求setHeader('Cache-Control','no-Cache');
请求setBody('grant_type=client_credentials');
HttpResponse res=新的HttpResponse();
res=http.send(req);
如果(res.getStatusCode()==200)
{
Map results=(Map)JSON.deserializeUntyped(res.getBody());
accessToken=(字符串)results.get('access_token');
系统调试(accessToken);
}
}

您可以试试这个,
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;
    }

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

//[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));
    }
}

我还认为,如果您想通过邮递员获得代币,这可能会有所帮助,这是一个提示,您可以在中找到。您可以试试这个
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;
    }

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

//[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));
    }
}

我认为如果你想通过邮递员获得代币也会很有帮助,这是一个提示,你可以在

中找到。我认为如果你稍微解释一下你的代码,那将非常棒。为此,我使用基本身份验证,在基本身份验证中,“输入”是客户id和密码的浓缩,在它们之间是Blob.valueof()base64Encode()将使用该值将其转换为一个值,该值通过键“Authorization”传递一个带有“Basic”关键字的键值,正如您在代码中看到的那样。请告诉我,如果你有任何问题,我认为如果你稍微解释一下你的代码会很棒。为此,我使用基本身份验证,在基本身份验证中,“输入”是客户端id和密码的浓缩,在它们之间,Blob.valueof()将字符串转换为Blob并编码util.base64Encode()将使用该值将其转换为一个值,该值通过键“Authorization”传递一个带有“Basic”关键字的键值,正如您在代码中看到的那样。如果你有任何问题,请告诉我