delphi - 在 Delphi XE2 中使用 PayPal REST 客户端

标签 delphi rest paypal indy

我正在按照此处的说明尝试与 PayPal REST 客户端交互:

https://developer.paypal.com/docs/integration/direct/make-your-first-call/

我可以通过以下代码使用 TIdHttp 组件成功获取访问 token :

http.Request.ContentType := 'application/x-www-form-urlencoded';
http.Request.Accept := 'application/json';
http.Request.AcceptLanguage := 'en_US';
http.Request.BasicAuthentication := True;
http.Request.Username := 'my paypal clientid';
http.Request.Password := 'my paypal secret';

slParameters := TStringList.Create;
Response := TStringStream.Create;
try
  //get an access token
  slParameters.Add('grant_type=client_credentials');
  http.Post('https://api.sandbox.paypal.com/v1/oauth2/token', slParameters, Response);
  json := Response.DataString;
  PayPalObj := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(json), 0) as TJSONObject;
  try
    jTokenValue := PayPalObj.Get('access_token').JsonValue;
    AccessToken := jTokenValue.Value;
    jTokenValue := PayPalObj.Get('token_type').JsonValue;
    TokenType := jTokenValue.Value;
  finally
    PayPalObj.Free;
  end;

  if TokenType <> 'Bearer' then
    Exit;

  if AccessToken = '' then
    Exit;

  ....

finally
  Response.Free;
  slParameters.Free;
end;

获得 token 后,我应该能够创建付款。在 PayPal 网站上,此处给出了使用 cURL 的示例:

https://developer.paypal.com/docs/integration/web/accept-paypal-payment/

这是我试过的:

//create a payment
PayPalObj := TJSONObject.Create;
try
  PayPalObj.AddPair(TJSONPair.Create('intent', TJSONString.Create('sale')));

  RedirectObj := TJSONObject.Create;
  try
    RedirectObj.AddPair(TJSONPair.Create('return_url', TJSONString.Create('http://blahblah.com/return')));
    RedirectObj.AddPair(TJSONPair.Create('cancel_url', TJSONString.Create('http://blahblah.com/cancel')));
  except
    RedirectObj.Free;
    Exit;
  end;

  PayerObj := TJSONObject.Create;
  try
    PayerObj.AddPair(TJSONPair.Create('payment_method', TJSONString.Create('paypal')));
  except
    PayerObj.Free;
    Exit;
  end;

  TransactionsArray := TJSONArray.Create;
  AmountObj := TJSONObject.Create;
  TransactionObj := TJSONObject.Create;
  try
    AmountObj.AddPair('total', TJSONString.Create('7.47'));
    AmountObj.AddPair('currency', TJSONString.Create('USD'));
    TransactionObj.AddPair('amount', AmountObj);
    TransactionObj.AddPair('description', TJSONString.Create('payment description'));
    TransactionsArray.Add(TransactionObj);
  except
    TransactionsArray.Free;
    AmountObj.Free;
    TransactionObj.Free;
    Exit;
  end;

  PayPalObj.AddPair(TJSONPair.Create('redirect_urls', RedirectObj));
  PayPalObj.AddPair(TJSONPair.Create('payer', PayerObj));
  PayPalObj.AddPair(TJSONPair.Create('transactions', TransactionsArray));

  slParameters.Clear;
  Response.Clear;

  http.Request.ContentType := 'application/json';
  http.Request.CustomHeaders.Clear;
  //http.Request.CustomHeaders.FoldLines := False;  have tried this with no success
  http.Request.CustomHeaders.AddValue('Authorization', Format('Bearer %s', [AccessToken]));  //token obtained from first request

  slParameters.Add(PayPalObj.ToString);
  http.Post('https://api.sandbox.paypal.com/v1/payments/payment', slParameters, Response);
  json := Response.DataString;
  ...
finally
  PayPalObj.Free;
end;

我没有收到任何回复。我确信我已经正确地构造了 JSON 字符串,因为我已经将它与示例字符串进行了仔细比较。我还使用 cURL 测试了示例 1,它确实有效。我不确定像我所做的那样将 JSON 字符串添加到字符串列表中是否正确。我也不确定是否需要在某处包含“-d”cURL 参数。如有任何建议,我们将不胜感激。

最佳答案

在第二步中,您不能使用TStringList 来发布JSON 数据。这仅适用于 application/x-www-form-urlencoded 帖子。要发布 JSON,您需要改用 TStream

此外,您不需要使用 TStringStream 来获取字符串形式的响应。 Post() 可以直接返回一个String。

试试这个:

json := http.Post('https://api.sandbox.paypal.com/v1/oauth2/token', slParameters);
...
ssJson := TStringStream.Create(PayPalObj.ToString, TEncoding.ASCII);
try
  json := http.Post('https://api.sandbox.paypal.com/v1/payments/payment', ssJson);
finally
  ssJson.Free;
end;

关于delphi - 在 Delphi XE2 中使用 PayPal REST 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26395669/

相关文章:

rest - 对于 REST API,URL 是否意味着不区分大小写?

rest - 事件溯源 - 如何处理竞争条件和 http 传递?

rest - 在 Acumatica 中使用 REST API 将数据提供程序和场景替换为代码

api - 有人在他们的网站上运行定期付款吗?最好; Paypal 接口(interface)

paypal - 如何将 paypal 循环 gem 与 Spree 集成

ios - 使用 iOS Paypal SDK 进行付款验证 - 请澄清一下

delphi - ARC : is there a memory leak in TNetEncoding. 获取Base64Encoding?

delphi - TRibbon 不显示选项卡

c++ - 将 char * 传递给 delphi dll 函数/过程

multithreading - 如何通过多线程绘画到 TBitmap