Tarjetas Éxito y Alkosto (Tuya)
¿Cómo funciona?
- Se muestra como opción de pago Tarjeta Éxito y Tarjeta Alkosto, lo cual dependerá de que el comercio active estos medios de pago.
- Una vez el usuario la selecciona el medio de pago y confirma la operación, debe consumirse el servicio para realizar la petición de la transacción.
- Si la petición es exitosa se retorna la URL a la cual debe enviarse al cliente para que realice la operación en en medio de pago. En caso contrario se retorna el motivo del rechazo de la transacción.
- Almacenar los datos de la transacción retornados por el servicio (identificador de la transacción, autorización, identificador sesión de placetopay).
- Redirigir el navegador a la URL retornada en caso de exito.
- Una vez la transacción retorna (retorna a la URL especificada en el consumo del crear transacción), se debe preguntar por el estado de la transacción mediante el consumo un servicio.
- Dependiendo de la respuesta del servicio, la transacción puede haber sido aprobada, rechazada o seguir pendiente de procesamiento.
- Informar al usuario el estado de la transacción.
- Si la transacción está pendiente, o si el cliente al abandonar el portal no ha regresado, se debe tener una sonda que pregunte por el estado de la transacción.
Reingreso del cliente
Una vez el cliente ha finalizado la transacción en la interfaz del banco, el banco redirige al cliente a la URL especificada al crear la transacción, en este punto de entrada a su aplicativo, deberás consumir el servicio getTransactionInformation que permite determinar el estado de la transacción. Sólo si la transacción tiene estado OK, se debe a que fue autorizada. Por el contrario, si obtiene un estado PENDING, es porque aún no hay respuesta final del banco sobre la transacción.
Ya sea que el cliente retorne al punto de reingreso y que la transacción esté pendiente, o que haya abandonado la operación y haya roto el flujo normal, se deberá consumir el servicio getTransactionInformation para todas las operaciones que desde que fue invocado el createTransaction llevan más de 7 minutos sin un estado final de operación.
Confirmación y redirección al banco
Una vez se poseen los datos del pagador y comprador, así como la información de qué medio de pago usar deberá entonces consumir el servicio de createTransaction para obtener la URL a la cual deberá redirigir al cliente para finalizar la transacción.
Los datos solicitados para crear la transacción se requiere la dirección IP desde la cual el cliente está realizando la transacción, así como la información del navegador usado. Si lo deseas, puedes proveer datos adicionales con la transacción, que permitirán tener esta información disponible en la consola administrativa. Recuerda que el documento del pagador es el documento del dueño de la tarjeta y no podrá ser modificado posteriormente en la interfaz de Tuya para ese medio de pago.
Si la respuesta del servicio es SUCCESS, entonces debes almacenar la información retornada en tu base de datos, el transactionID es muy importante pues este es el identificador para consultar el estado final de la transacción.
Ten en cuenta que una respuesta SUCCESS en este punto sólo implica que la transacción ha sido aprovisionada por Tuya y está en espera que el cliente llegue a la interfaz del medio de pago, se autentique y autorice la operación iniciada.
Al crear la transacción, esta puede fallar; algunos motivos incluyen montos por fuera del rango permitido, no disponibilidad del medio de pago, problemas de configuración de la cuenta recaudadora, entre otros. Utiliza la propiedad responseReasonText para obtener el por qué falló la creación de la transacción. Algunos códigos no relacionados con el pagador pueden indicar que generes una alerta sobre problemas con la disponibilidad del servicio, particularmente los relacionados con mala configuración.
Una vez has almacenado la información en su base de datos y confirmado que es exitosa la petición, se redirigirá al cliente a la URL del medio de pago. La redirección a la interfaz del medio de pago no debe realizarse en un frame o cualquier otro mecanismo que oculte la URL en la cual el cliente ingresará sus datos de autenticación.
Descripción de la interfaz del Webservice
A continuación, describimos los métodos que el webservice brinda. Las operaciones descritas a continuación son tipo petición – respuesta. Además, se describen cada una de las operaciones expuestas por el webservice y se muestran los parámetros de entrada a cada operación y vínculos a las estructuras de datos usadas.
createTransaction
Solicita la creación de una transacción. En los datos de la solicitud se especifica quien es el pagador, el comprador y el despacho. Así mismo para cuál de los medios de pago habilitados se hace la petición y a que URL de retorno debe el medio de pago redirigir al tarjeta habiente.
Parámetros
Nombre | Tipo | Descripción |
auth | Authentication | datos de autenticación |
transaction | TuyaTransactionRequest | datos de la solicitud |
Retorno
TuyaTransactionRequest. Respuesta de la creación de la transacción, tenga en cuenta que la URL del medio de pago se entrega solo si la propiedad returnCode es SUCCESS.
getTransactionInformation
Obtiene la información de una transacción, debe ser consultado para cualquier operación previamente creada con el método createTransaction ya sea cuando regresa del medio de pago o cuando al menos han transcurrido 7 minutos desde que el cliente fue redirigido a la interfaz del medio de pago. Deberá consumirse en intervalos de al menos cada 12 minutos hasta que tenga un estado de transacción transactionState diferente a PENDING.
Parámetros
Nombre | Tipo | Descripción |
auth | Authentication | Datos de autenticación |
transactionID | int | Identificador único de la transacción en Place to Pay, equivale al retornado en la creación de la transacción |
Retorno
TransactionInformation. La información del estado de la transacción.
Tipos de datos o estructuras
En este apartado se describen cada una de las estructuras de datos usadas por los métodos del webservice.
Attribute
Estructura para almacenar información extendida.
Propiedades
Nombre | Tipo | Descripción |
name | string[30] | Código para referenciar el atributo |
value | string[128] | Valor que asume el atributo |
Authentication
Estructura para autenticarse con el webservice.
El login y el tranKey son dados por PlacetoPay para poder realizar transacciones en nombre de un sitio de recaudo.
La semilla usada en el consumo debe ser una fecha en formato ISO 8601 (AAAA-MM-DDTHH:NN:SSZZZ, ej: 2013-04-11T08:47:21-05:00), el sistema verificará que la petición no haya expirado, por ello es fundamental una sincronización del reloj del servidor. Más abajo en este documento hay un apartado de la obtención de la semilla en el formato solicitado y la generación del Hash.
El tranKey enviado en el consumo corresponde a un hash generado con SHA1 de la concatenación de la semilla y del tranKey originalmente enviado por PlacetoPay.
Propiedades
Nombre | Tipo | Descripción |
login | string[32] | Identificador habilitado para el consumo del API, entregado por Place to Pay. |
tranKey | string[40] | Llave transaccional para el consumo del API SHA1(seed + tranKey) |
seed | string | Semilla usada para el consumo del API en el proceso del hash por SHA1 del tranKey, ISO 8601. |
additional | Attribute[] | Datos adicionales a la estructura de autenticación |
Person
Estructura para reflejar la información de una persona involucrada en una transacción
Propiedades
Nombre | Tipo | Descripción |
document | string[12] | Número de identificación de la persona |
documentType | string[3] | Tipo de documento de identificación de la persona [CC, CE, TI, PPN].
CC = Cédula de ciudanía colombiana CE = Cédula de extranjería TI = Tarjeta de identidad PPN = Pasaporte NIT = Número de identificación tributaria SSN = Social Security Number |
firstName | string[60] | Nombres |
lastName | string[60] | Apellidos |
company | string[60] | Nombre de la compañía en la cual labora o representa |
emailAddress | string[80] | Correo electrónico |
address | string[100] | Dirección postal completa |
city | string[50] | Nombre de la ciudad coincidente con la dirección |
province | string[50] | Nombre de la provincia o departamento coincidente con la dirección |
country | string[2] | Código internacional del país que aplica a la dirección física acorde a ISO 3166-1, mayúscula sostenida. |
phone | string[30] | Número de telefonía fija |
mobile | string[30] | Número de telefonía móvil o celular |
TuyaTransactionRequest
Estructura que representa una solicitud de transacción con tarjetas expedidas por TUYA.
Propiedades
Nombre | Tipo | Descripción |
franchise | string[5] | Código del medio de pago [ TY_EX = Tarjeta Éxito, TY_AK = Tarjeta Alkosto ] |
returnURL | string[255] | URL de retorno especificada para la entidad financiera |
reference | string[32] | Referencia única de pago |
description | string[255] | Descripción del pago |
language | string[2] | Idioma esperado para las transacciones acorde a ISO 631-1, mayúscula sostenida. |
currency | string[3] | Moneda a usar para el recaudo acorde a ISO 4217 |
totalAmount | double | Valor total a recaudar |
taxAmount | double | Discriminación del impuesto aplicado |
devolutionBase | double | Base de devolución para el impuesto |
tipAmount | double | Propina u otros valores exentos de impuesto (tasa aeroportuaria) y que deben agregarse al valor total a pagar |
payer | Person | Información del pagador |
buyer | Person | Información del comprador |
shipping | Person | Información del receptor |
ipAddress | string[15] | Dirección IP desde la cual realiza la transacción el pagador |
userAgent | string[255] | Agente de navegación utilizado por el pagador |
additionalData | Attribute[] | Datos adicionales para ser almacenados con la transacción |
TuyaTransactionResponse
Estructura con la información de respuesta para la creación de una transacción.
Propiedades
Nombre | Tipo | Descripción |
transactionID | int | Identificador único de la transacción en PlacetoPay |
sessionID | string[32] | Identificador único de la sesión en PlacetoPay |
returnCode | string[30] | Código de respuesta de la transacción, uno de los siguientes valores:
SUCCESS FAIL_INVALIDGATEWAYID FAIL_INVALIDFRANCHISE FAIL_INVALIDRETAILCODE FAIL_INVALIDCURRENCY FAIL_INVALIDAMOUNT FAIL_TIMEOUT FAIL_TRANSACTIONNOTALLOWED FAIL_RISK FAIL_NOHOST |
trazabilityCode | string[64] | Código único de seguimiento para la operación dado por la red TUYA |
bankCurrency | string[3] | Moneda aceptada por el banco acorde a ISO 4217 |
bankFactor | float | Factor de conversión de la moneda |
bankURL | string[255] | URL a la cual remitir la solicitud para iniciar la interfaz del banco, sólo disponible cuando returnCode = SUCCESS |
responseCode | int | Estado de la operación en PlacetoPay [ 0 = FAILED, 1 = APPROVED, 2 = DECLINED, 3 = PENDING ] |
responseReasonCode | string[3] | Código interno de respuesta de la operación en PlacetoPay |
responseReasonText | string[255] | Mensaje asociado con el código de respuesta de la operación en PlacetoPay |
TransactionInformation
Estructura con la respuesta a una solicitud de información de transacción.
Propiedades
Nombre | Tipo | Descripción |
transactionID | int | Identificador único de la transacción en PlacetoPay |
sessionID | string[32] | Identificador único de la sesión en PlacetoPay |
reference | string[32] | Referencia única de pago |
requestDate | string | Fecha de solicitud o creación de la transacción acorde a ISO 8601 |
franchise | string[5] | Franquicia con la cual se procesó la transacción |
bankName | string[80] | Nombre del banco o entidad financiera |
bankProcessDate | string | Fecha de procesamiento de la transacción acorde a ISO 8601 |
onTest | boolean | Indicador de si la transacción es en modo de pruebas o no |
returnCode | string[30] | Código de respuesta de la transacción, uno de los siguientes:
SUCCESS FAIL_INVALIDGATEWAYID FAIL_INVALIDFRANCHISE FAIL_INVALIDRETAILCODE FAIL_INVALIDCURRENCY FAIL_INVALIDAMOUNT FAIL_TIMEOUT FAIL_TRANSACTIONNOTALLOWED |
authCode | string[40] | Código de autorización asignado a la transacción |
trazabilityCode | string[64] | Código único de seguimiento para la operación dado por la red TUYA |
lastDigits | string[6] | Últimos dígitos de la tarjeta de crédito usada |
transactionState | string[20] | Información del estado de la transacción [ OK, NOT_AUTHORIZED, PENDING, FAILED ] |
responseCode | int | Estado de la operación en PlacetoPay |
responseReasonCode | string[3] | Código interno de respuesta de la operación en PlacetoPay |
responseReasonText | string[255] | Mensaje asociado con el código de respuesta de la operación en Place to Pay |
Ejemplos
A continuación se muestran algunos ejemplos de generación de una fecha en formato ISO 8601 y de la generación del hash en SHA1.
Ejemplo de generación de fecha ISO 8601
A continuación se muestra como se da formato a la fecha actual para generar una cadena en ISO 8601.
$seed = date('c');
using System;
using System.Globalization;
String seed = DateTime.UtcNow.ToString("s",
System.Globalization.CultureInfo.InvariantCulture);
import java.util.Date;
import java.text.SimpleDateFormat;
Date now = new Date();
SimpleDateFormat isoDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
String seed = isoDate.format(now);
Ejemplo de generación del Hash
A continuación se presenta como se puede generar el Hash en diferentes lenguajes de programación. Este Hash es el que se remite como tranKey en la estructura de autenticación.
$hashString = sha1($seed . $tranKey, false);
using System.Text;
using System.Security.Cryptography;
private string GetSHA1(string text)
{
ASCIIEncoding UE = new ASCIIEncoding();
byte[] hashValue;
byte[] message = UE.GetBytes(text);
SHA1 hashString = new SHA1CryptoServiceProvider();
string hex = "";
hashValue = hashString.ComputeHash(message);
foreach (byte x in hashValue) {
hex += String.Format("{0:x2}", x);
}
return hex;
}
string hashString = GetSHA1(seed + tranKey);
import java.security.MessageDigest;
import java.util.Formatter;
private static String byteToHex(final byte[] hash)
{
Formatter formatter = new Formatter();
for (byte b : hash)
{
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
private static String GetSHA1(String password)
{
String sha1 = "";
try
{
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(password.getBytes("UTF-8"));
sha1 = byteToHex(crypt.digest());
}
catch(UnsupportedEncodingException e)
{
e.printStackTrace();
}
return sha1;
}
string hashString = GetSHA1(seed + tranKey);