Cuotas con interés (MCI)
Pagos mensuales con intereses es una opción de pago que permite a tus clientes dividir el coste de una compra en varias cuotas mensuales, aplicando intereses sobre el saldo pendiente.
Con MCI, un cliente paga una tasa de interés adicional por dividir el costo de compra en cuotas mensuales.
Cuando un cliente opta por pagar mediante Pagos Mensuales con intereses, el costo total de la compra se divide en cuotas mensuales y se aplican tasas de interés sobre el saldo restante en cada período.
Cómo funciona MCI#
Así es como funciona un flujo MCI:
- La tienda configura las diferentes opciones de pago mensual por PSP en el Admin de DEUNA.
- Se tiene en cuenta lo siguiente:
- La franquicia de tarjetas de crédito a la que se aplica.
- El monto mínimo respectivo para cada cuota configurada.
- El interés que se aplica a cada franquicia.
- La caja de la tienda muestra la disponibilidad de MCI cuando un cliente ingresa el BIN de una tarjeta.
- El cliente selecciona el pago mensual de una lista que se muestra en el proceso de pago.
- La transacción se envía al PSP para su procesamiento.
Implementar MCI#
Para utilizar MSI o MCI, configure al menos una campaña de cuotas.
Para ofrecer opciones de pago a plazos:
- Generar las opciones de campaña.
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))
}- Habilite los procesadores de pagos de su tienda para realizar transacciones con la bandera
allow_installments: true. El comportamiento de la bandera es el siguiente:"MCI" or null: El monto que va al procesador no tiene intereses aplicados y la transacción debe actualizarse luego de ser procesada con los intereses aplicados por el procesador. Los campos que se actualizan en función de la respuesta del procesador son:amountinstallments_amountinstallments_rate
"MSI": Una transacción sin intereses se realiza contra el procesador que realiza la transacción. El importe llega al procesador con el interés calculado. El importe se actualiza antes de realizar la transacción y ser enviado al procesador.
Ejemplo para crear el procesador
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))
}Ejemplo para actualizar el procesador
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))
}- Verifique si la tienda puede utilizar los plazos preconfigurados proporcionados por VTEX.
- Cuando esté soportado, los plazos obtenidos de VTEX deben coincidir con las opciones de la campaña y ya deben incluir los intereses aplicables.
- De lo contrario, DEUNA construye el plan de pago MCI a partir de la configuración de la campaña. La cantidad depende de:
installments_rate: Se aplica al monto directamente si noinstallments_interest_formulaestá definido.installments_interest_formula: Si se especifica, define el cálculo de intereses en función de:amountrateinstallments
- Configurar el endpoint DEUNA según las cuotas habilitadas en VTEX.
- Cree un punto final externo, especificando que es para MCI.
- Si no configura el punto final, se utiliza un punto final predeterminado para el 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))
}- Consultar opciones de pago en cuotas.
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))
}- Seleccione una opción de pago a plazos.
- Realiza la compra con la opción de pago en cuotas.
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))
}Prueba de deterioro cognitivo leve#
Para crear la campaña es necesario:
- Estar autenticado como comerciante.
- Configura los procesadores que ofrecen cuotas.
- Los procesadores deben tener el id y nombre del ecosistema DEUNA.
Ejemplo
{
"processors": [
{
"id": 39,
"name": "mercadopago"
}
]
}La misma campaña debe tener sus opciones con "installments_type": "MCI".
Ejemplo
{
"options": [
{
"installments": 3,
"installments_type": "MCI",
"currency": "MXN",
"card_branch": [
...
]
}
]
}dentro card_branch, el "name" puede ser:
visamastercardamex
Códigos de respuesta esperados
- 201: Creación de campaña exitosa.
- 401: No autorizado para crear la campaña.
- 400: Solicitud no válida.
Para crear procesadores de pagos comerciales, debe:
- Autenticarse como comerciante.
- Contar con las credenciales necesarias para realizar transacciones a plazos.
Cuotas con VTEX
Verifique la disponibilidad de MCI para la tienda VTEX requerida con su representante de DEUNA antes de probar la recuperación de plazos.
El representante de DEUNA confirmará la tienda elegible, la campaña, las conexiones de procesadores y si los valores de plazos proporcionados por VTEX o el cálculo de la campaña de DEUNA son los autoritarios.
Si requiere alguna configuración adicional para configurar un endpoint con credenciales específicas para VTEX, deberá crear un endpoint externo.
Códigos de respuesta esperados
- 200: Creación exitosa de punto final externo.
- 401: No autorizado para crear un punto final externo.
- 400: Solicitud no válida.
Consulta de cuotas
Consulta el plan de cuotas con la tarjeta BIN después de crear un pedido.
Códigos de respuesta esperados
- 200: Recuperación exitosa del plan de cuotas.
- 401: No autorizado para crear un procesador de pagos comerciales.
- 400: Solicitud no válida.
- 404: No hay procesadores de pagos comerciales configurados correctamente.
Tarjetas de prueba
Proporcione todos los datos de la tarjeta de prueba del procesador.
En general los datos son:
"card_number""card_cvv""expiry_year""expiry_month""card_holder"
Códigos de respuesta esperados
- 200: transacción exitosa.
- 401: Usuario no autorizado para realizar la compra.
- 400: Solicitud no válida, como que el comerciante no ha habilitado los procesadores de pagos comerciales.
- 422: La transacción no se pudo realizar porque el procesador la rechazó.