curl --request POST \
--url https://your-app-domain.com/payments/execute \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"amount": 15000,
"currency": "CLP",
"description": "Pedido #12345 - Restaurante XYZ",
"transactionId": "txn_abc123def456",
"orderId": "order_xyz789",
"externalUserId": "user_12345",
"transactionCode": "app_txn_987654"
}
'import requests
url = "https://your-app-domain.com/payments/execute"
payload = {
"amount": 15000,
"currency": "CLP",
"description": "Pedido #12345 - Restaurante XYZ",
"transactionId": "txn_abc123def456",
"orderId": "order_xyz789",
"externalUserId": "user_12345",
"transactionCode": "app_txn_987654"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
amount: 15000,
currency: 'CLP',
description: 'Pedido #12345 - Restaurante XYZ',
transactionId: 'txn_abc123def456',
orderId: 'order_xyz789',
externalUserId: 'user_12345',
transactionCode: 'app_txn_987654'
})
};
fetch('https://your-app-domain.com/payments/execute', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://your-app-domain.com/payments/execute",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'amount' => 15000,
'currency' => 'CLP',
'description' => 'Pedido #12345 - Restaurante XYZ',
'transactionId' => 'txn_abc123def456',
'orderId' => 'order_xyz789',
'externalUserId' => 'user_12345',
'transactionCode' => 'app_txn_987654'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-app-domain.com/payments/execute"
payload := strings.NewReader("{\n \"amount\": 15000,\n \"currency\": \"CLP\",\n \"description\": \"Pedido #12345 - Restaurante XYZ\",\n \"transactionId\": \"txn_abc123def456\",\n \"orderId\": \"order_xyz789\",\n \"externalUserId\": \"user_12345\",\n \"transactionCode\": \"app_txn_987654\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://your-app-domain.com/payments/execute")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 15000,\n \"currency\": \"CLP\",\n \"description\": \"Pedido #12345 - Restaurante XYZ\",\n \"transactionId\": \"txn_abc123def456\",\n \"orderId\": \"order_xyz789\",\n \"externalUserId\": \"user_12345\",\n \"transactionCode\": \"app_txn_987654\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://your-app-domain.com/payments/execute")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": 15000,\n \"currency\": \"CLP\",\n \"description\": \"Pedido #12345 - Restaurante XYZ\",\n \"transactionId\": \"txn_abc123def456\",\n \"orderId\": \"order_xyz789\",\n \"externalUserId\": \"user_12345\",\n \"transactionCode\": \"app_txn_987654\"\n}"
response = http.request(request)
puts response.read_body{
"status": "completed",
"receipt": "REC-2024-001234",
"operationNumber": "OP-987654321",
"message": "Pago procesado exitosamente"
}Ejecutar pago
Endpoint para procesar el pago después de la verificación y autorización exitosa
curl --request POST \
--url https://your-app-domain.com/payments/execute \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"amount": 15000,
"currency": "CLP",
"description": "Pedido #12345 - Restaurante XYZ",
"transactionId": "txn_abc123def456",
"orderId": "order_xyz789",
"externalUserId": "user_12345",
"transactionCode": "app_txn_987654"
}
'import requests
url = "https://your-app-domain.com/payments/execute"
payload = {
"amount": 15000,
"currency": "CLP",
"description": "Pedido #12345 - Restaurante XYZ",
"transactionId": "txn_abc123def456",
"orderId": "order_xyz789",
"externalUserId": "user_12345",
"transactionCode": "app_txn_987654"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
amount: 15000,
currency: 'CLP',
description: 'Pedido #12345 - Restaurante XYZ',
transactionId: 'txn_abc123def456',
orderId: 'order_xyz789',
externalUserId: 'user_12345',
transactionCode: 'app_txn_987654'
})
};
fetch('https://your-app-domain.com/payments/execute', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://your-app-domain.com/payments/execute",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'amount' => 15000,
'currency' => 'CLP',
'description' => 'Pedido #12345 - Restaurante XYZ',
'transactionId' => 'txn_abc123def456',
'orderId' => 'order_xyz789',
'externalUserId' => 'user_12345',
'transactionCode' => 'app_txn_987654'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-app-domain.com/payments/execute"
payload := strings.NewReader("{\n \"amount\": 15000,\n \"currency\": \"CLP\",\n \"description\": \"Pedido #12345 - Restaurante XYZ\",\n \"transactionId\": \"txn_abc123def456\",\n \"orderId\": \"order_xyz789\",\n \"externalUserId\": \"user_12345\",\n \"transactionCode\": \"app_txn_987654\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://your-app-domain.com/payments/execute")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 15000,\n \"currency\": \"CLP\",\n \"description\": \"Pedido #12345 - Restaurante XYZ\",\n \"transactionId\": \"txn_abc123def456\",\n \"orderId\": \"order_xyz789\",\n \"externalUserId\": \"user_12345\",\n \"transactionCode\": \"app_txn_987654\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://your-app-domain.com/payments/execute")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": 15000,\n \"currency\": \"CLP\",\n \"description\": \"Pedido #12345 - Restaurante XYZ\",\n \"transactionId\": \"txn_abc123def456\",\n \"orderId\": \"order_xyz789\",\n \"externalUserId\": \"user_12345\",\n \"transactionCode\": \"app_txn_987654\"\n}"
response = http.request(request)
puts response.read_body{
"status": "completed",
"receipt": "REC-2024-001234",
"operationNumber": "OP-987654321",
"message": "Pago procesado exitosamente"
}/payments/verify.Cuerpo de la solicitud
Ejemplo de solicitud
{
"amount": 15000,
"currency": "CLP",
"description": "Pedido #12345 - Restaurante XYZ",
"transactionId": "txn_abc123def456",
"orderId": "order_xyz789",
"externalUserId": "user_12345",
"transactionCode": "app_txn_987654"
}
Respuesta exitosa
completed, pending, failed.Ejemplo de respuesta exitosa
{
"status": "completed",
"receipt": "REC-2024-001234",
"operationNumber": "OP-987654321",
"message": "Pago procesado exitosamente"
}
Respuesta pendiente
Si el pago queda en estado pendiente (por ejemplo, requiere confirmación adicional):{
"status": "pending",
"message": "Pago en proceso, se notificará el resultado"
}
Respuesta fallida
Si el procesamiento falla:{
"status": "failed",
"message": "Error al procesar el pago: [descripción del error]"
}
Códigos de estado
Verificación de estado de transacción
Para reducir posibles problemas de conexión (timeout), Justo puede necesitar verificar el estado de una transacción. Se recomienda implementar un endpoint adicional que permita consultar el estado de una transacción usando:- El
transactionCodeproporcionado durante la verificación - El
transactionIdde Justo
completed, pending, failed) para permitir que Justo confirme, rechace o deje en estado pendiente la transacción en caso de fallas.
Notas importantes
- Deducir el monto de la cuenta del usuario
- Acreditar el monto en la cuenta del destinatario (comercio)
- Generar un recibo o número de operación si aplica
- Registrar la transacción para auditoría
pending, es responsabilidad de la aplicación contenedora notificar a Justo cuando el estado cambie, o proporcionar un endpoint para que Justo consulte el estado periódicamente.receipt o operationNumber retornado puede ser usado por Justo para referencia y auditoría de la transacción.Authorizations
Propuesta de esquema de autenticación. Token de autenticación que debe ser coordinado entre Justo y la aplicación contenedora. El mecanismo específico debe acordarse entre ambos equipos técnicos.
Body
Propuesta de esquema de solicitud. Estructura propuesta para la ejecución de pagos que Justo enviará a la aplicación contenedora.
Monto de la transacción a procesar
15000
Moneda de la transacción
"CLP"
Descripción del cargo que se realizará al usuario
"Pedido #12345 - Restaurante XYZ"
Identificador único de la transacción generado por Justo
"txn_abc123def456"
Identificador del pedido asociado a esta transacción
"order_xyz789"
Identificador del usuario en la aplicación contenedora
"user_12345"
Código de transacción retornado por el endpoint de verificación
"app_txn_987654"
Response
La solicitud fue procesada
Propuesta de esquema de respuesta. Estructura propuesta que la aplicación contenedora debe retornar a Justo después de ejecutar un pago.
Estado del procesamiento
completed, pending, failed "completed"
Número de recibo o operación que identifica la transacción
"REC-2024-001234"
Número de operación generado por la aplicación contenedora
"OP-987654321"
Mensaje descriptivo sobre el resultado del procesamiento
"Pago procesado exitosamente"