Efectivo
Consulta de una cuenta pendiente de pago
Los servicios expuestos permiten la consulta de una o varias cuentas pendientes de pago, básicamente dependiendo del servicio usado. Para ello, tu desarrollo debe contar con una interfaz de captura de datos que sirven para cada consumo. Debido a que el servicio está pensado para atender a múltiples comercios, se deberá parametrizar cada establecimiento para determinar qué consultas son soportadas y cual es el significado del dato.
Así que en la configuración de cada establecimiento deberá ir:
- El login que lo identifica en Place to Pay
- La llave transaccional (tranKey) que lo identifica en Place to Pay
- Si soporta consulta por referencia y el significado de la referencia para ese establecimiento (factura, cuenta de cobro, etc.).
- Si soporta consulta por documento del deudor.
- Si soporta consulta por código del deudor y su significado el código para el establecimiento (Código de estudiante, Placa, Número de póliza, etc.).
- La frecuencia de reintento de notificación ante una falla.
Tenga en cuenta que las consultas por documento del deudor y por el código del deudor están pensadas para retornar múltiples registros de cobro, así que su desarrollo si soporta estos métodos tendrá que dar la posibilidad de presentar las diferentes deudas y que el cliente pagador determine cuál o cuales va a pagar.
Si el valor retornado como deuda para alguno de las consultas es cero, se entenderá que el valor a recaudar es abierto y no cerrado. Sin embargo será el proyecto el que defina si el valor a recaudar es o no alterable por el cajero.
Asiento de un pago
Independiente del servicio usado para obtener las cuentas pendientes de pago. En el momento de indicar a Place to Pay un recaudo, se deberá consumir el servicio para una referencia en particular. Es decir que si en un momento en una sola transacción recaudas más de una referencia, en el asiento deberá hacer tantos consumos como referencias haya recaudado.
El asiento del pago se entiende como una tarea asincrónica o al menos no bloqueante. Esto implica que cuando realizas el recaudo, invocas al servicio de Place to Pay para notificar de la operación, sin embargo si el servicio no está disponible o hay una falla de telecomunicaciones o el estado de la notificación no es exitoso; puedes reintentar posteriormente la notificación sin tener que retrasar la operación en taquilla.
Los reintentos de notificación de pago pueden hacerse cada 30 minutos o lo que se establezca en la parametrización particular y dependiendo del volumen de información manejada. De igual manera como recurso final, al terminar el día se puede intercambiar un archivo de recaudo que sirve para conciliar los asientos realizados.
Descripción de la interfaz del Webservice
A continuación se describen los métodos que el Webservice brinda. Las operaciones descritas a continuación son tipo petición – respuesta. También, se muestran los parámetros de entrada a cada operación y vínculos a las estructuras de datos usadas.
getBillByReference
Obtiene las cuentas pendientes de pago usando como criterio de búsqueda la referencia. Tenga en cuenta que el significado de la referencia dependerá de cada establecimiento, bien puede ser un número de factura, una cuenta de cobro, el código de barras de un documento de cobro, etc.
Parámetros
Nombre | Tipo | Descripción |
auth | Authentication | datos de autenticación |
reference | string(40) | referencia de consulta acorde al significado para cada establecimiento recaudador |
Retorno
BillResponse. Respuesta de la consulta, si la propiedad status es OK en bills se informan las cuentas coincidentes con la solicitud.
getBillByDebtorID
Obtiene las cuentas pendientes de pago usando como criterio de búsqueda el documento de identidad del deudor.
Parámetros
Nombre | Tipo | Descripción |
auth | Authentication | datos de autenticación |
debtorID | string(20) | documento de identificación del deudor |
Retorno
BillResponse. Respuesta de la consulta, si la propiedad status es OK en bills se informan las cuentas coincidentes con la solicitud.
getBillByDebtorCode
Obtiene las cuentas pendientes de pago usando como criterio de búsqueda un código del deudor. El significado del código dependerá de cada establecimiento, bien puede ser el número de una póliza, la placa de un vehículo, el código de un estudiante, etc.
Parámetros
Nombre | Tipo | Descripción |
auth | Authentication | datos de autenticación |
debtorCode | string(20) | código del deudor |
Retorno
BillResponse. Respuesta de la consulta, si la propiedad status es OK en bills se informan las cuentas coincidentes con la solicitud.
SettleResponse
Estructura con la respuesta al asiento del pago.
Propiedades
Nombre | Tipo | Descripción |
status | string(30) | Estado del asiento |
description | string(255) | Descripción del estado de asiento |
receipt | int | Código único asociado al asiento del pago provisto por Place to Pay |
date | string | Fecha de asiento acorde a ISO 8601 |
Tipos de datos o estructuras
En este apartado se describen cada una de las estructuras de datos usadas por los métodos del Webservice.
Authentication
Estructura para autenticarse con el webservice.
Tenga en cuenta que 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(40) | 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 |
Attribute
Estructura para almacenar información extendida.
Propiedades
Nombre | Tipo | Descripción |
name | string(30) | Código para referenciar el atributo |
value | string(255) | Valor que asume el atributo |
BillResponse
Estructura con la respuesta a una consulta de obligaciones pendientes de pago.
Propiedades
Nombre | Tipo | Descripción |
status | string(30) | Estado de la respuesta |
description | string(255) | Descripción explicativa del estado obtenido |
bills | BillInfo[] | Arreglo de obligaciones pendientes de pago que satisfacen el criterio de búsqueda |
BillInfo
Estructura que representa una obligación pendiente de pago.
Propiedades
Nombre | Tipo | Descripción |
reference | string(40) | Referencia única de la obligación |
description | string(255) | Información acerca de la obligación (Pago SOAT, Pago Matricula 2013-12, etc.) |
debtorID | string(20) | Documento de identificación del deudor |
debtorFirstName | string(60) | Nombres del deudor |
debtorLastName | string(60) | Apellidos del deudor |
debtorCode | string(20) | Código del deudor |
totalCharges | double | Valor de los cargos de la obligación, antes de cualquier interés por mora generado |
totalInterest | double | Valor de los intereses por mora generados |
totalAmount | double | Valor total adeudado y que debe ser recaudado (totalCharges + totalInterest) |
creationDate | string | Fecha de creación del cobro acorde a ISO 8601 |
PaymentInfo
Estructura con la información provista para el asiento de un recaudo.
Propiedades
Nombre | Tipo | Descripción |
reference | string(40) | Referencia única de la obligación (la misma provista en la estructura BillInfo) |
totalAmount | double | Valor total recaudado (el mismo provisto en la estructura BillInfo) |
date | string | Fecha de recaudo acorde a ISO 8601 |
receipt | string(40) | Identificador único de la transacción en la entidad. |
channel | string(3) | Canal por el cual se realizó el recaudo:
OFC => Oficina ATM => Cajero electrónico IVR => Sistema audio respuesta DEB => Débito automático MOV => Banca móvil WEB => Portal Web |
method | string(5) | Método de pago usado:
CASH => Efectivo CHECK => Cheque MIXED => Mixed |
cashAmount | double | Valor total pagado en efectivo |
checkInfo | CheckInfo | Información del pago en cheque |
payerID | string(20) | Documento de identificación del pagador |
agentID | string(20) | Código del cajero |
location | string(20) | Código de la oficina recaudadora |
CheckInfo
Estructura con la información de un pago en cheque
Propiedades
Nombre | Tipo | Descripción |
number | string(20) | Número del cheque |
bank | string(3) | Código del banco |
amount | double | Valor del cheque |
exchange | string(1) | Tipo de canje:
L => Local O => Otras plazas |
settlePayment
Asienta el pago de una obligación. Una vez se realiza el recaudo, se hace la notificación del éxito de dicho recaudo usando este servicio, en el cual se especifica cual referencia fue recaudada, el valor y con qué datos se realiza el asiento.
Parámetros
Nombre | Tipo | Descripción |
auth | Authentication | datos de autenticación |
payment | PaymentInfo | datos para el asiento del pago |
Retorno
SettleResponse. Respuesta al asiento de la operación, si la propiedad status es OK en receipt se informa con qué número de transacción fue asentada la operación en Place to Pay.
Estados retornados por el servicio
A continuación se enuncian los diferentes códigos de estado que se retornan en la respuesta de las peticiones a los diferentes métodos.
Código | Descripción |
OK | Solicitud exitosa |
FAIL_INVALID_AUTH | Datos de autenticación inválidos |
FAIL_INVALID_SEED | Validez de la petición ha expirado |
FAIL_MAINTENANCE | Servicio no disponible por mantenimiento |
FAIL_NO_DATA | No hay información coincidente con los datos proporcionados |
FAIL_BILL_CANCELED | La factura u orden de pago ya está cancelada |
FAIL_BILL_EXPIRED | La factura u orden de pago ya está vencida |
FAIL_BILL_NOT_EXIST | La factura u orden de pago a ser asentada no existe |
FAIL_INVALID_VALUE | Valor del asiento de pago es inválido o no corresponde al valor de la factura u orden de pago |
FAIL_INCONSISTENT_VALUE | El valor del asiento no equivale a la suma del monto en efectivo y en cheque. |
FAIL_INVALID_METHOD | Método de recaudo inválido |
FAIL_INVALID_CHANNEL | Canal de recaudo inválido |
FAIL_INVALID_SETTLE | Asiento inválido (alguna validación de datos no fue exitosa) |
FAIL_UNEXPECTED | Fallo inesperado en el servicio |
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);