PayPal tramite API diretta
In questa pagina
Questa pagina include i passaggi necessari per integrare PayPal utilizzando l'API DEUNA.
Una volta che avremo order_token, dobbiamo fare quanto segue:
1. Crea utente
Creare un utente con DEUNA al fine di ottenere il token di autorizzazione per eseguire l'acquisto in seguito. Questa API restituirà un utente token che sarà necessario seguire i prossimi passi.
Per creare un utente, segui il API Riferimento. Nel caso in cui l'email utilizzata già esiste, l'API restituirà il messaggio user already exists, così si può procedere Richiedi l'OTP e poi, Accedi con l'OTP per ottenere un utente fresco token e procedere con l'acquisto.
2. Ottenere metodi di pagamento
Dobbiamo controllare i metodi di pagamento per ottenere la configurazione del portafoglio PayPal. Potete seguire questo guida.
-
Pagamento
curl --location '{{base_url}}/merchants/orders/{{order_token}}/payments-methods' \ --header 'x-api-key: {{merchant_private_key}}' \ --header 'Authorization: Bearer {{user_token}}'const response = await fetch("{{base_url}}/merchants/orders/{{order_token}}/payments-methods", { method: "GET", headers: { "x-api-key": "{{merchant_private_key}}", "Authorization": "Bearer {{user_token}}" } }); if (!response.ok) throw new Error(`Request failed: ${response.status}`); const data = await response.json();import requests response = requests.request( "GET", "{{base_url}}/merchants/orders/{{order_token}}/payments-methods", headers={ "x-api-key": "{{merchant_private_key}}", "Authorization": "Bearer {{user_token}}" }, ) response.raise_for_status() data = response.json()<?php $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => "{{base_url}}/merchants/orders/{{order_token}}/payments-methods", CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "x-api-key: {{merchant_private_key}}", "Authorization: Bearer {{user_token}}" ] ]); $response = curl_exec($curl); curl_close($curl);import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Example { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("{{base_url}}/merchants/orders/{{order_token}}/payments-methods")) .header("x-api-key", "{{merchant_private_key}}") .header("Authorization", "Bearer {{user_token}}") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse<String> response = HttpClient.newHttpClient().send( request, HttpResponse.BodyHandlers.ofString() ); System.out.println(response.body()); } }package main import ( "fmt" "io" "net/http" ) func main() { request, err := http.NewRequest("GET", "{{base_url}}/merchants/orders/{{order_token}}/payments-methods", nil) if err != nil { panic(err) } request.Header.Set("x-api-key", "{{merchant_private_key}}") request.Header.Set("Authorization", "Bearer {{user_token}}") response, err := http.DefaultClient.Do(request) if err != nil { panic(err) } defer response.Body.Close() body, _ := io.ReadAll(response.Body) fmt.Println(string(body)) } -
Restituisce l’ordine elaborato con
JSON{ "data": [ { "enabled": true, "method_type": "wallet", "processor_name": "paypal_wallet", // PayPal Wallet identifier "exclude_cvv": false, "stored_payment_methods": [ { "payment_method": "adb1ef51-e073-49f5-ba3b-a7e42344fd15", "account_identifier": "johndoe@deuna.com" } ], "id": "58745b8e-7127-44ea-84ef-656b3ffc611b", // Payment method ID "authorization": { "required": true, // true | false "flow": "consent" } } ] }
Flusso di acquisto#
A seconda della risposta ottenuta da Get Payment Methods, possiamo seguire i seguenti flussi per completare un acquisto:
Senza Vaulting
Questo è il flusso da seguire quando la tokenizzazione di un account PayPal non è necessaria per completare l'acquisto.
La risposta da Ottieni metodi di pagamento sarebbe il seguente:
{
"data": [
{
"enabled": true,
"method_type": "wallet",
"processor_name": "paypal_wallet", // PayPal Wallet identifier
"exclude_cvv": false,
"stored_payment_methods": [],
"id": "58745b8e-7127-44ea-84ef-656b3ffc611b", // Payment method ID
"authorization": {
"required": false,
"flow": "consent"
}
}
]
}In questo flusso, dobbiamo fare quanto segue:
-
Eseguire l'acquisto
-
Usa il guida Purchase V2. Ecco un elenco dei campi richiesti per il Portafoglio PayPal:
Campo Descrizione Valore order.callback_urls.on_successReindirizza URL dopo aver autorizzato l'acquisto con il tuo account PayPal Wallet. https://example.com/payment_source.method_typeTipo di metodo di pagamento DEUNA. walletpayment_source.processorPayPal Portafoglio metodo di pagamento identificatore. paypal_walletPagamento
JSON{ "order_type": "DEUNA_CHECKOUT", "order_token": "{{order-token}}", "order": { "callback_urls": { "on_success": "https://example.com" // required for PayPal Wallet } }, "payer_info": { "email": "johndoe@deuna.com" }, "payment_source": { "method_type": "wallet", // required for PayPal Wallet "processor": "paypal_wallet" // required for PayPal Wallet }, "anti_fraud_info": { "device": { "id": "xxxxxxx" // PayPal device ID, used in STC } } }
Restituisce l’ordine elaborato con
JSON{ "order": { "order_id": "620bbbf4-1f08-4cda-8609-dade541cb80e", "store_code": "all", "currency": "MXN", "tax_amount": 0, "display_tax_amount": "", "shipping_amount": 0, "display_shipping_amount": "MXN 0.00", "items_total_amount": 2175, "display_items_total_amount": "MXN 21.75", "sub_total": 2075, "display_sub_total": "MXN 20.75", "total_amount": 2190, "display_total_amount": "MXN 21.90", "items": [ { "id": "849fd015-2e1b-4ccc-a00c-aacbefeb71c8", "name": "Papas", "description": "Papas fritas con paprica", "options": "", "total_amount": { "amount": 2100, "original_amount": 2100, "display_amount": "MXN 21.00", "display_original_amount": "MXN 21.00", "currency": "MXN", "currency_symbol": "$", "total_discount": 100, "display_total_discount": "MXN 1.00" }, "unit_price": { "amount": 1050, "display_amount": "MXN 10.50", "currency": "MXN", "currency_symbol": "$" }, "tax_amount": { "amount": 50, "display_amount": "MXN 0.50", "currency": "MXN", "currency_symbol": "$" }, "quantity": 2, "uom": "", "upc": "", "sku": "", "isbn": "", "brand": "", "manufacturer": "", "category": "", "color": "", "size": "", "weight": { "weight": 0, "unit": "" }, "image_url": "https://media-cdn.tripadvisor.com/media/photo-s/1a/e2/c6/68/porcion-de-papas-a-la.jpg", "details_url": "", "type": "", "taxable": true, "discounts": [], "included_in_subscription": false, "item_details": [] }, { "id": "c871341d-317b-4fdb-9d72-b55e55958633", "name": "Refresco", "description": "Coca-cola Sprite", "options": "", "total_amount": { "amount": 90, "original_amount": 75, "display_amount": "MXN 0.90", "display_original_amount": "MXN 0.75", "currency": "MXN", "currency_symbol": "$", "total_discount": 0, "display_total_discount": "MXN 0.00" }, "unit_price": { "amount": 75, "display_amount": "MXN 0.75", "currency": "MXN", "currency_symbol": "$" }, "tax_amount": { "amount": 15, "display_amount": "MXN 0.15", "currency": "MXN", "currency_symbol": "$" }, "quantity": 1, "uom": "", "upc": "", "sku": "", "isbn": "", "brand": "", "manufacturer": "", "category": "", "color": "", "size": "", "weight": { "weight": 0, "unit": "" }, "image_url": "https://media-cdn.tripadvisor.com/media/photo-s/1a/e2/c6/68/porcion-de-papas-a-la.jpg", "details_url": "", "type": "", "taxable": true, "discounts": [], "included_in_subscription": false, "item_details": [] } ], "discounts": [], "shipping_address": { "id": 762, "user_id": "", "first_name": "Pablo", "last_name": "Murillo", "phone": "+551146733466", "identity_document": "", "lat": -22.943934, "lng": -43.182984, "address1": "Jose luis lagrange 3, 12", "address2": "Polanco I Sección", "city": "MIGUEL HIDALGO", "zipcode": "11510", "state_name": "CIUDAD DE MÉXICO", "country_code": "MX", "additional_description": "confirmar", "address_type": "home", "is_default": false, "created_at": "2025-02-26T21:38:07Z", "updated_at": "2025-02-26T21:38:07Z", "identity_document_type": "", "email": "johndoe@deuna.com", "state_code": "", "country": "MX" }, "shipping_options": null, "user_instructions": "", "metadata": { "cd_string_one": 1, "highrisk_txn_flag": 1, "vertical": "Retail" }, "status": "pending", "payment": { "data": { "amount": { "amount": 2190, "currency": "MXN" }, "metadata": { "authorization_code": "", "external_transaction_id": "6L9248503S6803027" }, "from_card": { "card_brand": "", "first_six": "", "last_four": "", "bank_name": "", "country_iso": "", "credential_source": "", "expiry_month": "", "expiry_year": "" }, "updated_at": "2025-02-26 21:38:12.748800962 +0000 UTC", "method_type": "wallet", "merchant": { "store_code": "all", "id": "2a18bdc9-d617-45cc-b718-838451dcf33a", "affiliation_code": "", "mcc": "" }, "created_at": "2025-02-26 21:38:12.747998969 +0000 UTC", "id": "620bbbf4-1f08-4cda-8609-dade541cb80e", "processor": "paypal_wallet", "customer": { "email": "user_dev_219@testuser.com", "id": "9d920735-c3b1-4908-aba2-762d86fda7e0", "first_name": "", "last_name": "" }, "status": "pending", "reason": "", "external_transaction_id": "6L9248503S6803027", "merchant_payment_processor_name": "", "authorization_code": "", "installment_interest_calculations": null, "next_action": { "action": "authorization_wallet", "url": "", "authorization_wallet": { "token": "6L9248503S6803027", "redirect_url": "https://www.sandbox.paypal.com/checkoutnow?token=6L9248503S6803027" } }, "merchant_payment_processor_id": "" } }, "gift_card": [], "redirect_url": "", "webhook_urls": null, "total_discount": 0, "display_total_discount": "MXN 0.00", "shipping": null, "cash_change": 0, "shipping_method": null, "shipping_methods": [], "timezone": "", "scheduled_at": "", "billing_address": { "id": 191, "user_id": "", "first_name": "Pablo", "last_name": "Murillo", "phone": "+551146733466", "identity_document": "", "lat": -22.943934, "lng": -43.182984, "address1": "Jose luis lagrange 3, 12", "address2": "Polanco I Sección", "city": "MIGUEL HIDALGO", "zipcode": "11510", "state_name": "CIUDAD DE MÉXICO", "country_code": "MX", "additional_description": "confirmar", "address_type": "home", "is_default": false, "created_at": "2025-02-26T21:38:07Z", "updated_at": "2025-02-26T21:38:07Z", "email": "johndoe@deuna.com", "identity_document_type": "", "country": "" }, "payment_link": "", "display_shipping_tax_amount": "MXN 0.00", "display_total_tax_amount": "MXN 1.15", "shipping_tax_amount": 0, "total_tax_amount": 115, "user_id": "", "include_payment_options": [], "redirect_urls": { "success": "", "pending": "", "error": "", "fallback": "", "close": "" }, "created_at": "", "updated_at": "", "payer_info": null, "discount_amount": 100, "shipping_discount_amount": 0, "device_fingerprint": "", "expired_at": "", "version": "0", "fraud": { "analysis": { "score": 0.113950945, "processor": "SIFT", "risk_level": "", "status": "automatic_decision", "type": "", "fraud_decision": "", "details": "", "processor_response": "" } }, "display_total_interest_amount": "", "payment_method": "", "token": "", "statement_descriptor": "", "browser_details": { "screen_height": 1000, "screen_width": 2000, "user_agent": "", "ip_address": "", "color_depth": 0, "java_enabled": false, "java_script_enabled": false, "language": "", "time_zone_offset": 0, "accept_header": "" }, "callback_urls": null }, "custom_fields": [] } -
-
Reindirizza a PayPal
L'API di acquisto restituirà una risposta con una
pendingstato e unnext_actioncontenente l'URL di checkout PayPal, a cui dovremmo reindirizzare l'utente.JSON{ "order": { "order_id": "620bbbf4-1f08-4cda-8609-dade541cb80e", "store_code": "all", "currency": "MXN", "tax_amount": 0, "display_tax_amount": "", "shipping_amount": 0, "display_shipping_amount": "MXN 0.00", "items_total_amount": 2175, "display_items_total_amount": "MXN 21.75", "sub_total": 2075, "display_sub_total": "MXN 20.75", "total_amount": 2190, "display_total_amount": "MXN 21.90", ... "status": "pending", "payment": { "data": { "method_type": "wallet", "processor": "paypal_wallet", "status": "pending", "external_transaction_id": "6L9248503S6803027", "next_action": { "action": "authorization_wallet", "url": "", "authorization_wallet": { "token": "6L9248503S6803027", "redirect_url": "https://www.sandbox.paypal.com/checkoutnow?token=6L9248503S6803027" } }, ... } }, "created_at": "", "updated_at": "", ... }, "custom_fields": [] } -
Controllare lo stato dell'ordine (Polling).
Una volta che abbiamo indirizzato l'utente a PayPal, dobbiamo controllare lo stato di pagamento mentre lo autorizzano con il loro account, inquinando fino a quando lo stato cambia.
Dobbiamo Ordinare e controllare
payment.data.status.Gli stati previsti sono:
pending: L'utente non ha ancora autorizzato il pagamento su PayPal.processed: L'utente ha autorizzato il pagamento su PayPal e la cattura ha avuto successo.denied: Si è verificato un errore durante l'elaborazione del pagamento.
Restituisce l’ordine elaborato con
JSON{ "token": "ce7f91cc-7306-4a36-b9a8-b266545c56ba", "order_type": "DEUNA_CHECKOUT", "order": { "order_id": "620bbbf4-1f08-4cda-8609-dade541cb80e", "store_code": "all", "currency": "MXN", "tax_amount": 0, "display_tax_amount": "MXN 0.00", "shipping_amount": 0, "display_shipping_amount": "MXN 0.00", "items_total_amount": 2175, "display_items_total_amount": "MXN 21.75", "sub_total": 2075, "display_sub_total": "MXN 20.75", "total_amount": 2190, "display_total_amount": "MXN 21.90", "discounts": [], "status": "succeeded", "payment": { "data": { "method_type": "wallet", "processor": "paypal_wallet", "status": "processed", "external_transaction_id": "5S773340XV029382D" } }, "created_at": "2025-02-26 21:38:07.860816361 +0000 UTC", "updated_at": "", "callback_urls": null }, "custom_fields": [], "checkout_modules": [], "refunds": [] }
Con Vaulting
Questo è il flusso da seguire quando la tokenizzazione di un account PayPal è necessaria per completare l'acquisto.
La risposta da Ottieni metodi di pagamento sarebbe il seguente:
{
"data": [
{
"enabled": true,
"method_type": "wallet",
"processor_name": "paypal_wallet", // PayPal Wallet identifier
"exclude_cvv": false,
"stored_payment_methods": [
{
"payment_method": "adb1ef51-e073-49f5-ba3b-a7e42344fd15",
"account_identifier": "johndoe@deuna.com"
}
],
"id": "58745b8e-7127-44ea-84ef-656b3ffc611b", // Payment method ID
"authorization": {
"required": true,
"flow": "consent"
}
}
]
}A questo punto, l'utente dovrebbe essere data l'opzione di aggiungere un nuovo account o procedere con l'acquisto utilizzando un account precedentemente tokenizzato.
-
Aggiungi un nuovo account PayPal
Per poter gettare un nuovo account, devono essere seguite le seguenti operazioni:
- Crea il consenso del cliente.
A questo punto, creeremo una richiesta di autorizzazione PayPal per l'utente.- Richiesta
curl --location --request POST '{{base_url}}/merchants/orders/{{order_token}}/consent?payment_method_id={{payment_method_id}}' \ --header 'X-API-KEY: {{merchant_private_key}}' \ --header 'Content-Type: application/json' \ --header 'X-Request-Id: xxxxx' \ --header 'Authorization: Bearer {{user_token}}'const response = await fetch("{{base_url}}/merchants/orders/{{order_token}}/consent?payment_method_id={{payment_method_id}}", { method: "POST", headers: { "X-API-KEY": "{{merchant_private_key}}", "Content-Type": "application/json", "X-Request-Id": "xxxxx", "Authorization": "Bearer {{user_token}}" } }); if (!response.ok) throw new Error(`Request failed: ${response.status}`); const data = await response.json();import requests response = requests.request( "POST", "{{base_url}}/merchants/orders/{{order_token}}/consent?payment_method_id={{payment_method_id}}", headers={ "X-API-KEY": "{{merchant_private_key}}", "Content-Type": "application/json", "X-Request-Id": "xxxxx", "Authorization": "Bearer {{user_token}}" }, ) response.raise_for_status() data = response.json()<?php $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => "{{base_url}}/merchants/orders/{{order_token}}/consent?payment_method_id={{payment_method_id}}", CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "X-API-KEY: {{merchant_private_key}}", "Content-Type: application/json", "X-Request-Id: xxxxx", "Authorization: Bearer {{user_token}}" ] ]); $response = curl_exec($curl); curl_close($curl);import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Example { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("{{base_url}}/merchants/orders/{{order_token}}/consent?payment_method_id={{payment_method_id}}")) .header("X-API-KEY", "{{merchant_private_key}}") .header("Content-Type", "application/json") .header("X-Request-Id", "xxxxx") .header("Authorization", "Bearer {{user_token}}") .method("POST", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse<String> response = HttpClient.newHttpClient().send( request, HttpResponse.BodyHandlers.ofString() ); System.out.println(response.body()); } }package main import ( "fmt" "io" "net/http" ) func main() { request, err := http.NewRequest("POST", "{{base_url}}/merchants/orders/{{order_token}}/consent?payment_method_id={{payment_method_id}}", nil) if err != nil { panic(err) } request.Header.Set("X-API-KEY", "{{merchant_private_key}}") request.Header.Set("Content-Type", "application/json") request.Header.Set("X-Request-Id", "xxxxx") request.Header.Set("Authorization", "Bearer {{user_token}}") response, err := http.DefaultClient.Do(request) if err != nil { panic(err) } defer response.Body.Close() body, _ := io.ReadAll(response.Body) fmt.Println(string(body)) } - Restituisce l’ordine elaborato con
JSON
{ "id": "1625a32a-df4c-4d9b-aec1-4510b3625865", "type": "transaction.authentication.pending", "created": "1740608931", "data": { "order": { "order_token": "7e975d44-a061-4d70-af0f-673f6ee56445", "transaction_id": "51b38afd-150f-419a-b718-b583209160fe", "external_transaction_id": "" }, "consent": { "id": "6fe9a045-9a46-4b25-8b60-d5a9586494c5", "status": "pending", "expires_at": "2025-02-26T22:38:51Z", "authorization_id": "5KA20765HT8087515", "redirect_url": "https://www.sandbox.paypal.com/agreements/approve?approval_session_id=5KA20765HT8087515" }, "error": null } }
- Richiesta
- Reindirizza a PayPal
L'API restituirà il consenso comependinge un URL PayPal dove l'utente deve inserire i dettagli del proprio account e autorizzarne l'uso.JSON{ "id": "1625a32a-df4c-4d9b-aec1-4510b3625865", "type": "transaction.authentication.pending", "created": "1740608931", "data": { "order": { "order_token": "7e975d44-a061-4d70-af0f-673f6ee56445", "transaction_id": "51b38afd-150f-419a-b718-b583209160fe", "external_transaction_id": "" }, "consent": { "id": "6fe9a045-9a46-4b25-8b60-d5a9586494c5", "status": "pending", "expires_at": "2025-02-26T22:38:51Z", "authorization_id": "5KA20765HT8087515", "redirect_url": "https://www.sandbox.paypal.com/agreements/approve?approval_session_id=5KA20765HT8087515" }, "error": null } } - Ottieni lo stato di consenso del cliente (Polling)
Una volta indirizzato l'utente a PayPal, dobbiamo controllare lo stato del consenso mentre autorizzano l'uso del proprio account, inquinando fino a quando lo stato non cambia.- Richiesta
curl --location '{{base_url}}/merchants/orders/{{order_token}}/consent' \ --header 'X-API-KEY: {{merchant_private_key}}' \ --header 'Content-Type: application/json' \ --header 'X-Request-Id: xxxxx' \ --header 'Authorization: {{user_token}}'const response = await fetch("{{base_url}}/merchants/orders/{{order_token}}/consent", { method: "GET", headers: { "X-API-KEY": "{{merchant_private_key}}", "Content-Type": "application/json", "X-Request-Id": "xxxxx", "Authorization": "{{user_token}}" } }); if (!response.ok) throw new Error(`Request failed: ${response.status}`); const data = await response.json();import requests response = requests.request( "GET", "{{base_url}}/merchants/orders/{{order_token}}/consent", headers={ "X-API-KEY": "{{merchant_private_key}}", "Content-Type": "application/json", "X-Request-Id": "xxxxx", "Authorization": "{{user_token}}" }, ) response.raise_for_status() data = response.json()<?php $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => "{{base_url}}/merchants/orders/{{order_token}}/consent", CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "X-API-KEY: {{merchant_private_key}}", "Content-Type: application/json", "X-Request-Id: xxxxx", "Authorization: {{user_token}}" ] ]); $response = curl_exec($curl); curl_close($curl);import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Example { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("{{base_url}}/merchants/orders/{{order_token}}/consent")) .header("X-API-KEY", "{{merchant_private_key}}") .header("Content-Type", "application/json") .header("X-Request-Id", "xxxxx") .header("Authorization", "{{user_token}}") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse<String> response = HttpClient.newHttpClient().send( request, HttpResponse.BodyHandlers.ofString() ); System.out.println(response.body()); } }package main import ( "fmt" "io" "net/http" ) func main() { request, err := http.NewRequest("GET", "{{base_url}}/merchants/orders/{{order_token}}/consent", nil) if err != nil { panic(err) } request.Header.Set("X-API-KEY", "{{merchant_private_key}}") request.Header.Set("Content-Type", "application/json") request.Header.Set("X-Request-Id", "xxxxx") request.Header.Set("Authorization", "{{user_token}}") response, err := http.DefaultClient.Do(request) if err != nil { panic(err) } defer response.Body.Close() body, _ := io.ReadAll(response.Body) fmt.Println(string(body)) } - Restituisce l’ordine elaborato con
Gli stati previsti sono:JSON
{ "id": "4d226ecf-cd9a-4cc0-a3cf-fa8b2d0efab7", "type": "transaction.authentication.updated", "created": "1740609613", "callback_url": "", "data": { "request_id": "62551ffd-6d67-46cb-a436-f1ec3aa56087", "order": { "order_token": "00000000-0000-0000-0000-000000000000", "transaction_id": "", "external_transaction_id": "" }, "consent": { "id": "61fd7eb8-8a42-43fc-89d1-ab5c5ccaa0b9", "status": "success", "expires_at": "0001-01-01T00:00:00Z", "authorization_id": "95778196PH100683G", "redirect_url": "" }, "error": null } } pending: L'utente non ha ancora autorizzato l'utilizzo del proprio account PayPal.success: L'utente ha autorizzato l'utilizzo del proprio account PayPal e l'account è stato archiviato con successo.denied: Si è verificato un errore durante la tokenizzazione dell'account, o l'utente non ha autorizzato l'uso del proprio account.expired: L'utente non autorizzava l'uso del proprio account in tempo.\
Una volta che il consenso dell'utente è autorizzato, l'account apparirà nel
stored_payment_methodsdella risposta da Ottieni metodi di pagamento.
JSON{ "data": [ { "enabled": true, "method_type": "wallet", "processor_name": "paypal_wallet", // PayPal Wallet identifier "exclude_cvv": false, "stored_payment_methods": [ { "payment_method": "6fe9a045-9a46-4b25-8b60-d5a9586494c5", // data.consent.id "account_identifier": "johndoe@deuna.com" } ], "id": "58745b8e-7127-44ea-84ef-656b3ffc611b", // Payment method ID "authorization": { "required": true, "flow": "consent" } } ] }A questo punto, dovremmo avere un conto PayPal tokenizzato, questi token saranno necessari per i prossimi passi. Questo token di conto sarà il
payment_methodcampo dall'elencostored_payment_methodsin risposta di Ottieni metodi di pagamentoo può anche esseredata.consent.idcampo dalla risposta API di Creare o Ottieni il consenso. - Richiesta
- Crea il consenso del cliente.
-
Installazioni (opzionale)
Possiamo controllare le rate disponibili per l'account PayPal dell'utente con la seguente richiesta:
curl --location '{{base_url}}/merchants/transactions/orders/{{order_token}}/installments?payment_method={{payment_method}}&method_type=wallet&payment_method_id={{payment_method_id}}' \ --header 'x-api-key: {{merchant_public_key}}'const response = await fetch("{{base_url}}/merchants/transactions/orders/{{order_token}}/installments?payment_method={{payment_method}}&method_type=wallet&payment_method_id={{payment_method_id}}", { method: "GET", headers: { "x-api-key": "{{merchant_public_key}}" } }); if (!response.ok) throw new Error(`Request failed: ${response.status}`); const data = await response.json();import requests response = requests.request( "GET", "{{base_url}}/merchants/transactions/orders/{{order_token}}/installments?payment_method={{payment_method}}&method_type=wallet&payment_method_id={{payment_method_id}}", headers={ "x-api-key": "{{merchant_public_key}}" }, ) response.raise_for_status() data = response.json()<?php $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => "{{base_url}}/merchants/transactions/orders/{{order_token}}/installments?payment_method={{payment_method}}&method_type=wallet&payment_method_id={{payment_method_id}}", CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "x-api-key: {{merchant_public_key}}" ] ]); $response = curl_exec($curl); curl_close($curl);import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Example { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("{{base_url}}/merchants/transactions/orders/{{order_token}}/installments?payment_method={{payment_method}}&method_type=wallet&payment_method_id={{payment_method_id}}")) .header("x-api-key", "{{merchant_public_key}}") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse<String> response = HttpClient.newHttpClient().send( request, HttpResponse.BodyHandlers.ofString() ); System.out.println(response.body()); } }package main import ( "fmt" "io" "net/http" ) func main() { request, err := http.NewRequest("GET", "{{base_url}}/merchants/transactions/orders/{{order_token}}/installments?payment_method={{payment_method}}&method_type=wallet&payment_method_id={{payment_method_id}}", nil) if err != nil { panic(err) } request.Header.Set("x-api-key", "{{merchant_public_key}}") response, err := http.DefaultClient.Do(request) if err != nil { panic(err) } defer response.Body.Close() body, _ := io.ReadAll(response.Body) fmt.Println(string(body)) }Restituisce l’ordine elaborato con
JSON{ "installments": [ { "installments": 3, "installments_amount": 3333, "display_installments_amount": "MXN 33.33", "installment_rate": 0, "display_installment_label": "3 de $33.33 sin interés", "plan_option_id": "2e0cc595-40e6-4ecf-b43b-35d5c33f88b6", "installment_total_amount": 10000, "installment_tax": [], "display_installment_total_amount": "MXN 100.00" }, { "installments": 6, "installments_amount": 1666, "display_installments_amount": "MXN 16.66", "installment_rate": 0, "display_installment_label": "6 de $16.66 sin interés", "plan_option_id": "25c7ef41-ebe8-4197-bdb3-f8651c261ea8", "installment_total_amount": 10000, "installment_tax": [], "display_installment_total_amount": "MXN 100.00" } ] } -
Eseguire l'acquisto
Usa il guida Purchase V2. Ecco un elenco dei campi richiesti per il Portafoglio PayPal:
Campo Descrizione Valore payment_source.method_typeTipo di metodo di pagamento DEUNA walletpayment_source.processorPayPal Portafoglio metodo di pagamento identificatore. paypal_walletpayment_source.payment_methodToken conto PayPal. 6fe9a045-9a46-4b25-8b60-d5a9586494c5payment_source.payment_method_idPayPal Portafoglio metodo di pagamento ID restituito nel idcampo del Ottieni metodi di pagamento response.58745b8e-7127-44ea-84ef-656b3ffc611b- Pagamento
JSON
{ "order_type": "DEUNA_CHECKOUT", "order_token": "{{order-token}}", "payer_info": { "email": "johndoe@deuna.com" }, "payment_source": { "method_type": "wallet", // required for PayPal Wallet "processor": "paypal_wallet", // required for PayPal Wallet "payment_method": "{{payment_method}}", // required "payment_method_id": "{{payment_method_id}}" // required }, "anti_fraud_info": { "device": { "id": "xxxxxxx" // PayPal device ID, used in STC } } }
Restituisce l’ordine elaborato con
JSON{ "order_type": "DEUNA_CHECKOUT", "order_token": "c582917a-07d2-4f07-b107-fd535e5565cb", "order": { "order_id": "777e66e5-3326-4b04-ad0a-93be7f2028bb", "store_code": "all", "currency": "MXN", "tax_amount": 0, "display_tax_amount": "", "shipping_amount": 0, "display_shipping_amount": "MXN 0.00", "items_total_amount": 2175, "display_items_total_amount": "MXN 21.75", "sub_total": 2075, "display_sub_total": "MXN 20.75", "total_amount": 2190, "display_total_amount": "MXN 21.90", ... "status": "succeeded", "payment": { "data": { "method_type": "wallet", "processor": "paypal_wallet", "customer": { "email": "user_dev_219@testuser.com", "id": "9d920735-c3b1-4908-aba2-762d86fda7e0", "first_name": "", "last_name": "" }, "status": "processed", "external_transaction_id": "0YF74805EM9345944", ... } }, ... "callback_urls": null } }Stazioni previste:
succeeded: Pagamento completato con successo.denied: Si è verificato un errore durante l'elaborazione del pagamento.
- Pagamento
Integrare FraudNet#
Fraudnet è una libreria sviluppata da PayPal che analizza i dati inviati attraverso il browser durante l'intero processo di acquisto per prevenire possibili frodi nelle transazioni effettuate.
Fraudnet deve essere in esecuzione durante il processo di transazione. Per la sua integrazione, PayPal fornisce la seguente documentazione: Integrare FraudNet
Importo sconto#
Gli sconti in PayPal sono supportati a livello di ordine. Sul carico di pagamento, è necessario elaborare qualsiasi sconto attraverso discount_amount.