Tarjetas Éxito y Alkosto (Tuya)

¿Cómo funciona?

  1. Se muestra como opción de pago Tarjeta Éxito y Tarjeta Alkosto, lo cual dependerá de que el comercio active estos medios de pago.
  2. 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.
  3. 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.
  4. Almacenar los datos de la transacción retornados por el servicio (identificador de la transacción, autorización, identificador sesión de placetopay).
  5. Redirigir el navegador a la URL retornada en caso de exito.
  6. 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.
  7. Dependiendo de la respuesta del servicio, la transacción puede haber sido aprobada, rechazada o seguir pendiente de procesamiento.
  8. Informar al usuario el estado de la transacción.
  9. 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);