1

我尝试使用 delphi 将我连接到我的条带支付测试帐户。

连接 API 在这里: Stripe connect API Curl 示例:

curl https://api.stripe.com/v1/charges \
   -u sk_test_CpkBxhx9gcmNYYQTZIXU43Bv:

我尝试使用带有 TIdSSLIOHandlerSocketOpenSSL 的 Indy TIdHTTP 组件并使用 Tstringlist 或 TIdMultipartFormDataStream 作为参数调用 post 但我总是收到响应:401 - Unauthorized

这是我的代码:

var   
   Data: TIdMultipartFormDataStream;
   https: TIdHTTP;
   ssl: TIdSSLIOHandlerSocketOpenSSL;

begin

https := TIdHTTP.Create(self);
ssl   := TIdSSLIOHandlerSocketOpenSSL.Create(Self);
https.IOHandler := ssl;

https.Request.BasicAuthentication := True;

Data := TIdMultipartFormDataStream.Create;
//Data.AddFormField('api_key', 'sk_test_CpkBxhx9gcmNYYQTZIXU43Bv');
Data.AddFormField('apikey', 'sk_test_CpkBxhx9gcmNYYQTZIXU43Bv');
https.Post('https://api.stripe.com/v1/charges', Data);
Memo1.lines.Add( https.ResponseText );
Data.Free;
end;

任何帮助或建议将不胜感激。谢谢,彼得

4

1 回答 1

2

您不得使用表单字段来传输 API 密钥。而是设置 Request.Username 属性。密码为空,因此 Request.Passwort 未使用。从链接页面上的 API 文档:

API 的身份验证通过 HTTP Basic Auth 进行。提供您的 API 密钥作为基本身份验证用户名。您无需提供密码。

此示例适用于程序文件夹中的 Indy 10.6.2 和 OpenSSL 库:

program Project31229779;

{$APPTYPE CONSOLE}

uses
  IdHTTP, SysUtils;

var
  HTTP: TIdHTTP;
begin
  HTTP := TIdHTTP.Create;
  try
    HTTP.Request.BasicAuthentication := True;
    HTTP.Request.Username := 'sk_test_CpkBxhx9gcmNYYQTZIXU43Bv';
    try
      WriteLn(HTTP.Get('https://api.stripe.com/v1/charges'));
    except
      on E: EIdHTTPProtocolException do
      begin
        WriteLn(E.Message);
        WriteLn(E.ErrorMessage);
      end;
      on E: Exception do
      begin
        WriteLn(E.Message);
      end;
    end;
  finally
    HTTP.Free;
  end;
  ReadLn;
end.

注意:您也可以在 URL 中输入用户名/密码:

HTTP.Request.BasicAuthentication := True;
try
  WriteLn(HTTP.Get('https://sk_test_CpkBxhx9gcmNYYQTZIXU43Bv:@api.stripe.com/v1/charges'));
于 2015-07-05T11:46:23.573 回答