[OBSOLETO] Integración con Pagos V1¶
Una de las formas de integrarse con la aplicación de pagos Phoebus es a través de IPC. Para ello, se proporciona una biblioteca, la payments-api-x.x.x.x.aar, que contiene todo el código necesario que se utilizará para dichas llamadas.
Mediante esta API es posible realizar todo el flujo de pago, es decir, confirmación (o deshacer) y reverso del pago. El pago se puede realizar con una cantidad predefinida o con una cantidad abierta, a ser ingresada por el operador de la terminal. Además, es posible informar una lista de tipos de pagos (débito, crédito, crédito en cuotas, etc.) permitidos.
Aunque esta integración se lleva a cabo a través de una API, la aplicación de pago puede mostrar información en la interfaz de la terminal, como mensajes (e.g., "Insertar o deslizar la tarjeta"), o incluso solicitar información al operador (por ejemplo, CVV). Por lo tanto, durante la realización de cualquier operación, la aplicación que solicitó la operación no debe interactuar con la interfaz del dispositivo hasta que se complete la operación.
La siguiente es una especificación detallada de las operaciones disponibles.
Para la integración con la API de pagos, se proporciona la interfaz PaymentClient.
Warning
El método PaymentClient.Bind(_callback) debe ser llamado, antes de llamar a cualquier método de Integración de Pago. El bind es asincrónico, es decir, la siguiente línea después de bind() se ejecutará antes de recibir su respuesta, así que asegúrese de que antes de llamar a los métodos de integración, el enlace esté conectado.
Métodos¶
| Suscripciones | Descripción |
|---|---|
void startPayment(PaymentRequest paymentRequest, PaymentCallback paymentCallback) |
Realiza el proceso de autorización de pago. (OBSOLETO: Use startPaymentV2) |
void confirmPayment(String paymentId, PaymentCallback paymentCallback) |
Confirma una autorización de pago realizada previamente. |
void cancelPayment(String paymentId, PaymentCallback paymentCallback) |
Deshacer una autorización de pago realizada anteriormente. |
startPayment() (OBSOLETO: Use startPaymentV2)¶
Se debe llamar a este método cuando desee realizar una solicitud de autorización de pago. Durante su ejecución, se validarán los datos del pago, se solicitará información adicional al operador (por ejemplo, contraseña y CVV), y se realizará la autorización del adquirente.
Parámetros
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
request |
PaymentRequest |
Sí | Oobjeto de transferencia de datos que contiene información de solicitud de pago. Tenga en cuenta que no todos los parámetros son obligatorios. |
callback |
PaymentCallback |
Sí | Interfaz que se ejecutará para notificaciones de éxito o error del proceso de pago. |
Detalle de los Parámetros
request (PaymentRequest)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
value |
BigDecimal |
No | Importe de pago solicitado. Si no está lleno (null), la interfaz solicitará el valor al operador. |
paymentTypes |
List<PaymentType> |
No | Tipos de pago (Débito, Crédito, recibo, etc.) permitidos para este pago. Si está vacío, es decir, nulo, significa que todos los tipos están permitidos. Si contiene solo uno, se utilizará este tipo (si es posible) y no se le preguntará nada al operador. |
installments |
Integer |
No | Número de cuotas. Solo se utiliza para tipos de pago que admiten pagos en cuotas y, en este caso, es obligatorio. El valor debe estar entre 2 y 99. |
appTransactionId |
String |
Sí | Identificador de transacción integrado. El identificador referido es el utilizado en la aplicación que originó la solicitud de pago. No debe repetirse. |
ApplicationInfo.credentials |
Credentials |
Sí | Credenciales de la aplicación que solicita la operación, según lo registrado en PayStore. Básicamente, es la identificación de la aplicación y el token de acceso. |
ApplicationInfo.softwareVersion |
String |
Sí | Versión de la aplicación que solicita el pago. |
showReceiptView (OBSOLETO) |
Boolean |
No | La Solución siempre imprimirá el recibo después de realizar la confirmación . |
callback (PaymentCallback)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
onSuccess |
Método de notificación de éxito | ||
Payment.value |
BigDecimal |
Sí | Monto del pago. Este es el monto que fue aprobado por el adquirente. Siempre debe estar validado en la respuesta, incluso si se ha pasado como parámetro, ya que hay compradores que, para algunas situaciones, aprueban valores distintos a los solicitados. |
Payment.paymentType |
PaymentType |
Sí | Tipo de pago (débito, crédito, recibo, etc.). |
Payment.installments |
Integer |
No | Número de cuotas de pago. |
Payment.acquirer |
String |
Sí | Comprador que autorizó el pago. |
Payment.paymentId |
String |
Sí | Identificador de transacción para la aplicación de pagos. Esta es la información que se utilizará para confirmar y deshacer. |
Payment.brand |
String |
Sí | Banner de tarjeta. |
Payment.bin |
String |
Sí | BIN de la tarjeta. |
Payment.panLast4Digits |
String |
Sí | Últimos 4 dígitos del PAN de la tarjeta. |
Payment.captureType |
CaptureType |
Sí | Formas de capturar la tarjeta. |
Payment.paymentStatus |
PaymentStatus |
Sí | Estado de pago. En el caso de solicitudes devueltas con éxito, esta información siempre estará PENDING, requiriendo confirmación o deshacer para su conclusión final. |
Payment.paymentDate |
Date |
Sí | Fecha/hora de pago para la aplicación de pagos. |
Payment.acquirerId |
String |
Sí | Identificador de transacción para el adquirente. Este es el identificador en el archivo proporcionado por el adquirente (EDI). De esta forma, es posible conciliar el pago con la transacción integrada. |
Payment.acquirerResponseCode |
String |
Sí | Código de respuesta del adquirente. |
Payment.acquirerResponseDate |
String |
Sí | Fecha/hora devuelta por el adquirente. |
Payment.acquirerAuthorizationNumber |
String |
Sí | Número de autorización proporcionado por el adquirente (que se muestra en el recibo del titular de la tarjeta). |
Payment.Receipt.clientVia |
String |
No | Contenido del recibo - del cliente. |
Payment.Receipt.merchantVia |
String |
No | Contenido del recibo - del establecimiento. |
onError |
Método de notificación en caso de error. | ||
ErrorData.paymentsResponseCode |
String |
Sí | Código de respuesta para el error que ocurrió. Ver Códigos de respuesta |
ErrorData.acquirerResponseCode |
String |
No | Código de respuesta para el error ocurrido devuelto por el adquirente. Tenga en cuenta que este error solo se devolverá si la transacción no está autorizada por el adquirente. |
ErrorData.responseMessage |
String |
Sí | Mensaje descriptivo de la causa de la no autorización. Si la transacción ha sido denegada por el adquirente, contendrá el mensaje devuelto por el adquirente. |
confirmPayment()¶
Se debe llamar a este método para confirmar una transacción de que la terminal pudo procesar completamente el tramo de autorización enviado por el Autorizador.
Este método no debe ser llamado para una transacción que ya ha sido confirmada, es decir, en la que se ha ejecutado previamente el método confirmPayment().
Este método no debe ser llamado para una transacción que ya se ha deshecho, es decir, en la que se ha ejecutado previamente el método cancelPayment().
Este método no debe ser llamado para una transacción que fue denegada por el Autorizador, es decir, la transacción debe haber sido autorizada por el Autorizador.
Después de ejecutar esta confirmación, la transacción solo se puede cancelar mediante una operación de reverso. La inversión es la operación realizada por el menú CANCELACIÓN de la terminal.
Si el consumidor de la aplicación de esta API ha completado con éxito su proceso comercial, pero no ha llamado al método confirmPayment(), la transacción permanecerá con el siguiente estado: Situación PayStore = "Pendiente". Resolución sobre el Comprador = "Pendiente".
Como resultado, es posible que tengamos una inconsistencia transaccional, ya que, al final del día, algunas redes adquirentes confirman automáticamente transacciones que no recibieron el tramo de confirmación. Otros adquirentes trabajan con solo dos piernas, sin necesidad de un tramo de confirmación. En este caso, si hay algún problema para completar la transacción en el lado de la terminal, es imperativo que la solución de captura ejecute el método cancelPayment(), para deshacer la transacción en el adquirente y evitar cobrarle al cliente. Tarjeta.
Parámetros
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
paymentId |
String |
Sí | Identificador de transacción por confirmar. El identificador referido es el que se utiliza en la aplicación de pago. |
callback |
PaymentCallback |
Sí | Interfaz que se ejecutará para notificaciones de éxito o error. |
callback
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
onSuccess |
Método de notificación de éxito | ||
onError |
Método de notificación en caso de error. | ||
ErrorData.paymentsResponseCode |
String |
Sí | Código de respuesta para el error que ocurrió. Ver Códigos de respuesta |
ErrorData.acquirerResponseCode |
String |
No | Código de respuesta para el error ocurrido devuelto por el adquirente. Tenga en cuenta que este error solo se devolverá si la transacción no está autorizada por el adquirente. |
ErrorData.responseMessage |
String |
Sí | Mensaje descriptivo de la causa de la no autorización. Si la transacción ha sido denegada por el adquirente, contendrá el mensaje devuelto por el adquirente. |
cancelPayment()¶
Este método siempre debe invocarse para deshacer una transacción en la que la terminal no pudo procesar completamente el tramo de autorización enviado por el Autorizador.
Este método no debe ser llamado para una transacción que ya ha sido confirmada, es decir, en la que se ha ejecutado previamente el método confirmPayment().
Este método no debe ser llamado para deshacer una transacción que ya se ha deshecho, es decir, en la que se ha ejecutado previamente el método cancelPayment().
Este método no debe ser llamado para una transacción que haya sido denegada por el autorizador.
Este método no es un contracargo. La inversión es la operación realizada por el menú CANCELACIÓN de la terminal. La reversión se realiza en transacciones que se han completado con éxito, es decir, que han sido confirmadas.
Después de ejecutar deshacer, cancelPayment(), la transacción ya no puede ser confirmada por la aplicación de la terminal, es decir, el método confirmPayment() ya no se puede ejecutar.
Si la aplicación que consume esta API no ha completado con éxito su proceso de negocio, es esencial llamar al método cancelPayment(). La consecuencia de no cancelar una transacción que no ha completado su proceso de negocio es similar a la consecuencia de no confirmar. Sin embargo, en este caso, con un factor agravante, ya que es poco probable que el cliente tome el producto / servicio asociado con la transacción financiera, o se puede realizar un nuevo intento de venta, lo que resultará en un cargo doble para el cliente Titular de la Tarjeta.
Parámetros
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
paymentId |
String |
Sí | Identificador de la transacción a deshacer. El identificador referido es el que se utiliza en la aplicación de pago. |
callback |
PaymentCallback |
Sí | Interfaz que se ejecutará para notificaciones de éxito o error. |
callback
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
onSuccess |
Método de notificación de éxito | ||
onError |
Método de notificación en caso de error. | ||
ErrorData.paymentsResponseCode |
String |
Sí | Código de respuesta para el error que ocurrió. Ver Códigos de respuesta |
ErrorData.acquirerResponseCode |
String |
No | Código de respuesta para el error ocurrido devuelto por el adquirente. Tenga en cuenta que este error solo se devolverá si la transacción no está autorizada por el adquirente. |
ErrorData.responseMessage |
String |
Sí | Mensaje descriptivo de la causa de la no autorización. Si la transacción ha sido denegada por el adquirente, contendrá el mensaje devuelto por el adquirente. |
Ejemplo de flujo de pago¶
package com.example.appmanoel;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.math.BigDecimal;
import br.com.phoebus.android.payments.api.ApplicationInfo;
import br.com.phoebus.android.payments.api.Credentials;
import br.com.phoebus.android.payments.api.ErrorData;
import br.com.phoebus.android.payments.api.Payment;
import br.com.phoebus.android.payments.api.PaymentClient;
import br.com.phoebus.android.payments.api.PaymentRequest;
import br.com.phoebus.android.payments.api.exception.ClientException;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, PaymentClient.PaymentCallback<Payment> {
Button bt_start;
private PaymentClient paymentClient;
public static final String TEST_APPLICATION_ID = "0";
public static final String TEST_SECRET_TOKEN = "000000000000000000000000";
public static final String TAG = "TAG_DEMO";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_start = (Button) this.findViewById(R.id.button);
bt_start.setOnClickListener(this);
paymentClient = new PaymentClient();
}
@Override
public void onClick(View view) {
doExecute();
}
@Override
protected void onResume() {
super.onResume();
paymentClient.bind(this);
}
@Override
protected void onDestroy() {
try {
paymentClient.unbind(this);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
super.onDestroy();
}
public void doExecute(){
PaymentRequest request = new PaymentRequest();
request.setValue(new BigDecimal(50));
request.setAppTransactionId("123456");
Credentials credentials = new Credentials();
credentials.setApplicationId(TEST_APPLICATION_ID);
credentials.setSecretToken(TEST_SECRET_TOKEN);
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.setCredentials(credentials);
applicationInfo.setSoftwareVersion("1.0");
request.setAppInfo(applicationInfo);
try {
paymentClient.startPayment(request, this);
} catch (ClientException e) {
Log.e(TAG, "Error starting payment", e);
}
}
@Override
public void onSuccess(Payment payment) {
Log.i(TAG, payment.toString());
doConfirmPayment(payment);
/*
Si, en su regla comercial, necesita deshacer la transacción por algún motivo,
llamar al método CancelPayment()
**/
}
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, errorData.getResponseMessage());
Toast.makeText(this, errorData.getResponseMessage(), Toast.LENGTH_LONG).show();
}
private void doConfirmPayment(Payment payment) {
try {
paymentClient.confirmPayment(payment.getPaymentId(),
new PaymentClient.PaymentCallback<Payment>() {
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, errorData.getResponseMessage());
Toast.makeText(MainActivity.this, errorData.getResponseMessage(), Toast.LENGTH_LONG).show();
}
@Override
public void onSuccess(Object o) {
Log.i(TAG, "¡Confirmación del pago realizado con éxito!");
}
});
} catch (ClientException e) {
Log.e(TAG, "Error confirmPayment", e);
}
}
private void doCancelPayment(Payment payment) {
try {
paymentClient.cancelPayment(payment.getPaymentId(),
new PaymentClient.PaymentCallback<Payment>() {
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, errorData.getResponseMessage());
Toast.makeText(MainActivity.this, errorData.getResponseMessage(), Toast.LENGTH_LONG).show();
}
@Override
public void onSuccess(Object o) {
Log.i(TAG, "Deshacer completado!");
}
});
} catch (ClientException e) {
Log.e(TAG, "Error cancelPayment", e);
}
}
}