Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 贝宝与德尔福使用REST API返回支付空_Delphi_Rest_Paypal_Indy - Fatal编程技术网

Delphi 贝宝与德尔福使用REST API返回支付空

Delphi 贝宝与德尔福使用REST API返回支付空,delphi,rest,paypal,indy,Delphi,Rest,Paypal,Indy,我尝试使用PayPalRESTAPI制作一个delphi应用程序 首先是令牌,工作正常: var slParameters:TStringList; Response:TStringStream; json, sTokenType:string; PayPalObj:TJSONObject; jTokenValue:TJSONValue; begin memLog.Lines.Clear; memLog.Lines.Add('TOKEN'); btnPayment.Enabl

我尝试使用PayPalRESTAPI制作一个delphi应用程序

首先是令牌,工作正常:

var
  slParameters:TStringList;
  Response:TStringStream;
  json, sTokenType:string;
  PayPalObj:TJSONObject;
  jTokenValue:TJSONValue;
begin
memLog.Lines.Clear;
memLog.Lines.Add('TOKEN');
btnPayment.Enabled := False;
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 := 'AQXYqhB1xxHcxHIg2grwyWny6VcGSJsvlMI4v1vNEPrTzbhZc4bHVEJXmvgX';
http.Request.Password := 'EE9wTBCqyKWWRRLU5otmzvE407va_NitLwnegxKwtt_D9RmmXbh7_kePLN3I';

slParameters := TStringList.Create;
Response := TStringStream.Create;
try
  //get an access token
  slParameters.Add('grant_type=client_credentials');
  json := http.Post('https://api.sandbox.paypal.com/v1/oauth2/token', slParameters);
  //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;
    sTokenType := jTokenValue.Value;

    Memo1.Lines.Clear;
    Memo1.Lines.Text := PayPalObj.ToString;
    Memo1.Lines.Add('Size: ' + IntToStr(PayPalObj.EstimatedByteSize));
  finally
    PayPalObj.Free;
  end;

  if sTokenType <> 'Bearer' then
    Exit;

  if AccessToken = '' then
    Exit;

  lblToken.Caption := Format('Token: %s - Type: %s', [AccessToken, sTokenType]);
  btnPayment.Enabled := True;
finally
  Response.Free;
  slParameters.Free;
end;end;

procedure TfrmPayPalREST.httpAuthorization(Sender: TObject;
  Authentication: TIdAuthentication; var Handled: Boolean);
begin
memLog.Lines.Add('*** Authorization ***');
memLog.Lines.Add(Authentication.ToString);
memLog.Lines.Add(' ');
有人知道为什么吗?谢谢你的帮助

使用Delphi XE6和Indy,顺便说一下,这是一个android应用程序

附:我使用以下问题:
但是没有任何答案

您是否验证了输入的JSON一开始是正确的?你有没有试着联系贝宝寻求帮助?您正在使用另一个问题中的其他人的代码,没有任何迹象表明您是否对其进行了任何更改,或者实际的响应数据是什么样子的。您好,我与developer.paypal.com上的代码进行了比较,并且具有相同的格式。我复制了这个页面的相同json,得到了相同的结果,一个空白json。我用的是curl:On developer.paypal.com上的这个论坛来获取帮助,或者在支持页面上设置一条消息。使用相同的数据和演示。另一个问题是非活动的,没有其他答案,谢谢你的回答。完整响应实际上是什么样子的?您好,就像这个JSON=''Y检查,响应代码是401,我认为问题出在下面几行:Authorization:=Format('承载%s',[AccessToken]);http.Request.CustomHeaders.AddValue('Authorization',Authorization)//从第一个请求中获得的令牌,其中AccessToken在firs函数中获得,并保存在表单的私有字段中。ResponseCode 401是请求授权的服务器。整个反应是什么样的?尤其是
WWW-Authenticate
头。是否触发了选择授权和授权事件?另外,尝试使用
CustomHeaders.Values['Authorization']:=Authorization
而不是
CustomHeaders.AddValue('Authorization',Authorization)
,并确保
Request.BasicAuthentication
为false。
var
  PayPalObj :TJSONObject;
  PayPalObj2 :TJSONObject;
  RedirectObj :TJSONObject;
  PayerObj :TJSONObject;

  TransactionsArray : TJSONArray;
  AmountObj : TJSONObject;
  TransactionObj : TJSONObject;
  FundingArray : TJSONArray;
  CreditCardObj : TJSONObject;

  ssJson : TStringStream;
  json, Authorization:string;
begin
//create a payment
memLog.Lines.Add('PAYMENT');
PayPalObj := TJSONObject.Create;
try
  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('credit_card')));

    CreditCardObj := TJSONObject.Create;
    CreditCardObj.AddPair('number', '5500005555555559');
    CreditCardObj.AddPair('type', 'mastercard');
    CreditCardObj.AddPair('expire_month', '12');
    CreditCardObj.AddPair('expire_year', '2018');
    CreditCardObj.AddPair('cvv2', '111');
    CreditCardObj.AddPair('first_name', 'yo');
    CreditCardObj.AddPair('last_name', 'tu');

    FundingArray := TJSONArray.Create;
    FundingArray.Add(CreditCardObj);

    PayerObj.AddPair(TJSONPair.Create('funding_instruments', FundingArray));
  except
    PayerObj.Free;
    Exit;
  end;

  TransactionsArray := TJSONArray.Create;
  AmountObj := TJSONObject.Create;
  TransactionObj := TJSONObject.Create;
  try
    AmountObj.AddPair('currency', TJSONString.Create('USD'));
    AmountObj.AddPair('total', TJSONString.Create('1'));
    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('intent', TJSONString.Create('sale')));
  PayPalObj.AddPair(TJSONPair.Create('payer', PayerObj));
  PayPalObj.AddPair(TJSONPair.Create('transactions', TransactionsArray));
  //PayPalObj.AddPair(TJSONPair.Create('redirect_urls', RedirectObj));

  Memo1.Lines.Add(' ');
  Memo1.Lines.Add(PayPalObj.ToString);
  Memo1.Lines.Add('Size: ' + IntToStr(PayPalObj.EstimatedByteSize));

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

  Memo1.Lines.Add(' ');
  Memo1.Lines.Add(http.Request.CustomHeaders.Text);
  ssJson := TStringStream.Create(PayPalObj.ToString, TEncoding.ASCII);
  try
    json := http.Post('https://api.sandbox.paypal.com/v1/payments/payment', ssJson);
    lblPayment.Caption := json;

    PayPalObj2 := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(json), 0) as TJSONObject;
    if Assigned(PayPalObj2) then
      try
        Memo1.Lines.Add(' ');
        Memo1.Lines.Add(PayPalObj2.ToString);
      finally
        PayPalObj2.Free;
      end;
  finally
    ssJson.Free;
  end;
finally
  PayPalObj.Free;
end;