Installazioni con interesse (MCI)
In questa pagina
I pagamenti mensili con interesse sono un'opzione di pagamento che consente ai clienti di dividere il costo di un acquisto in più rate mensili, con interesse applicato al saldo in sospeso.
Con MCI, un cliente paga un tasso di interesse aggiuntivo per la divisione del costo di acquisto in rate mensili.
Quando un cliente sceglie di pagare attraverso pagamenti mensili con interesse, il costo totale dell'acquisto è diviso in rate mensili e i tassi di interesse sono applicati al saldo rimanente in ogni periodo.
Come funziona MCI#
Ecco come funziona un flusso MCI:
- Il negozio configura le diverse opzioni di pagamento mensili da PSP nell'Admin DEUNA.
- Si tiene conto di quanto segue:
- Il franchise della carta di credito a cui si applica.
- L'importo minimo corrispondente per ogni installazione configurata.
- L'interesse che si applica a ogni franchising.
- Il checkout del negozio mostra la disponibilità MCI quando un cliente entra nel BIN di una carta.
- Il cliente seleziona il pagamento mensile da un elenco indicato nel checkout.
- La transazione viene inviata al PSP per essere elaborata.
Implementazione MCI#
Per utilizzare MSI o MCI, configurare almeno una campagna di installazione.
Per offrire opzioni di installazione:
- Generare le opzioni della campagna
installments_type.
curl --location --request POST 'https://apigw.getduna.com/merchants/{merchant_id}/installments/campaigns' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {merchant_auth_token}' \
--data '{
"name": "new campaign",
"description": "testing campaign MCI",
"status": "active",
"processors": [
{
"id": {processor_id},
"name": {processor_name}
}
],
// display_label_template is optional; that configuration allows you to
// change the format of the field "display_label_amount" of each available
'// option when you generate an installment plan. If you don`t configurate this'
'// field, the template will be the default one.'
"display_label_template": {
"language": "es",
"MSI": "{installments} meses sin intereses de ${amount}",
"MCI": "{installments} meses de ${amount}"
},
"options": [
{
"installments": 3,
"installments_type": "MCI",
"currency": "MXN",
"card_branch": [
{
// minimum amount for installment amount in the plan, this option
// will be valid to generate installment plan only in that case;
// For example, with a total amount of $2100; in 3 installments the amount
// will be of $700, so $700 >= $500, then the option is valid to
// generate an installment plan of $2100 (you can offer 3 installments
// to pay $2100). In the case of having intallments_rate greater than 0,
// first the interest is applied to the amount and then it is compared with the min_amount.
"amount_min": 500,
// optional, the same example than amount_min but with the maximum value.
"amount_max": 2000,
"name": "visa",
// is the percentage applied to the amount in order to generate the options for the plan.
"installment_rate": 1.5,
// use the operators "amount", "rate" and "installments" when calculate the new amount;
// if it's not specified, the calculation is the default for interests: "amount+(amount*(rate/100))"
"installments_interest_formula": "amount+((amount*rate*installments)/100)"
}
]
},
{
"installments": 6,
"installments_type": "MCI",
"currency": "MXN",
"card_branch": [
{
"amount_min": 250,
"amount_max": 1000,
"name": "visa",
}
]
}
// you can offer more options, the installments quantity must be divisible by 3.
]
}'const response = await fetch("https://apigw.getduna.com/merchants/{merchant_id}/installments/campaigns", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer {merchant_auth_token}"
},
body: "{\n \"name\": \"new campaign\",\n \"description\": \"testing campaign MCI\",\n \"status\": \"active\",\n \"processors\": [\n {\n \"id\": {processor_id},\n \"name\": {processor_name}\n }\n ],\n\t\t// display_label_template is optional; that configuration allows you to \n\t\t// change the format of the field \"display_label_amount\" of each available \n \t//"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"POST",
"https://apigw.getduna.com/merchants/{merchant_id}/installments/campaigns",
headers={
"Content-Type": "application/json",
"Authorization": "Bearer {merchant_auth_token}"
},
data="{\n \"name\": \"new campaign\",\n \"description\": \"testing campaign MCI\",\n \"status\": \"active\",\n \"processors\": [\n {\n \"id\": {processor_id},\n \"name\": {processor_name}\n }\n ],\n\t\t// display_label_template is optional; that configuration allows you to \n\t\t// change the format of the field \"display_label_amount\" of each available \n \t//",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://apigw.getduna.com/merchants/{merchant_id}/installments/campaigns",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Authorization: Bearer {merchant_auth_token}"
],
CURLOPT_POSTFIELDS => "{\n \"name\": \"new campaign\",\n \"description\": \"testing campaign MCI\",\n \"status\": \"active\",\n \"processors\": [\n {\n \"id\": {processor_id},\n \"name\": {processor_name}\n }\n ],\n\t\t// display_label_template is optional; that configuration allows you to \n\t\t// change the format of the field \"display_label_amount\" of each available \n \t//"
]);
$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("https://apigw.getduna.com/merchants/{merchant_id}/installments/campaigns"))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {merchant_auth_token}")
.method("POST", HttpRequest.BodyPublishers.ofString("{\n \"name\": \"new campaign\",\n \"description\": \"testing campaign MCI\",\n \"status\": \"active\",\n \"processors\": [\n {\n \"id\": {processor_id},\n \"name\": {processor_name}\n }\n ],\n\t\t// display_label_template is optional; that configuration allows you to \n\t\t// change the format of the field \"display_label_amount\" of each available \n \t//"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://apigw.getduna.com/merchants/{merchant_id}/installments/campaigns", strings.NewReader("{\n \"name\": \"new campaign\",\n \"description\": \"testing campaign MCI\",\n \"status\": \"active\",\n \"processors\": [\n {\n \"id\": {processor_id},\n \"name\": {processor_name}\n }\n ],\n\t\t// display_label_template is optional; that configuration allows you to \n\t\t// change the format of the field \"display_label_amount\" of each available \n \t//"))
if err != nil { panic(err) }
request.Header.Set("Content-Type", "application/json")
request.Header.Set("Authorization", "Bearer {merchant_auth_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))
}- Abilitare i processori di pagamento del vostro negozio per eseguire transazioni con la bandiera
allow_installments: true. Il comportamento della bandiera è il seguente:"MCI" or null: L'importo che va al processore non ha interesse applicato e la transazione deve essere aggiornata dopo essere stata elaborata con l'interesse applicato dal processore. I campi che vengono aggiornati in base alla risposta del processore sono:amountinstallments_amountinstallments_rate
"MSI": Una transazione senza interesse viene eseguita contro il processore che effettua la transazione. L'importo raggiunge il processore con interesse calcolato. L'importo viene aggiornato prima di effettuare la transazione e viene inviato al processore.
Esempio di creazione del processore
curl --location --request POST 'https://apigw.getduna.com/merchants/{merchant_id}/stores/{store_code}/processors' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {merchant_auth_token}' \
--data '{
"name": {processor_name},
"payment_processor_id": {processor_id},
"enabled": true,
"currency_iso3": "MXN",
"external_merchant_id": "your merchant id in payment processor",
"public_api_key": "your public key in payment processor",
"private_api_key": "your private key in payment processor",
"allow_installments": true,
"mci_to_psp_as": "MCI"|"MSI"
}'curl --location --request POST 'https://apigw.getduna.com/merchants/{merchant_id}/stores/{store_code}/processors' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {merchant_auth_token}' \
--data '{
"name": {processor_name},
"payment_processor_id": {processor_id},
"enabled": true,
"currency_iso3": "MXN",
"external_merchant_id": "your merchant id in payment processor",
"public_api_key": "your public key in payment processor",
"private_api_key": "your private key in payment processor",
"allow_installments": true,
"mci_to_psp_as": "MCI"|"MSI"
}'import requests
response = requests.request(
"POST",
"https://apigw.getduna.com/merchants/{merchant_id}/stores/{store_code}/processors",
headers={
"Content-Type": "application/json",
"Authorization": "Bearer {merchant_auth_token}"
},
data="{\n \"name\": {processor_name},\n \"payment_processor_id\": {processor_id},\n \"enabled\": true,\n \"currency_iso3\": \"MXN\",\n \"external_merchant_id\": \"your merchant id in payment processor\",\n \"public_api_key\": \"your public key in payment processor\",\n\t\t\"private_api_key\": \"your private key in payment processor\",\n \"allow_installments\": true,\n\t\t\"mci_to_psp_as\": \"MCI\"|\"MSI\"\n}",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://apigw.getduna.com/merchants/{merchant_id}/stores/{store_code}/processors",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Authorization: Bearer {merchant_auth_token}"
],
CURLOPT_POSTFIELDS => "{\n \"name\": {processor_name},\n \"payment_processor_id\": {processor_id},\n \"enabled\": true,\n \"currency_iso3\": \"MXN\",\n \"external_merchant_id\": \"your merchant id in payment processor\",\n \"public_api_key\": \"your public key in payment processor\",\n\t\t\"private_api_key\": \"your private key in payment processor\",\n \"allow_installments\": true,\n\t\t\"mci_to_psp_as\": \"MCI\"|\"MSI\"\n}"
]);
$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("https://apigw.getduna.com/merchants/{merchant_id}/stores/{store_code}/processors"))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {merchant_auth_token}")
.method("POST", HttpRequest.BodyPublishers.ofString("{\n \"name\": {processor_name},\n \"payment_processor_id\": {processor_id},\n \"enabled\": true,\n \"currency_iso3\": \"MXN\",\n \"external_merchant_id\": \"your merchant id in payment processor\",\n \"public_api_key\": \"your public key in payment processor\",\n\t\t\"private_api_key\": \"your private key in payment processor\",\n \"allow_installments\": true,\n\t\t\"mci_to_psp_as\": \"MCI\"|\"MSI\"\n}"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://apigw.getduna.com/merchants/{merchant_id}/stores/{store_code}/processors", strings.NewReader("{\n \"name\": {processor_name},\n \"payment_processor_id\": {processor_id},\n \"enabled\": true,\n \"currency_iso3\": \"MXN\",\n \"external_merchant_id\": \"your merchant id in payment processor\",\n \"public_api_key\": \"your public key in payment processor\",\n\t\t\"private_api_key\": \"your private key in payment processor\",\n \"allow_installments\": true,\n\t\t\"mci_to_psp_as\": \"MCI\"|\"MSI\"\n}"))
if err != nil { panic(err) }
request.Header.Set("Content-Type", "application/json")
request.Header.Set("Authorization", "Bearer {merchant_auth_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))
}Esempio di aggiornamento del processore
curl --location --request PATCH 'https://apigw.getduna.com/merchants/{merchant_id}/stores/{store_code}/processors/{merchant_payment_processor_id}' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {merchant_auth_token}' \
--data '{
"allow_installments": true,
"mci_to_psp_as": "MCI"|"MSI"
}'curl --location --request PATCH 'https://apigw.getduna.com/merchants/{merchant_id}/stores/{store_code}/processors/{merchant_payment_processor_id}' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {merchant_auth_token}' \
--data '{
"allow_installments": true,
"mci_to_psp_as": "MCI"|"MSI"
}'import requests
response = requests.request(
"PATCH",
"https://apigw.getduna.com/merchants/{merchant_id}/stores/{store_code}/processors/{merchant_payment_processor_id}",
headers={
"Content-Type": "application/json",
"Authorization": "Bearer {merchant_auth_token}"
},
data="{\n \"allow_installments\": true,\n\t\t\"mci_to_psp_as\": \"MCI\"|\"MSI\"\n}",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://apigw.getduna.com/merchants/{merchant_id}/stores/{store_code}/processors/{merchant_payment_processor_id}",
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Authorization: Bearer {merchant_auth_token}"
],
CURLOPT_POSTFIELDS => "{\n \"allow_installments\": true,\n\t\t\"mci_to_psp_as\": \"MCI\"|\"MSI\"\n}"
]);
$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("https://apigw.getduna.com/merchants/{merchant_id}/stores/{store_code}/processors/{merchant_payment_processor_id}"))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {merchant_auth_token}")
.method("PATCH", HttpRequest.BodyPublishers.ofString("{\n \"allow_installments\": true,\n\t\t\"mci_to_psp_as\": \"MCI\"|\"MSI\"\n}"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("PATCH", "https://apigw.getduna.com/merchants/{merchant_id}/stores/{store_code}/processors/{merchant_payment_processor_id}", strings.NewReader("{\n \"allow_installments\": true,\n\t\t\"mci_to_psp_as\": \"MCI\"|\"MSI\"\n}"))
if err != nil { panic(err) }
request.Header.Set("Content-Type", "application/json")
request.Header.Set("Authorization", "Bearer {merchant_auth_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))
}- Verificare se il negozio può utilizzare le rateizzazione preconfigurate fornite da VTEX.
- Quando supportato, le rateizzazione ottenute da VTEX devono corrispondere alle opzioni della campagna e devono già includere gli interessi applicabili.
- In caso contrario, DEUNA costruisce il piano di rateizzazione MCI dalla configurazione della campagna. L'importo dipende da:
installments_rate: Si applica direttamente all'importo se noninstallments_interest_formulaè definito.installments_interest_formula: Se specificato, quindi definisce il calcolo degli interessi in base a:amountrateinstallments
- Configurare l'endpoint DEUNA secondo le rate abilitate in VTEX.
- Creare un endpoint esterno, specificando che è per MCI.
- Se non si configura l'endpoint, viene utilizzato un endpoint predefinito per il caso.
curl --location 'https://apigw.getduna.com/merchants/{merchant_id}/external-endpoints' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {merchant_auth_token}' \
--data '{
"url": "https://middleware.deuna.io/api/v1/merchants/{merchant_id}/transactions/{transaction_id}/installments/mci?bin={bin}&salesChannel=1&paymentProcessors=t1pagos",
"http_method": "GET",
"headers": [
{
"key": "vtex-key-header",
"value": "vtex-value-header"
}
],
"config_type": "MCI"
}'curl --location 'https://apigw.getduna.com/merchants/{merchant_id}/external-endpoints' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {merchant_auth_token}' \
--data '{
"url": "https://middleware.deuna.io/api/v1/merchants/{merchant_id}/transactions/{transaction_id}/installments/mci?bin={bin}&salesChannel=1&paymentProcessors=t1pagos",
"http_method": "GET",
"headers": [
{
"key": "vtex-key-header",
"value": "vtex-value-header"
}
],
"config_type": "MCI"
}'import requests
response = requests.request(
"POST",
"https://apigw.getduna.com/merchants/{merchant_id}/external-endpoints",
headers={
"Content-Type": "application/json",
"Authorization": "Bearer {merchant_auth_token}"
},
json={
"url": "https://middleware.deuna.io/api/v1/merchants/{merchant_id}/transactions/{transaction_id}/installments/mci?bin={bin}&salesChannel=1&paymentProcessors=t1pagos",
"http_method": "GET",
"headers": [
{
"key": "vtex-key-header",
"value": "vtex-value-header"
}
],
"config_type": "MCI"
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://apigw.getduna.com/merchants/{merchant_id}/external-endpoints",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Authorization: Bearer {merchant_auth_token}"
],
CURLOPT_POSTFIELDS => json_encode([
"url" => "https://middleware.deuna.io/api/v1/merchants/{merchant_id}/transactions/{transaction_id}/installments/mci?bin={bin}&salesChannel=1&paymentProcessors=t1pagos",
"http_method" => "GET",
"headers" => [
[
"key" => "vtex-key-header",
"value" => "vtex-value-header"
]
],
"config_type" => "MCI"
])
]);
$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("https://apigw.getduna.com/merchants/{merchant_id}/external-endpoints"))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {merchant_auth_token}")
.method("POST", HttpRequest.BodyPublishers.ofString("{\n \"url\": \"https://middleware.deuna.io/api/v1/merchants/{merchant_id}/transactions/{transaction_id}/installments/mci?bin={bin}&salesChannel=1&paymentProcessors=t1pagos\",\n \"http_method\": \"GET\",\n \"headers\": [\n {\n \"key\": \"vtex-key-header\",\n \"value\": \"vtex-value-header\"\n }\n ],\n \"config_type\": \"MCI\"\n }"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://apigw.getduna.com/merchants/{merchant_id}/external-endpoints", strings.NewReader("{\n \"url\": \"https://middleware.deuna.io/api/v1/merchants/{merchant_id}/transactions/{transaction_id}/installments/mci?bin={bin}&salesChannel=1&paymentProcessors=t1pagos\",\n \"http_method\": \"GET\",\n \"headers\": [\n {\n \"key\": \"vtex-key-header\",\n \"value\": \"vtex-value-header\"\n }\n ],\n \"config_type\": \"MCI\"\n }"))
if err != nil { panic(err) }
request.Header.Set("Content-Type", "application/json")
request.Header.Set("Authorization", "Bearer {merchant_auth_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))
}- Opzioni di installazione.
curl --location --request GET 'https://apigw.getduna.com/merchants/transactions/orders/{orden_token}/installments?bin={card_bin}'
--header 'x-api-key: {x_api_key}'
--header 'Authorization: Bearer {merchant_auth_token}'curl --location --request GET 'https://apigw.getduna.com/merchants/transactions/orders/{orden_token}/installments?bin={card_bin}'
--header 'x-api-key: {x_api_key}'
--header 'Authorization: Bearer {merchant_auth_token}'import requests
response = requests.request(
"GET",
"https://apigw.getduna.com/merchants/transactions/orders/{orden_token}/installments?bin={card_bin}",
headers={
"x-api-key": "{x_api_key}",
"Authorization": "Bearer {merchant_auth_token}"
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://apigw.getduna.com/merchants/transactions/orders/{orden_token}/installments?bin={card_bin}",
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"x-api-key: {x_api_key}",
"Authorization: Bearer {merchant_auth_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("https://apigw.getduna.com/merchants/transactions/orders/{orden_token}/installments?bin={card_bin}"))
.header("x-api-key", "{x_api_key}")
.header("Authorization", "Bearer {merchant_auth_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", "https://apigw.getduna.com/merchants/transactions/orders/{orden_token}/installments?bin={card_bin}", nil)
if err != nil { panic(err) }
request.Header.Set("x-api-key", "{x_api_key}")
request.Header.Set("Authorization", "Bearer {merchant_auth_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))
}- Selezionare un'opzione di installazione.
- Fare l'acquisto con l'opzione di installazione.
curl --location --request POST 'https://api.sandbox.deuna.io/v2/merchants/orders/purchase' \
--header 'x-api-key: {x_api_key}' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {user_auth_token}' \
--data-raw '{
"order_token": "{order_token}",
"payer_info": {
"email": "test123@testuser.com"
},
"payment_source": {
"method_type": "credit_card",
"processor": "{processor_name}",
"card_info": {
"expiry_month": "11",
"expiry_year": "2028",
"card_holder": "DEUNA Developers",
"card_holder_dni": "185396924",
"card_number": "4111111111111111",
"card_cvv": "123",
"address1": "Vergara 548",
"zip": "001100",
"city": "Santiago",
"state": "RM",
"country": "CL",
"phone": "12345755",
"installment": {
"plan_option_id": "{plan_option_id}"
}
}
}
}'curl --location --request POST 'https://api.sandbox.deuna.io/v2/merchants/orders/purchase' \
--header 'x-api-key: {x_api_key}' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {user_auth_token}' \
--data-raw '{
"order_token": "{order_token}",
"payer_info": {
"email": "test123@testuser.com"
},
"payment_source": {
"method_type": "credit_card",
"processor": "{processor_name}",
"card_info": {
"expiry_month": "11",
"expiry_year": "2028",
"card_holder": "DEUNA Developers",
"card_holder_dni": "185396924",
"card_number": "4111111111111111",
"card_cvv": "123",
"address1": "Vergara 548",
"zip": "001100",
"city": "Santiago",
"state": "RM",
"country": "CL",
"phone": "12345755",
"installment": {
"plan_option_id": "{plan_option_id}"
}
}
}
}'import requests
response = requests.request(
"POST",
"https://api.sandbox.deuna.io/v2/merchants/orders/purchase",
headers={
"x-api-key": "{x_api_key}",
"Content-Type": "application/json",
"Authorization": "Bearer {user_auth_token}"
},
json={
"order_token": "{order_token}",
"payer_info": {
"email": "test123@testuser.com"
},
"payment_source": {
"method_type": "credit_card",
"processor": "{processor_name}",
"card_info": {
"expiry_month": "11",
"expiry_year": "2028",
"card_holder": "DEUNA Developers",
"card_holder_dni": "185396924",
"card_number": "4111111111111111",
"card_cvv": "123",
"address1": "Vergara 548",
"zip": "001100",
"city": "Santiago",
"state": "RM",
"country": "CL",
"phone": "12345755",
"installment": {
"plan_option_id": "{plan_option_id}"
}
}
}
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/v2/merchants/orders/purchase",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"x-api-key: {x_api_key}",
"Content-Type: application/json",
"Authorization: Bearer {user_auth_token}"
],
CURLOPT_POSTFIELDS => json_encode([
"order_token" => "{order_token}",
"payer_info" => [
"email" => "test123@testuser.com"
],
"payment_source" => [
"method_type" => "credit_card",
"processor" => "{processor_name}",
"card_info" => [
"expiry_month" => "11",
"expiry_year" => "2028",
"card_holder" => "DEUNA Developers",
"card_holder_dni" => "185396924",
"card_number" => "4111111111111111",
"card_cvv" => "123",
"address1" => "Vergara 548",
"zip" => "001100",
"city" => "Santiago",
"state" => "RM",
"country" => "CL",
"phone" => "12345755",
"installment" => [
"plan_option_id" => "{plan_option_id}"
]
]
]
])
]);
$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("https://api.sandbox.deuna.io/v2/merchants/orders/purchase"))
.header("x-api-key", "{x_api_key}")
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {user_auth_token}")
.method("POST", HttpRequest.BodyPublishers.ofString("{\n \"order_token\": \"{order_token}\",\n \"payer_info\": {\n \"email\": \"test123@testuser.com\"\n },\n \"payment_source\": {\n \"method_type\": \"credit_card\",\n \"processor\": \"{processor_name}\",\n \"card_info\": {\n \"expiry_month\": \"11\",\n \"expiry_year\": \"2028\",\n \"card_holder\": \"DEUNA Developers\",\n \"card_holder_dni\": \"185396924\",\n \"card_number\": \"4111111111111111\",\n \"card_cvv\": \"123\",\n \"address1\": \"Vergara 548\",\n \"zip\": \"001100\",\n \"city\": \"Santiago\",\n \"state\": \"RM\",\n \"country\": \"CL\",\n \"phone\": \"12345755\",\n \"installment\": {\n \"plan_option_id\": \"{plan_option_id}\"\n }\n }\n }\n}"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://api.sandbox.deuna.io/v2/merchants/orders/purchase", strings.NewReader("{\n \"order_token\": \"{order_token}\",\n \"payer_info\": {\n \"email\": \"test123@testuser.com\"\n },\n \"payment_source\": {\n \"method_type\": \"credit_card\",\n \"processor\": \"{processor_name}\",\n \"card_info\": {\n \"expiry_month\": \"11\",\n \"expiry_year\": \"2028\",\n \"card_holder\": \"DEUNA Developers\",\n \"card_holder_dni\": \"185396924\",\n \"card_number\": \"4111111111111111\",\n \"card_cvv\": \"123\",\n \"address1\": \"Vergara 548\",\n \"zip\": \"001100\",\n \"city\": \"Santiago\",\n \"state\": \"RM\",\n \"country\": \"CL\",\n \"phone\": \"12345755\",\n \"installment\": {\n \"plan_option_id\": \"{plan_option_id}\"\n }\n }\n }\n}"))
if err != nil { panic(err) }
request.Header.Set("x-api-key", "{x_api_key}")
request.Header.Set("Content-Type", "application/json")
request.Header.Set("Authorization", "Bearer {user_auth_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))
}Test MCI#
Per creare la campagna è necessario:
- Sii autenticato come mercante.
- Configurare i processori che offrono gli installments.
- I processori devono avere il nome e l'identità dell'ecosistema DEUNA.
Esempio
{
"processors": [
{
"id": 39,
"name": "mercadopago"
}
]
}La stessa campagna deve avere le sue opzioni con "installments_type": "MCI".
Esempio
{
"options": [
{
"installments": 3,
"installments_type": "MCI",
"currency": "MXN",
"card_branch": [
...
]
}
]
}Entro la fine del mese card_branch# "name" può essere:
visamastercardamex
Codici di risposta previsti
- 201: Creazione di campagne di successo.
- 401: Non autorizzato a creare la campagna.
- 400: Richiesta non valida.
Per creare processori di pagamento mercantile, è necessario:
- Autentiche come mercante.
- Avere le credenziali necessarie per eseguire le transazioni di installazione.
Installazioni con VTEX
Verificare la disponibilità di MCI per il negozio VTEX richiesto con il proprio rappresentante DEUNA prima dei test di recupero delle rateizzazione.
Il rappresentante DEUNA confermerà il negozio idoneo, la campagna, le connessioni del processore di pagamento e se i valori di rateizzazione forniti da VTEX o il calcolo della campagna di DEUNA sono autorevoli.
Se avete bisogno di una configurazione aggiuntiva per impostare un endpoint con specifiche credenziali per VTEX, è necessario creare un endpoint esterno.
Codici di risposta previsti
- 200: Creazione di un punto di fine esterno.
- 401: Non autorizzato a creare endpoint esterno.
- 400: Richiesta non valida.
Installazioni di query
Accostare il piano di installazione con la scheda BIN dopo aver creato un ordine.
Codici di risposta previsti
- 200: Recuperare con successo il piano di rate.
- 401: Non autorizzato a creare il processore di pagamento mercantile.
- 400: Richiesta non valida.
- 404: Nessun processore di pagamento mercantile configurato correttamente.
Carte di prova
Fornire tutti i dati della scheda di prova dal processore.
In generale i dati sono:
"card_number""card_cvv""expiry_year""expiry_month""card_holder"
Codici di risposta previsti
- 200: transazione di successo.
- 401: L'utente non autorizzato a effettuare l'acquisto.
- 400: richiesta non valida, come il commerciante non avendo abilitato i processori di pagamento mercantile.
- 422: La transazione non poteva essere eseguita perché il processore ha rifiutato.