Exemplo completo do PayPal Java SDK – Como invocar a API REST de autorização do PayPal usando o Java Client?
Publicados: 2019-03-18 PayPal
é um dos melhores serviços de transferência de Payment
online que existe. Não há dúvida de que está crescendo dia a dia com números loucos.
Pessoalmente, tenho experiência prática com as PayPal Java Developer APIs
e gostaria de compartilhar minha experiência com todos os meus leitores do Crunchify.
Neste tutorial, usaremos a versão mais recente do PayPal Java SDK, que é 1.14.0
.
Aqui está uma dependência do maven para você adicionar ao seu projeto Java Eclipse.
1 2 3 4 5 |
< dependency > < groupId > com . paypal . sdk < / groupId > < artifactId > rest - api - sdk < / artifactId > < version > LATEST < / version > < / dependency > |
Depois de adicionar as dependências maven do PayPal ao seu projeto Java, você as verá em seu laptop/desktop.
Objetivo deste tutorial
- Usando as APIs do PayPal, você pode
put hold
a conta do seu cliente - Da mesma forma que você pode
capture money
imediatamente para sua compra - Você pode
refund
seu cliente usando a API - Além disso,
void any hold
que você tenha colocado em sua conta antes - Existem etapas simples pelas quais você pode executar todas as operações acima e é isso que faremos neste tutorial. Principalmente vamos colocar HOLD na conta do cliente.
O que eu preciso?
Você precisa de uma conta do PayPal. Siga os passos abaixo:
- Criar conta
official PayPal
- Faça login no portal do desenvolvedor do PayPal usando este link: https://developer.paypal.com/developer/applications
- Crie um novo aplicativo usando este link: https://developer.paypal.com/developer/applications/create
- Obtenha
ClientID
eClientSecret
que precisamos em nosso programa para gerarpaypalContext
.
Uma vez que você tenha ClientID e ClientSecret, a próxima coisa é começar a escrever o programa Java crunchifyCapturePayPalAPI.java
Aqui está uma lógica completa para este programa:
- Criar objeto
Payer
e definir PaymentMethod - Defina
RedirectUrls
e defina cancelURL e returnURL - Definir
Details
e adicionar detalhes de pagamento - Definir
Amount
- Definir
Transaction
- Adicione detalhes de pagamento e defina a intenção para
authorize
- Crie APIContext passando o
clientID
,clientSecret
emode
- Crie o objeto
Payment
e obtenha o paymentID - Definir
payerID
para o objeto PaymentExecution -
Execute Payment
e obtenha a autorização
Código completo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
package crunchify . com . paypal . sdk ; import java . util . ArrayList ; import java . util . List ; import com . paypal . api . payments . Amount ; import com . paypal . api . payments . Authorization ; import com . paypal . api . payments . Details ; import com . paypal . api . payments . Links ; import com . paypal . api . payments . Payer ; import com . paypal . api . payments . Payment ; import com . paypal . api . payments . PaymentExecution ; import com . paypal . api . payments . RedirectUrls ; import com . paypal . api . payments . Transaction ; import com . paypal . base . rest . APIContext ; import com . paypal . base . rest . PayPalRESTException ; /** * @author Crunchify.com * Version: 1.1.0 * */ public class CrunchifyPayPalSDKTutorial { private static String crunchifyID = "<!---- Add your clientID Key here ---->" ; private static String crunchifySecret = "<!---- Add your clientSecret Key here ---->" ; private static String executionMode = "sandbox" ; // sandbox or production public static void main ( String args [ ] ) { CrunchifyPayPalSDKTutorial crunchifyObj = new CrunchifyPayPalSDKTutorial ( ) ; // How to capture PayPal Payment using Java SDK? doCapture() PayPal SDK call. crunchifyObj . crunchifyCapturePayPalAPI ( ) ; } // This is simple API call which will capture a specified amount for any given // Payer or User public void crunchifyCapturePayPalAPI ( ) { /* * Flow would look like this: * 1. Create Payer object and set PaymentMethod * 2. Set RedirectUrls and set cancelURL and returnURL * 3. Set Details and Add PaymentDetails * 4. Set Amount * 5. Set Transaction * 6. Add Payment Details and set Intent to "authorize" * 7. Create APIContext by passing the clientID, secret and mode * 8. Create Payment object and get paymentID * 9. Set payerID to PaymentExecution object * 10. Execute Payment and get Authorization * */ Payer crunchifyPayer = new Payer ( ) ; crunchifyPayer . setPaymentMethod ( "paypal" ) ; // Redirect URLs RedirectUrls crunchifyRedirectUrls = new RedirectUrls ( ) ; crunchifyRedirectUrls . setCancelUrl ( "http://localhost:3000/crunchifyCancel" ) ; crunchifyRedirectUrls . setReturnUrl ( "http://localhost:3000/crunchifyReturn" ) ; // Set Payment Details Object Details crunchifyDetails = new Details ( ) ; crunchifyDetails . setShipping ( "2.22" ) ; crunchifyDetails . setSubtotal ( "3.33" ) ; crunchifyDetails . setTax ( "1.11" ) ; // Set Payment amount Amount crunchifyAmount = new Amount ( ) ; crunchifyAmount . setCurrency ( "USD" ) ; crunchifyAmount . setTotal ( "6.66" ) ; crunchifyAmount . setDetails ( crunchifyDetails ) ; // Set Transaction information Transaction crunchifyTransaction = new Transaction ( ) ; crunchifyTransaction . setAmount ( crunchifyAmount ) ; crunchifyTransaction . setDescription ( "Crunchify Tutorial: How to Invoke PayPal REST API using Java Client?" ) ; List < Transaction > crunchifyTransactions = new ArrayList < Transaction > ( ) ; crunchifyTransactions . add ( crunchifyTransaction ) ; // Add Payment details Payment crunchifyPayment = new Payment ( ) ; // Set Payment intent to authorize crunchifyPayment . setIntent ( "authorize" ) ; crunchifyPayment . setPayer ( crunchifyPayer ) ; crunchifyPayment . setTransactions ( crunchifyTransactions ) ; crunchifyPayment . setRedirectUrls ( crunchifyRedirectUrls ) ; // Pass the clientID, secret and mode. The easiest, and most widely used option. APIContext crunchifyapiContext = new APIContext ( crunchifyID , crunchifySecret , executionMode ) ; try { Payment myPayment = crunchifyPayment . create ( crunchifyapiContext ) ; System . out . println ( "createdPayment Obejct Details ==> " + myPayment . toString ( ) ) ; // Identifier of the payment resource created crunchifyPayment . setId ( myPayment . getId ( ) ) ; PaymentExecution crunchifyPaymentExecution = new PaymentExecution ( ) ; // Set your PayerID. The ID of the Payer, passed in the `return_url` by PayPal. crunchifyPaymentExecution . setPayerId ( "<!---- Add your PayerID here ---->" ) ; // This call will fail as user has to access Payment on UI. Programmatically // there is no way you can get Payer's consent. Payment createdAuthPayment = crunchifyPayment . execute ( crunchifyapiContext , crunchifyPaymentExecution ) ; // Transactional details including the amount and item details. Authorization crunchifyAuthorization = createdAuthPayment . getTransactions ( ) . get ( 0 ) . getRelatedResources ( ) . get ( 0 ) . getAuthorization ( ) ; log ( "Here is your Authorization ID" + crunchifyAuthorization . getId ( ) ) ; } catch ( PayPalRESTException e ) { // The "standard" error output stream. This stream is already open and ready to // accept output data. System . err . println ( e . getDetails ( ) ) ; } } private void log ( String string ) { System . out . println ( string ) ; } } |
Saída do console do Eclipse:
Por padrão, o SDK do PayPal habilita o modo DEBUG e, portanto, registra cada solicitação e resposta no Eclipse Console.
Para obter informações detalhadas, mantive o modo DEBUG ativado e forneci o resultado detalhado de nossa chamada getAuthorization aqui.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
13 : 22 : 28.013 [ main ] DEBUG com . paypal . base . ConfigManager - sdk_config . properties not present . Skipping . . . 13 : 22 : 28.212 [ main ] DEBUG com . paypal . base . rest . OAuthTokenCredential - request header : { Authorization = Basic QVNuZG9aaEdGOEg1MFFQSWw5TGl0elhwSDVYTW16YlBwZmxJREFJOGVjUWVwdlJyWVQ4UnBfZUpNQmh1dHJVUHdaZU9CVGJUOE1GRksdfgsdfgsdfg3Q1ZLd0NzZTllRnBIZTNNNWpOR1liNHVxZ3BrNDNFVmFXR2hHNXR2Tk1na1IyZkZMUWdTUmRFY3Q3cG8 = , Accept = application / json , User - Agent = PayPalSDK / PayPal - Java - SDK 1.14.0 ( v = 11 ; vendor = Oracle Corporation ; bit = 64 ; os = Mac_OS_X 10.14.1 ) , Content - Type = application / x - www - form - urlencoded } 13 : 22 : 28.212 [ main ] DEBUG com . paypal . base . rest . OAuthTokenCredential - request body : grant_type = client_credentials 13 : 22 : 28.213 [ main ] DEBUG com . paypal . base . HttpConnection - curl command : curl -- verbose -- request POST 'https://api.sandbox.paypal.com/v1/oauth2/token' \ -- header "Authorization:Basic QVNuZG9aaEdGOEg1MFFQSWw5TGl0elhwSDVYTW16YlBwZmxJREFJOGVjUasdfasdflITlhSZ0xVMGhiOHhpa0M3Q1ZLd0NzZTllRnBIZTNNNWpOR1liNHVxZ3BrNDNFVmFXR2hHNXR2Tk1na1IyZkZMUWdTUmRFY3Q3cG8=" \ -- header "Accept:application/json" \ -- header "User-Agent:PayPalSDK/PayPal-Java-SDK 1.14.0 (v=11; vendor=Oracle Corporation; bit=64; os=Mac_OS_X 10.14.1)" \ -- header "Content-Type:application/x-www-form-urlencoded" \ -- data 'grant_type=client_credentials' 13 : 22 : 28.810 [ main ] DEBUG com . paypal . base . rest . OAuthTokenCredential - response header : { paypal - debug - id = [ 961e2e4122ac1 ] , null = [ HTTP / 1.1 200 OK ] , Paypal - Debug - Id = [ 961e2e4122ac1 ] , Server = [ Apache ] , Connection = [ close ] , Vary = [ Authorization ] , Set - Cookie = [ X - PP - SILOVER = ; Expires = Thu , 01 Jan 1970 00 : 00 : 01 GMT , X - PP - SILOVER = name % 3DSANDBOX3.API.1 % 26silo_version % 3D1880 % 26app % 3Dapiplatformproxyserv % 26TIME % 3D4098358363 % 26HTTP_X_PP_AZ_LOCATOR % 3Dsandbox.slc ; Expires = Mon , 26 Nov 2018 19 : 52 : 28 GMT ; domain = . paypal . com ; path =/ ; Secure ; HttpOnly ] , HTTP_X_PP_AZ_LOCATOR = [ sandbox . slc ] , Content - Length = [ 876 ] , X - PAYPAL - TOKEN - SERVICE = [ IAAS ] , Date = [ Mon , 26 Nov 2018 19 : 22 : 28 GMT ] , Content - Type = [ application / json ] } 13 : 22 : 28.810 [ main ] DEBUG com . paypal . base . rest . OAuthTokenCredential - response : { "scope" : "https://api.paypal.com/v1/payments/.* https://uri.paypal.com/services/payments/refund https://uri.paypal.com/services/applications/webhooks https://uri.paypal.com/services/payments/payment/authcapture https://uri.paypal.com/payments/payouts https://api.paypal.com/v1/vault/credit-card/.* https://uri.paypal.com/services/disputes/read-seller https://uri.paypal.com/services/subscriptions https://uri.paypal.com/services/disputes/read-buyer https://api.paypal.com/v1/vault/credit-card openid https://uri.paypal.com/services/disputes/update-seller https://uri.paypal.com/services/payments/realtimepayment" , "nonce" : "2018-11-26T19:03:03ZymZQ8MNE2MarndZEjUoxwB70puoxUA-NXqc7pUVtVxk" , "access_token" : "A21AAGyWgsdafxUM_1FCE5d9adsfuwfiOB7_4XkX3wKHWXe3nkKgt2bhadflirJsMWP9JAm-pBT2DtUJ5W0A" , "token_type" : "Bearer" , "app_id" : "APP-80W284ads543T" , "expires_in" : 31235 } 13 : 22 : 28.817 [ main ] DEBUG com . paypal . base . rest . PayPalResource - request header : { Authorization = Bearer A21AAGyWgsdafxUM_1FCE5d9adsfuwfiOB7_4XkX3wKHWXe3nkKgt2bhadflirJsMWP9JAm - pBT2DtUJ5W0A , User - Agent = PayPalSDK / ( v = 11 ; vendor = Oracle Corporation ; bit = 64 ; os = Mac_OS_X 10.14.1 ) , PayPal - Request - Id = 74886e72 - 34e4 - 4a0 - 8cd7 - 6adsf63b5dc9 , Accept = application / json , Content - Type = application / json } 13 : 22 : 28.817 [ main ] DEBUG com . paypal . base . rest . PayPalResource - request body : { "intent" : "sale" , "payer" : { "payment_method" : "paypal" } , "transactions" : [ { "amount" : { "currency" : "USD" , "total" : "6.66" , "details" : { "subtotal" : "3.33" , "shipping" : "2.22" , "tax" : "1.11" } } , "description" : "Crunchify Tutorial: How to Invoke PayPal REST API using Java Client?" } ] , "redirect_urls" : { "return_url" : "http://localhost:3000/crunchifyReturn" , "cancel_url" : "http://localhost:3000/crunchifyCancel" } } 13 : 22 : 28.818 [ main ] DEBUG com . paypal . base . HttpConnection - curl command : curl -- verbose -- request POST 'https://api.sandbox.paypal.com/v1/payments/payment' \ -- header "Authorization:Bearer A21AAGyWgsdafxUM_1FCE5d9adsfuwfiOB7_4XkX3wKHWXe3nkKgt2bhadflirJsMWP9JAm-pBT2DtUJ5W0A" \ -- header "User-Agent:PayPalSDK/ (v=11; vendor=Oracle Corporation; bit=64; os=Mac_OS_X 10.14.1)" \ -- header "PayPal-Request-Id:74886e72-34e4-4a70-8cd7-605cd63b5dc9" \ -- header "Accept:application/json" \ -- header "Content-Type:application/json" \ -- data '{ "intent": "sale", "payer": { "payment_method": "paypal" }, "transactions": [ { "amount": { "currency": "USD", "total": "6.66", "details": { "subtotal": "3.33", "shipping": "2.22", "tax": "1.11" } }, "description": "Crunchify Tutorial: How to Invoke PayPal REST API using Java Client?" } ], "redirect_urls": { "return_url": "http://localhost:3000/crunchifyReturn", "cancel_url": "http://localhost:3000/crunchifyCancel" } }' 13 : 22 : 33.407 [ main ] DEBUG com . paypal . base . rest . PayPalResource - response : { "id" : "PAY-25A74012S3552184CLP6EP6A" , "intent" : "sale" , "state" : "created" , "payer" : { "payment_method" : "paypal" } , "transactions" : [ { "amount" : { "total" : "6.66" , "currency" : "USD" , "details" : { "subtotal" : "3.33" , "tax" : "1.11" , "shipping" : "2.22" } } , "description" : "Crunchify Tutorial: How to Invoke PayPal REST API using Java Client?" , "related_resources" : [ ] } ] , "create_time" : "2018-11-26T19:22:32Z" , "links" : [ { "href" : "https://api.sandbox.paypal.com/v1/payments/payment/PAY-25A74012S3552184CLP6EP6A" , "rel" : "self" , "method" : "GET" } , { "href" : "https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-9C691969F1033220V" , "rel" : "approval_url" , "method" : "REDIRECT" } , { "href" : "https://api.sandbox.paypal.com/v1/payments/payment/PAY-25A74012S3552184CLP6EP6A/execute" , "rel" : "execute" , "method" : "POST" } ] } createdPayment Obejct Details == > { "id" : "PAY-25A74012S3552184CLP6EP6A" , "intent" : "sale" , "payer" : { "payment_method" : "paypal" } , "transactions" : [ { "related_resources" : [ ] , "amount" : { "currency" : "USD" , "total" : "6.66" , "details" : { "subtotal" : "3.33" , "shipping" : "2.22" , "tax" : "1.11" } } , "description" : "How to Invoke PayPal REST API using Java Client?" } ] , "state" : "created" , "create_time" : "2018-11-26T19:22:32Z" , "links" : [ { "href" : "https://api.sandbox.paypal.com/v1/payments/payment/PAY-25A74012S3552184CLP6EP6A" , "rel" : "self" , "method" : "GET" } , { "href" : "https://www.sandbox.paypal.com/cgi-bin/webscr?cmd\u003d_express-checkout\u0026token\u003dEC-9C691969F1033220V" , "rel" : "approval_url" , "method" : "REDIRECT" } , { "href" : "https://api.sandbox.paypal.com/v1/payments/payment/PAY-25A74012S3552184CLP6EP6A/execute" , "rel" : "execute" , "method" : "POST" } ] } 13 : 22 : 33.414 [ main ] DEBUG com . paypal . base . rest . PayPalResource - request header : { Authorization = Bearer A21AAGyWgkMoxUM_1FCE5d948J5SAxIuwfiOB7_4XkX3wKHWXe3nkKgt2bhtXISnazHlE9yzlirJsMWP9JAm - pBT2DtUJ5W0A , User - Agent = PayPalSDK / ( v = 11 ; vendor = Oracle Corporation ; bit = 64 ; os = Mac_OS_X 10.14.1 ) , PayPal - Request - Id = e47412c8 - 2c1f - 4505 - b1a3 - 7b4723eb99f4 , Accept = application / json , Content - Type = application / json } 13 : 22 : 33.415 [ main ] DEBUG com . paypal . base . rest . PayPalResource - request body : { "payer_id" : "1Z232AMNN" } 13 : 22 : 33.415 [ main ] DEBUG com . paypal . base . HttpConnection - curl command : curl -- verbose -- request POST 'https://api.sandbox.paypal.com/v1/payments/payment/PAY-25A74012S3552184CLP6EP6A/execute' \ -- header "Authorization:Bearer A21AAGyWgsdafxUM_1FCE5d9adsfuwfiOB7_4XkX3wKHWXe3nkKgt2bhadflirJsMWP9JAm-pBT2DtUJ5W0A" \ -- header "User-Agent:PayPalSDK/ (v=11; vendor=Oracle Corporation; bit=64; os=Mac_OS_X 10.14.1)" \ -- header "PayPal-Request-Id:eadf412c8-2c1f-4505-b1a3-7basdaf99f4" \ -- header "Accept:application/json" \ -- header "Content-Type:application/json" \ -- data '{ "payer_id": "1Z232AMNN" }' 13 : 22 : 34.016 [ main ] ERROR com . paypal . base . HttpConnection - Response code : 400 Error response : { "name" : "PAYMENT_NOT_APPROVED_FOR_EXECUTION" , "message" : "Payer has not approved payment" , "information_link" : "https://developer.paypal.com/docs/api/payments/#errors" , "debug_id" : "113d5208bf8d3" } name : PAYMENT_NOT_APPROVED_FOR_EXECUTION message : Payer has not approved payment details : null debug - id : 113d5208bf8d3 information - link : https : //developer.paypal.com/docs/api/payments/#errors |
Da mesma forma, nos próximos tutoriais, fornecerei mais detalhes sobre how to capture money
, refund money
e void any authorization
que você tenha na conta do Pagador.
