Я пытаюсь взаимодействовать с клиентом PayPal REST, следуя инструкциям здесь:Использование PayPal REST клиент с Delphi XE2
https://developer.paypal.com/docs/integration/direct/make-your-first-call/
Я могу успешно получить маркер доступа с использованием компонента TIdHTTP с этим кодом:
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;
Как только у меня есть токен, я должен быть в состоянии создать платеж. На сайте 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, и он работает. Я не уверен, правильно ли добавить строку JSON в список строк, как я уже сделал. Я также не уверен, нужно ли где-нибудь включать параметр -d "cURL. Любые советы были бы с благодарностью получены.
Благодаря очень Remy, я дам ему попробовать. – Tim