2014-10-16 1 views
0

:사용 페이팔 REST 클라이언트 델파이 XE2 나는, 페이팔 REST 클라이언트와 인터페이스하려고 여기의 지침에 따라 오전

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; 

토큰을 받으면 지불을 할 수 있습니다. 페이팔 웹 사이트의 예를 이용하여 컬을 여기에 주어집니다 :

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 문자열을 올바르게 샘플링 했으므로 JSON 문자열을 올바르게 구성했다고 확신합니다. 또한 cURL을 사용하여 샘플을 테스트했으며 작동합니다. 내가 한 것처럼 JSON 문자열을 문자열 목록에 추가하는 것이 옳은 것인지 잘 모르겠습니다. 또한 "-d"cURL 매개 변수를 어딘가에 포함해야하는지 잘 모르겠습니다. 모든 조언을 기꺼이 받아 들일 것입니다.

답변

2

두 번째 단계에서는 TStringList을 사용하여 JSON 데이터를 게시 할 수 없습니다. 이는 게시물 application/x-www-form-urlencoded에만 적용됩니다. JSON을 게시하려면 대신 TStream을 사용해야합니다.

또한 응답을 String으로 얻으려면 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

정말 감사 레미는, 나는 그것을 시도 줄 것입니다. – Tim

관련 문제