Creación de pagos
Para poder crear pagos a través de la API de Tuyo Pay se deberá consultar los endpoints que se mostrarán en esta referencia.
Conceptos básicos
A continuación mostramos los conceptos necesarios para poder efectuar una integración exitosa.
API Key
Esto nos servirá de llave para obtener los insumos necesarios para efectuar la transacción y realizar el pago. Los clientes pueden solicitar que se les brinde un API Key para producción y otro para entorno de pruebas.
El API Key debe ser enviado en los headers
de la petición con el nombre x-api-token
.
Timestamp
El timestamp se debe enviar como parámetro en la URL de cada petición, esto nos servirá para verificar que la petición se esta ejecutando justo en el momento en que se consulta la API.
Ejemplos de cómo obtener el timestamp en distintos lenguajes:
const timestamp = new Date().getTime();
// Ejemplo de construcción de la url de la petición
const request = `https://${API_URL}?timestamp=${timestamp}`;
<?php
$date = new DateTimeImmutable();
$timestamp = (int)$date->format('Uv');
// Ejemplo de construcción de la url de la petición
$request = "https://" . $API_URL . "?timestamp=" . $timestamp;
?>
from time import time
timestamp = int(time() * 1000)
// Ejemplo de construcción de la url de la petición
request = "https://" + API_URL + "?timestamp=" + timestamp;
current_time = Time.now
// Ejemplo de construcción de la url de la petición
request = "https://" + API_URL + "?timestamp=" + current_time.strftime('%s%L')
Códigos de Respuesta
Ayudan a clasificar las peticiones en exitosas o erróneas. A continuación se muestran los posibles códigos de respuesta:
Código | Tipo | Descripción |
---|---|---|
200 | Exitosa | La petición fue realizada exitosamente |
400 | Error | Error realizar la acción en el servidor |
401 | Error | Error al autorizar la petición |
403 | Error | La acción no está permitida |
404 | Error | El recurso o el endpoint no esta disponible |
409 | Error | Error en el envío de datos |
500 | Error | Error interno del servidor |
POST /api/make_payment
Este endpoint se utiliza para crear un pago.
Descripción de los Headers
Requerido | Campo | Valor | Descripción |
---|---|---|---|
no | Content-Type | "application/json" | Tipo de contenido del body |
si | x-api-token | ${API_KEY} | API key proporcionada anteriormente |
Descripción del Body
Requerido | Campo | Tipo de Dato | Descripción |
---|---|---|---|
si | amount | Double | Monto total del pago |
si | phone | String | Número de teléfono del cliente |
no | concept | String | Concepto del recibo |
si | store | Double | Nombre del comercio |
si | firstname | String | Nombre del cliente |
si | lastname | String | Apellido del cliente |
si | email | String | Email del cliente |
si | transactions | String | Array de transacciones encriptado(*) |
si | transactions.number | String | Numero de la tarjeta |
si | transactions.amount | String | Monto a pagar (en centavos) |
si | transactions.type | String | Tipo de transacción (tarjeta o puntos) |
si | transactions.cvv | String | Código CVV |
si | transactions.exp | String | Fecha de expiración de la tarjeta (MM/YY) |
ℹ️ El método de encriptado para el campo
transactions
es proporcionado únicamente durante las reuniones técnicas de integración.
Ejemplos
- Ejemplo del body request sin encriptamiento de
transactions
{
"amount": 20.5,
"phone": "12345678",
"concept": "PAGO",
"store": "Tuyoapp",
"firstname": "Juan",
"lastname": "Perez",
"email": "jprz@yopmail.com",
"transactions": [
{
"number": "4111111111111111",
"amount": "000000001050",
"type": "CARD",
"cvv": "123",
"exp": "09/22"
},
{
"number": "4111111111111111",
"amount": "000000001000",
"type": "POINTS",
"cvv": "123",
"exp": "09/22"
}
]
}
- Ejemplos de la petición
POST
en diferentes lenguajes:
POST https://test.tuyoanalytics.com/api/make_payment?timestamp=1656461076
const request = new XMLHttpRequest();
const { API_KEY } = process.env;
const timestamp = new Date().getTime();
const ENDPOINT = `https://${API_URL}?timestamp=${timestamp}`
request.open('POST', $ENDPOINT);
request.setRequestHeader('Content-Type', 'application/json');
request.setRequestHeader('x-api-token', `${API_KEY}`);
request.onreadystatechange = function () {
if (this.readyState === 4) {
console.log('Status:', this.status);
console.log('Headers:', this.getAllResponseHeaders());
console.log('Body:', this.responseText);
}
};
const body = {
'amount': 20.5,
'phone': "12345678",
'concept': 'PAGO',
'store': 'Tuyoapp',
'firstname': 'Juan',
'lastname': 'Perez',
'email': 'jprz@yopmail.com',
'transactions': '53616c7465645f5fe40e863810179c3dca0721a1eeed27b2d1feedf3529ef33da7914da18d4b6c0a06e6c7c3f7eaf16bc304d7cde974bdfd2872cc1a88d40caa21d8b312e4652379854292bbece1cb11b12cf23d956eb234deb523b06a9d4ba49ab3bb3dd597041c8037850560e9ed701e6fd500bc3f4117d6406fa138e3187ac804a289b90c6c0b4aa2b20f14f3846e458bb36a03f23eefc4ebc4f2275dd321016941a6f3f8adf19a260eb8663a3e2969aaae6822b9eabfa3ce2bc71904dff0ecb822181ddfa24ee1d4d1de02ec4401'
};
request.send(JSON.stringify(body));
<?php
$ch = curl_init();
$date = new DateTimeImmutable();
$timestamp = (int)$date->format('Uv');
$endpoint = "https://" . $API_URL . "?timestamp=" . $timestamp;
curl_setopt($ch, CURLOPT_URL, $endpoint);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, "{
\"amount\": 20.5,
\"phone\": \"12345678\",
\"concept\": \"PAGO\",
\"store\": \"Tuyoapp\",
\"firstname\": \"Juan\",
\"lastname\": \"Perez\",
\"email\": \"jprz@yopmail.com\",
\"transactions\": \"53616c7465645f5fe40e863810179c3dca0721a1eeed27b2d1feedf3529ef33da7914da18d4b6c0a06e6c7c3f7eaf16bc304d7cde974bdfd2872cc1a88d40caa21d8b312e4652379854292bbece1cb11b12cf23d956eb234deb523b06a9d4ba49ab3bb3dd597041c8037850560e9ed701e6fd500bc3f4117d6406fa138e3187ac804a289b90c6c0b4aa2b20f14f3846e458bb36a03f23eefc4ebc4f2275dd321016941a6f3f8adf19a260eb8663a3e2969aaae6822b9eabfa3ce2bc71904dff0ecb822181ddfa24ee1d4d1de02ec4401\"
}");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Content-Type: application/json",
"x-api-token: " . getenv('API_KEY')
));
$response = curl_exec($ch);
curl_close($ch);
var_dump($response);
import os
from urllib2 import Request, urlopen
from time import time
timestamp = int(time() * 1000)
endpoint = 'https://' + API_URL + '?timestamp=' + timestamp;
values = """
{
"amount": 20.5,
"phone": "12345678",
"concept": "PAGO",
"store": "Tuyoapp",
"firstname": "Juan",
"lastname": "Perez",
"email": "jprz@yopmail.com",
"transactions": "53616c7465645f5fe40e863810179c3dca0721a1eeed27b2d1feedf3529ef33da7914da18d4b6c0a06e6c7c3f7eaf16bc304d7cde974bdfd2872cc1a88d40caa21d8b312e4652379854292bbece1cb11b12cf23d956eb234deb523b06a9d4ba49ab3bb3dd597041c8037850560e9ed701e6fd500bc3f4117d6406fa138e3187ac804a289b90c6c0b4aa2b20f14f3846e458bb36a03f23eefc4ebc4f2275dd321016941a6f3f8adf19a260eb8663a3e2969aaae6822b9eabfa3ce2bc71904dff0ecb822181ddfa24ee1d4d1de02ec4401"
}
"""
headers = {
'Content-Type': 'application/json',
'x-api-token': os.getenv('API_KEY')
}
request = Request(endpoint, data=values, headers=headers)
response_body = urlopen(request).read()
print response_body
require 'rubygems' if RUBY_VERSION < '1.9'
require 'rest_client'
current_time = Time.now
endpoint = 'https://' + API_URL + '?timestamp=' + current_time.strftime('%s%L')
values = '{
"amount": 20,
"phone": 12345678,
"concept": "PAGO",
"store": "Tuyoapp",
"firstname": "Juan",
"lastname": "Perez",
"email": "jprz@yopmail.com",
"transactions": "53616c7465645f5fe40e863810179c3dca0721a1eeed27b2d1feedf3529ef33da7914da18d4b6c0a06e6c7c3f7eaf16bc304d7cde974bdfd2872cc1a88d40caa21d8b312e4652379854292bbece1cb11b12cf23d956eb234deb523b06a9d4ba49ab3bb3dd597041c8037850560e9ed701e6fd500bc3f4117d6406fa138e3187ac804a289b90c6c0b4aa2b20f14f3846e458bb36a03f23eefc4ebc4f2275dd321016941a6f3f8adf19a260eb8663a3e2969aaae6822b9eabfa3ce2bc71904dff0ecb822181ddfa24ee1d4d1de02ec4401"
}'
headers = {
:content_type => 'application/json',
:x_api_token => ENV["API_KEY"]
}
response = RestClient.post endpoint, values, headers
puts response