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
Si se remite CHECK o MIXED debe proveerse la información de checkInfo.

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);