Integración con Anulación/Devolución V2¶
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 reversión. 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 (por ejemplo, "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.
Flujo de Anulación/Devolución¶

| Pasos | Éxito | Error |
|---|---|---|
| 1. Solicitud de anulación o devolución de pago | El pago se ha anulado o devuelto y su estado es 'Revertido' | El pago no se ha anulado o devuelto. La respuesta contiene información del error. |
| 2. Respuesta a la solicitud de anulación o devolución de pago | La respuesta contiene información sobre la anulación o devolución del pago realizado. | La respuesta contiene información del error de la solicitud. |
| 3. Solicitud de reversión de anulación o devolución | Reversión realizada, su estado es Deshecho. |
La respuesta contiene información del error de la solicitud. |
| 4. Respuesta de reversión de anulación o devolución | La respuesta contiene información sobre la reversión realizada. | La respuesta contiene información de error para la solicitud. |
Warning
Se debe llamar al método PaymentClient.Bind (_callback) antes de llamar a cualquier método de Integración de pagos. 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.
A partir de la versión 3.1.5.0.
Cuando se realiza una transacción, antes se podía confirmar imprimiéndola (o mediante printReceipt), o realizando una nueva transacción. Ahora, la anulación también puede confirmarse utilizando el nuevo parámetro autoConfirm -que indica si se confirma o no independientemente de la impresión- o utilizando el nuevo método confirmReversePayment().
Métodos¶
| Suscripciones | Descripción |
|---|---|
void reversePaymentV2(ReversePaymentRequestV2 paymentRequest, PaymentCallback paymentCallback) |
Realiza el proceso de anulación o devolución del pago. |
void confirmReversePayment(String paymentId, PaymentCallback paymentCallback) |
Confirma una autorización de anulación de pago realizada previamente. |
void cancelReversePayment(String paymentId, PaymentCallback paymentCallback) |
Reverte una solicitud de anulación o devolución del pago. |
reversePaymentV2()¶
Se debe llamar a este método cuando desee realizar una solicitud de anulación o devolución de pago. Durante su ejecución, se validarán los datos de la anulación o devolución, se puede solicitar información adicional al operador (por ejemplo, tarjeta) y se realizará la autorización del adquirente.
Tenga en cuenta que la transacción de anulación o devolución no tiene confirmación, solo reversión. Así, la confirmación se producirá de forma natural si no se envía la reversión, dependiendo del comportamiento de cada adquirente o tipo de pago.
Si hay una impresión del recibo de anulación o devolución, cuando se pasa cualquiera de los parámetros printMerchantReceipt oprintCustomerReceipt con un valor true, la anulación o devolución se confirmará automáticamente. En este caso, no se permitirá reverter.
También dependiendo del comportamiento de cada adquirente o tipo de pago, es posible que no se reverta la transacción de anulación o devolución. En este caso, los reversos aprobados devolverán el valor false en el campo "ReversePayment.cancelable". Además, si se llama al método cancelReversePayment(), se devolverá un error específico indicando que no es posible realizar dicha operación (ver Códigos de respuesta).
Parámetros
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
request |
ReversePaymentRequestV2 |
Sí | Objeto de transferencia de datos que contendrá la información de la solicitud para la anulación o devolución del pago. Tenga en cuenta que no todos los parámetros son obligatorios. |
callback |
ReversePaymentCallback |
Sí | Interfaz que se ejecutará para notificaciones de éxito o error del proceso de anulación o devolución. |
Detalle de los parámetros
request (ReversePaymentRequestV2)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
value |
BigDecimal |
No | Monto de la transacción a anular o devolver. Si no se completa (null), la Aplicación de Pago le pedirá al operador el valor. Esta información se utiliza para validar la integridad de la transacción que se anula o devuelve. El pago debe estar formateado con dos decimales. |
paymentId |
String |
Sí | Identificador de la transacción a anular o devolver. El identificador referido es el que se utiliza en la aplicación de pago. |
appTransactionId |
String |
Sí | Identificador de transacción integrado. El identificador referido es el de la aplicación que originó la solicitud de anulación o devolución. Debe ser lo mismo identificador enviado en la transacción de pago. |
ApplicationInfo.credentials |
Credentials |
Sí | Credenciales de la aplicación que solicita la operación, según lo registrado en PayStore. Básicamente, se trata de la identificación de la aplicación y el token de acceso. |
ExternalAppVersion |
String |
No | Versión de la aplicación que solicita el pago. |
showReceiptView (DEPRECATED) |
Boolean |
No | La Solución utilizará los parámetros printMerchantReceipt y printCustomerReceipt para realizar la impresión. |
printMerchantReceipt |
Boolean |
No | Indica si el recibo del comercio debe imprimirse o no. El valor predeterminado es false, es decir, el recibo no se imprime. |
printCustomerReceipt |
Boolean |
No | Indica si el recibo del cliente debe imprimirse o no. El valor predeterminado es false, es decir, el recibo no se imprime. |
previewMerchantReceipt |
Boolean |
No | Indica si se debe mostrar la pantalla de vista previa del comprobante de comerciante después de confirmar la transacción. El valor predeterminado es true, lo que significa que se mostrará el comprobante. |
previewCustomerReceipt |
Boolean |
No | Indica si se debe mostrar la pantalla de vista previa del comprobante de cliente después de confirmar la transacción. El valor predeterminado es true, lo que significa que se mostrará el comprobante. |
autoConfirm (v3.1.5.0) |
Boolean |
No | Indica si la transacción debe confirmarse automáticamente. Valores posibles: 1. null (por defecto) : confirma automáticamente si se imprime el recibo.2. true : confirma automáticamente independientemente de la regla de impresión.3. false : no confirma automáticamente, pendiente de confirmación. |
merchantGroupCode |
String |
Si allowMultimerchant= true, groupCode es obligatorio |
Código de grupo de comerciantes. |
callback (ReversePaymentCallback)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
onSuccess |
Método de notificación de éxito | ||
ReversePayment.paymentId |
String |
Sí | Identificador de transacción de anulación o devolución. El identificador referido es el que se utiliza en la aplicación de pago. Esta es la información que se utilizará para reverter. |
ReversePayment.acquirerId |
String |
Sí | Identificador de la transacción de anulación o devolución para el adquirente. Este es el identificador en el archivo proporcionado por el adquirente (EDI). De esta forma, es posible realizar la conciliación de la anulación o devolución con la transacción integrada. |
ReversePayment.cancelable |
Boolean |
Sí | True, si esta transacción se puede deshacer; False, de lo contrario. En caso de reversión de anulación o devolución de pago con Código QR Estático, siempre es False. |
ReversePayment.acquirerResponseCode |
String |
Sí | Código de respuesta del adquirente. |
ReversePayment.acquirerResponseDate |
String |
Sí | Fecha/hora devuelta por el adquirente. |
ReversePayment.acquirerAuthorizationNumber |
String |
Sí | Número de autorización proporcionado por el adquirente (que se muestra en el recibo del cliente del Titular de la tarjeta). |
ReversePayment.Receipt.clientVia |
String |
No | Contenido del recibo - del cliente. |
ReversePayment.Receipt.merchantVia |
String |
No | Contenido del recibo - del comercio. |
ReversePayment.acquirerAdditionalMessage |
String |
No | Mensaje adicional enviado por el adquirente en la respuesta a la transacción. |
ReversePayment.ticketNumber |
String |
No | Número de cupón generado por el terminal para la transacción. |
ReversePayment.batchNumber |
String |
Sí | Número de lote de transacción. |
ReversePayment.nsuTerminal |
String |
Sí | NSU Generada por el terminal para la transacción. |
ReversePayment.cardholderName |
String |
No | Nombre del titular de la tarjeta. Este campo no se devuelve en caso de reversión de pago con QR Code estático (ni tarjeta ni pago inmediato), solo se devuelve para pago con tarjeta física. |
ReversePayment.cardBin |
String |
No | Primeros seis dígitos de la tarjeta. Ya no es obligatorio ya que no se devuelve para pagos inmediatos. |
ReversePayment.panLast4Digits |
String |
No | Últimos cuatro dígitos de la tarjeta. Ya no es obligatorio ya que no se devuelve para pagos inmediatos. |
ReversePayment.terminalId |
String |
Sí | Identificación del terminal. |
ReversePayment.correlationId |
String |
Sí | Identificador común de la transacción entre terminal, PhAST y PayStore. Este identificador en formato UUID es único para cada transacción |
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 autorización. Si la transacción ha sido denegada por el adquirente, contendrá el mensaje devuelto por el adquirente. |
ErrorData.acquirerAdditionalMessage |
String |
No | Mensaje adicional enviado por el adquirente en la respuesta de la transacción. |
confirmReversePayment()¶
Este método debe llamarse para confirmar una anulación que el terminal ha conseguido procesar completamente el tramo de autorización enviado por el Autorizador.
Este método no debe invocarse para una anulación que ya ha sido confirmada, es decir, cuando ya se ha ejecutado el método confirmReversePayment().
Este método no debe invocarse para una anulación ya cancelada, es decir, cuando ya se haya ejecutado el método cancelReversePayment().
Este método no debe invocarse para una anulación que haya sido denegada por el Autorizador, es decir, la transacción debe haber sido autorizada por el Autorizador.
Parámetros
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
paymentId |
String |
Sí | Identificador de la transacción que debe confirmarse. 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. |
Detalle de los parámetros
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.acquirerAdditionalMessage |
String |
No | Mensaje adicional enviado por el adquirente en la respuesta a la transacción. |
ErrorData.responseMessage |
String |
Sí | Mensaje descriptivo de la causa de la autorización. Si la transacción ha sido denegada por el adquirente, contendrá el mensaje devuelto por el adquirente. |
cancelReversePayment()¶
Se debe llamar a este método para deshacer una transacción de anulación o devolución previamente autorizada. Esta transacción no debe haberse revertida todavía y debe haber sido autorizada (no denegada) previamente.
Como se dice en la descripción de reversePayment(), Es posible que no se pueda deshacer la transacción de anulación o devolución de pago de una adquirente o tipo de pago determinado. Por lo tanto, el método cancelReversePayment() puede devolver un error específico que indique que no es posible realizar dicha operación (ver Códigos de respuesta).
Parámetros
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
paymentId |
String |
Sí | Identificador de la transacción a reverter. 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. |
Detalle de los parámetros
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.acquirerAdditionalMessage |
String |
No | Mensaje adicional enviado por el adquirente en la respuesta a la transacción. |
ErrorData.responseMessage |
String |
Sí | Mensaje descriptivo de la causa de la autorización. Si la transacción ha sido denegada por el adquirente, contendrá el mensaje devuelto por el adquirente. |
Ejemplo de flujo de anulación o devolución¶
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.Credentials;
import br.com.phoebus.android.payments.api.ErrorData;
import br.com.phoebus.android.payments.api.PaymentClient;
import br.com.phoebus.android.payments.api.ReversePayment;
import br.com.phoebus.android.payments.api.ReversePaymentRequestV2;
import br.com.phoebus.android.payments.api.exception.ClientException;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, PaymentClient.PaymentCallback<ReversePayment> {
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(){
ReversePaymentRequestV2 request = new ReversePaymentRequestV2();
BigDecimal value = BigDecimal.valueOf(5000).movePointLeft(2);
request.setValue(value);
request.setAppTransactionId("123456");
request.setPaymentId("999999");
request.setPrintCustomerReceipt(true);
request.setPrintMerchantReceipt(true);
Credentials credentials = new Credentials();
credentials.setApplicationId(TEST_APPLICATION_ID);
credentials.setSecretToken(TEST_SECRET_TOKEN);
request.setCredentials(credentials);
try {
paymentClient.reversePaymentV2(request, this);
} catch (ClientException e) {
Log.e(TAG, "Error reversePaymentV2", e);
}
}
@Override
public void onSuccess(ReversePayment reversePayment) {
Log.i(TAG, reversePayment.toString());
/*
Si, en su regla comercial, es necesario deshacer la
transacción por cualquier motivo, llame al método
cancelReversePayment()
**/
//doCancelReversePayment(reversePayment);
}
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, errorData.getResponseMessage());
Toast.makeText(this, errorData.getResponseMessage(), Toast.LENGTH_LONG).show();
}
private void doCancelReversePayment(ReversePayment reversePayment) {
try {
paymentClient.cancelReversePayment(reversePayment.getPaymentId(),
new PaymentClient.PaymentCallback<ReversePayment>() {
@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 cancelReversePayment", e);
}
}
}