Delphi 贝宝与德尔福使用REST API返回支付空
我尝试使用PayPalRESTAPI制作一个delphi应用程序 首先是令牌,工作正常: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
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;