2014-10-16 3 views
0

Я пытаюсь взаимодействовать с клиентом 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. Любые советы были бы с благодарностью получены.

ответ

2

На втором этапе вы не можете использовать TStringList для публикации данных JSON. Это работает только для application/x-www-form-urlencoded сообщений. Чтобы опубликовать JSON, вам нужно использовать TStream.

Кроме того, вам не нужно использовать TStringStream, чтобы получить ответ в виде строки. Post() может возвращать строку напрямую.

Попробуйте это:

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; 
+0

Благодаря очень Remy, я дам ему попробовать. – Tim

Смежные вопросы