Parcelamento com juros (MCI)
Nesta página
A mensalidade com juros é uma opção de pagamento que permite ao seu cliente dividir o custo de uma compra em diversas parcelas mensais, com juros aplicados sobre o saldo devedor.
Com o MCI, o cliente paga uma taxa de juros adicional pela divisão do custo de compra em parcelas mensais.
Quando o cliente opta pelo pagamento Mensal com juros, o custo total da compra é dividido em parcelas mensais e incidem taxas de juros sobre o saldo restante de cada período.
Como funciona o MCI#
Veja como funciona um fluxo MCI:
- A loja configura as diferentes opções de pagamento mensal por PSP no DEUNA Admin.
- O seguinte é levado em consideração:
- A franquia de cartão de crédito à qual se aplica.
- O respectivo valor mínimo para cada parcela configurada.
- Os juros que se aplicam a cada franquia.
- O checkout da loja mostra a disponibilidade do MCI quando um cliente insere o BIN de um cartão.
- O cliente seleciona o pagamento mensal em uma lista exibida na finalização da compra.
- A transação é enviada ao PSP para ser processada.
Implementar MCI#
Para usar MSI ou MCI, configure pelo menos uma campanha parcelada.
Para oferecer opções de parcelamento:
- Gere as opções de campanha
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 os processadores de pagamento da sua loja para realizar transações com a bandeira
allow_installments: true. O comportamento do sinalizador é o seguinte:"MCI" or null: O valor que vai para o processador não tem juros aplicados e a transação deve ser atualizada após ser processada com os juros aplicados pelo processador. Os campos atualizados com base na resposta do processador são:amountinstallments_amountinstallments_rate
"MSI": Uma transação sem juros é realizada contra o processador que realiza a transação. O valor chega ao processador com juros calculados. O valor é atualizado antes de realizar a transação e ser enviado ao processador.
Exemplo para criar o processador
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))
}Exemplo para atualizar o processador
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 se a loja pode utilizar parcelamentos pré-configurados fornecidos pelo VTEX.
- Quando suportado, os parcelamentos obtidos do VTEX devem corresponder às opções da campanha e já devem incluir os juros aplicáveis.
- Caso contrário, a DEUNA constrói o plano de parcelamento MCI a partir da configuração da campanha. O valor depende de:
installments_rate: Aplica-se diretamente ao valor se nãoinstallments_interest_formulaestá definido.installments_interest_formula: se especificado, define o cálculo de juros com base em:amountrateinstallments
- Configure o endpoint DEUNA de acordo com as parcelas habilitadas na VTEX.
- Crie um terminal externo, especificando que é para MCI.
- Se você não configurar o terminal, um terminal padrão será usado para o 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 opções de parcelamento.
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))
}- Selecione uma opção de parcelamento.
- Faça a compra com a opção de parcelamento.
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))
}Teste MCI#
Para criar a campanha é necessário:
- Seja autenticado como comerciante.
- Configure as processadoras que oferecem parcelamento.
- Os processadores devem ter o id e nome do ecossistema DEUNA.
Exemplo
{
"processors": [
{
"id": 39,
"name": "mercadopago"
}
]
}A mesma campanha deve ter suas opções com "installments_type": "MCI".
Exemplo
{
"options": [
{
"installments": 3,
"installments_type": "MCI",
"currency": "MXN",
"card_branch": [
...
]
}
]
}Dentro card_branch, o "name" pode ser:
visamastercardamex
Códigos de resposta esperados
- 201: Criação de campanha bem-sucedida.
- 401: Não autorizado a criar a campanha.
- 400: Solicitação inválida.
Para criar processadores de pagamento de comerciante, você deve:
- Autentique-se como comerciante.
- Tenha as credenciais necessárias para realizar transações parceladas.
Parcelamento com VTEX
Verifique a disponibilidade do MCI para a loja VTEX específica com a sua DEUNA TAM antes de testar a recuperação de parcelamentos.
O TAM confirmará a loja elegível, a campanha, as conexões de processador e se os valores de parcelamento do VTEX ou o cálculo da campanha da DEUNA são os autoritativos.
Caso necessite de alguma configuração adicional para configurar um endpoint com credenciais específicas para VTEX, você deverá criar um endpoint externo.
Códigos de resposta esperados
- 200: Criação bem-sucedida de endpoint externo.
- 401: Não autorizado a criar endpoint externo.
- 400: Solicitação inválida.
Consultar parcelas
Consulte o parcelamento com o BIN do cartão após criar um pedido.
Códigos de resposta esperados
- 200: Recuperação bem-sucedida do parcelamento.
- 401: Não autorizado a criar processador de pagamentos de comerciante.
- 400: Solicitação inválida.
- 404: Nenhum processador de pagamento do comerciante configurado corretamente.
Cartões de teste
Forneça todos os dados do cartão de teste do processador.
Em geral os dados são:
"card_number""card_cvv""expiry_year""expiry_month""card_holder"
Códigos de resposta esperados
- 200: Transação bem-sucedida.
- 401: Usuário não autorizado a realizar a compra.
- 400: Solicitação inválida, como o comerciante não ter habilitado os processadores de pagamento do comerciante.
- 422: A transação não pôde ser executada porque o processador a recusou.