Integración con Pagos 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 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 del 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.
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.
Flujo de Pago¶

| Pasos | Éxito | Error |
|---|---|---|
| 1. Solicitud de pago | El pago se ha realizado y su estado es Pendiente |
No se ha realizado el pago. La respuesta contiene información de error. |
| 2. Responder solicitud de pago | La respuesta contiene información sobre el pago realizado. | La respuesta contiene información de error para la solicitud. |
| 3. Solicitud de confirmación | Confirmación realizada, su estado es Confirmada, no se puede deshacer. |
Confirmación no realizada. La respuesta contiene información de error. |
| 4. Responder confirmación | La respuesta contiene información de la confirmación realizada. Impresión de cupones | La respuesta contiene información de error para la solicitud. En este punto, se puede enviar el deshacer. |
| 5. Deshacer solicitud | Deshacer realizado, su estado es Deshecha. No se puede confirmar. |
La respuesta contiene información de error para la solicitud. El estado sigue siendo Pendiente. |
| 6. Deshacer respuesta | La respuesta contiene información sobre el deshacer realizado. | La respuesta contiene información de error para la solicitud. |
El pago solo se finaliza cuando hay una confirmación o una cancelación (deshacer). En caso de confirmación, el recibo estará disponible para impresión o envío por SMS/correo electrónico, dependiendo de las funcionalidades de la terminal.
A partir de la versión 3.1.4.3
Cuando se realiza una transacción y la aplicación solicita su confirmación (confirmPayment()) o deshacer (cancelPayment()), la respuesta de la solicitud se enviará a la aplicación tan pronto como la transacción se resuelva localmente en el terminal, eliminando la necesidad de que la aplicación espere la resolución con el autorizador para continuar el flujo.
Después de eso, el terminal intentará resolver la transacción con el autorizador. Esto puede ocurrir inmediatamente al finalizar la transacción, o más tarde, en la resolución de asuntos pendientes.
Métodos¶
| Suscripciones | Descripción |
|---|---|
void startPaymentV2(PaymentRequestV2 paymentRequest, PaymentCallback paymentCallback) |
Realiza el proceso de autorización de pago. |
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. |
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 |
PaymentRequestV2 |
Sí | Objeto de transferencia de datos que contendrá la información de la 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 (PaymentRequestV2)
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
value |
BigDecimal |
No | Importe de pago solicitado. Si no está lleno (null), la interfaz solicitará el valor al operador. El pago debe estar formateado con dos decimales. |
additionalValueType |
AdditionalValueType |
No | Tipo de valor adicional (Cashback, TIP, etc.). Si no se completa (nulo), el campo "additionalValue" debe ignorarse. "AdditionalValueType" debe admitir, para FastTrack, solo el valor CASHBACK. Después de leer la tarjeta, si el AdditionalValueType informado no es compatible con el producto banner de la Tarjeta, el terminal muestra un error en la pantalla y finaliza la transacción. Para evitar que se produzca este error, se recomienda utilizar este campo solo junto con un "productShortName", que se debe completar como un producto que admite el uso del tipo de valor adicional en cuestión. Este parámetro no se considera en los pagos con código QR estático, es decir, cuando operationMethodAllowed = 1. |
additionalValue |
BigDecimal |
No | Valor agregado al monto de la transacción. Si se informa "additionalValueType" y "additionalValue" no se completa (nulo) o es igual a 0 (cero), la interfaz le pedirá al operador el valor adicional. Si se completa "additionalValueType" y "additionalValue" tiene un valor superior a 0 (cero), la interfaz no le pedirá al operador el valor adicional. Este parámetro no se considera en los pagos con código QR estático, es decir, cuando operationMethodAllowed = 1. |
paymentTypes |
List<PaymentType> |
No | Tipos de pagos (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. Este parámetro no se considera en los pagos con código QR estático, es decir, cuando operationMethodAllowed = 1. |
installments |
Integer |
No | Número de plazos. Solo se utiliza para tipos de pago que admiten pagos a plazos y, en este caso, es obligatorio. El valor debe estar entre 2 y 99. Este parámetro no se considera en los pagos con código QR estático, es decir, cuando operationMethodAllowed = 1. |
accountTypeId |
String |
No | Tipo de cuenta. Si no se completa (nulo), la interfaz puede solicitar al operador el tipo de cuenta, dependiendo de la configuración del producto principal asociado con la tarjeta utilizada en la transacción. Después de leer la tarjeta, si el accountTypeId ingresado no existe en la configuración del producto de marca de la Tarjeta, el terminal muestra un error en la pantalla y finaliza la transacción. Para evitar que ocurra este error, se recomienda utilizar este campo solo junto con un "productShortName", que debe contener un producto que admita el uso del tipo de cuenta. Este parámetro no se considera en los pagos con código QR estático, es decir, cuando operationMethodAllowed = 1. |
planId |
String |
No | Identificación del plan de pago. Puede tener uno o dos caracteres, según la regla del adquirente seleccionado. Si no se completa (nulo), la interfaz puede solicitar el plan al operador, de acuerdo con la configuración del producto de marca asociado a la tarjeta utilizada en la transacción. Después de leer la tarjeta, si el planId reportado no es compatible con el número de cuotas (capturado en el terminal o informado en el parámetro "Parcelas") y con la configuración del producto bandera de la tarjeta (observando las configuraciones planCondition, planType y planList) , el terminal muestra un error en la pantalla y finaliza la transacción. Para evitar que ocurra este error, se recomienda utilizar este campo solo junto con un "productShortName", que debe contener un producto que admita el plan referido. Este parámetro no se considera en los pagos con código QR estático, es decir, cuando operationMethodAllowed = 1. |
appTransactionId |
String |
Sí | Identificador de transacción integrado para el software. El Identificador al que se refiere es el utilizado en la aplicación que originó la solicitud de pago y debe ser único, sin repeticiones. |
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 utilizará el valor de los parámetros printMerchantReceipt yprintCustomerReceipt para realizar la impresión después de que se haya ejecutado la confirmación. |
printMerchantReceipt |
Boolean |
No | Indica si la prueba de establecimiento debe imprimirse o no después de la confirmación de la transacción. El valor predeterminado es true, es decir, se imprime el recibo. |
printCustomerReceipt |
Boolean |
No | Indica si el recibo del cliente debe imprimirse o no después de la confirmación de la transacción. El valor predeterminado es true, es decir, se imprime el recibo. |
tokenizeCard |
Boolean |
No | Indica si la tarjeta debe ser tokenizada después de que se apruebe el pago o no. El valor predeterminado es falso, es decir, no se realizará la tokenización. |
tokenizeEmail |
String |
Si tokenizeCard es true, sí, de lo contrario, no. | Correo electrónico del titular de la tarjeta. Si "tokenizeCard" es falso, este parámetro se ignora. |
tokenizeNationalDocument |
String |
No | CPF o CNPJ del titular de la tarjeta. Si "tokenizeCard" es false, este parámetro se ignora. Si es true, pero no se proporciona este parámetro, la llamada a la API de creación de tokens en el comercio electrónico tampoco lo utilizará. |
productShortName |
String |
No | Identificación resumida del producto (marca de la tarjeta). Luego de leer la tarjeta e identificar el producto de marca, si no coincide con el "productShortName" referido, el terminal muestra un error en la pantalla y finaliza la transacción. Este parámetro no se considera en los pagos con código QR estático, es decir, cuando operationMethodAllowed = 1. |
note |
String |
No | Texto adicional que se ingresa como Nota. (puede ser el número de factura) |
dni |
String |
No | Número del Documento. Este parámetro no se considera en los pagos con código QR estático, es decir, cuando operationMethodAllowed = 1. |
operationMethodAllowed |
Integer |
Si | Indica qué operaciones se apoyarán en transacciones de pago, cancelación o devolución. Admita los siguientes valores: 0 - Solo con tarjeta física (leída o mecanografiada); 1 - Solo con QRCode; |
allowBenefit (OBSOLETO) |
Boolean |
No | Indica si el QRCode debe generarse con las opciones de producto asociadas con los beneficios. El valor predeterminado es ‘true’, es decir, se agregar beneficios. Este parámetro no se considera en los pagos con código QR estático, es decir, cuando operationMethodAllowed = 1. Por lo tanto, se convierte en OBSOLETO. |
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 "verdadero", 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 "verdadero", lo que significa que se mostrará el comprobante. |
merchantGroupCode |
String |
Si allowMultimerchant= true, groupCode es obligatorio |
Código de grupo de comerciantes. |
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.additionalValueType |
AdditionalValueType |
No | Presente solo cuando existe una cantidad adicional en el contexto de la transacción ejecutada. Este parámetro no se devuelve para pagos con código QR estático. |
Payment.additionalValue |
BigDecimal |
No | Presente solo cuando existe una cantidad adicional en el contexto de la transacción ejecutada. Este parámetro no se devuelve para pagos con código QR estático. |
Payment.paymentType |
PaymentType |
No | Tipo de pago (Débito, Crédito, Recibo, etc.). Ya no es obligatorio ya que no se devuelve para pagos inmediatos. |
Payment.installments |
Integer |
No | Número de cuotas de pago. |
Payment.accountTypeId |
String |
No | Presente apenas quando um tipo de conta existir no contexto da transação executada. Este parámetro no se devuelve para pagos con código QR estático. |
Payment.planId |
String |
No | Presente solo cuando existe un plan en el contexto de la transacción ejecutada. Este parámetro no se devuelve para pagos con código QR estático. |
Payment.productShortName |
String |
Sí | Corresponde al productShortName correspondiente al producto de marca del contexto de transacción. En el caso de pago inmediato, tiene el valor "PI". |
Payment.ticketNumber |
String |
No | ticketNumber generado por el terminal para la transacción. |
Payment.batchNumber |
String |
Sí | Número de lote de transacción. |
Payment.nsuTerminal |
String |
Sí | NSU Generada por el terminal para la transacción. |
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.Card.brand |
String |
Sí | Marca de la tarjeta. En el caso de pago inmediato, tiene el valor "PAGOS INMEDIATOS". |
Payment.Card.bin |
String |
No | BIN de la tarjeta. Ya no es obligatorio ya que no se devuelve para pagos inmediatos. |
Payment.Card.panLast4Digits |
String |
No | Últimos 4 dígitos del PAN de la tarjeta. Ya no es obligatorio ya que no se devuelve para pagos inmediatos. |
Payment.captureType |
CaptureType |
Sí | Formas de capturar la tarjeta. Para pagos con QR Code estático, siempre es QR_CODE (8), incluso para transferencias. |
Payment.paymentStatus |
PaymentStatus |
Sí | Estado de pago. En el caso de solicitudes devueltas con éxito, esta información siempre estará PENDENTE, 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.acquirerAdditionalMessage |
String |
No | Mensaje adicional enviado por el adquirente en respuesta a la transacción |
Payment.acquirerAuthorizationNumber |
String |
Sí | Número de autorización proporcionado por el adquirente (que se muestra en el recibo del cliente Titular de la tarjeta). |
Payment.Receipt.clientVia |
String |
No | Contenido del recibo - del cliente. |
Payment.Receipt.merchantVia |
String |
No | Contenido del recibo - del establecimiento. |
Payment.cardToken |
String |
No | Token de la tarjeta utilizada en la transacción. |
Payment.cardholderName |
String |
No | Nombre de titular de la tarjeta. Este parámetro no se devuelve para pagos con código QR estático. |
Payment.terminalId |
String |
Sí | Identificación del terminal. |
Payment.note |
String |
No | Valor adicional que se ingresa como Nota. (puede ser el número de factura) Este campo solo aparecerá en la respuesta si la API lo completó en la solicitud de pago; Si es capturado por el bono, no es posible devolverlo, ya que el bono se muestra después de la confirmación, momento en el que la respuesta de pago ya se ha enviado a la aplicación. |
Payment.dni |
String |
No | Número del Documento. Este campo solo aparecerá en la respuesta si la API lo completó en la solicitud de pago; Si es capturado por el bono, no es posible devolverlo, ya que el bono se muestra después de la confirmación, momento en el que la respuesta de pago ya se ha enviado a la aplicación. |
Payment.qrId |
String |
No | Identificador de QrCode generado por el terminal de captura. |
Payment.originalValue |
BigDecimal |
No | Valor orginal de la venta. Presente en pagos con QRCode, cuyo beneficio se haya aplicado al valor original de la venta. |
Payment.acquirerNsu |
String |
No | NSU Acquirer para consulta e identificación de transacciones. |
Payment.Card.aid |
String |
Sí | AID para identificación de la aplicación que procesa la transacción. Es regresado en transaccións EMV. |
Payment.Card.cardAppName |
String |
Sí | APN, o nombre de la aplicación de la tarjeta. Es regresado en transaccións EMV. |
Payment.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 no 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 a la transacción. |
confirmPayment()¶
Se debe llamar a este método para confirmar una transacción 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(), o en pagos con C�digo QR, ya que en este caso la transacción se confirma automáticamente.
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. (el reverso 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 tramos, sin necesidad de un tramo de confirmación. En este caso, si hay algún problema para completar la transacción en el lado del 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 Titular de la 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. |
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.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(), o en pagos con C�digo QR, ya que en este caso la transacción se confirma automáticamente.
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 reverso. 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 aplicación de la terminal ya no puede confirmar la transacción, 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. |
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.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. |
Campo adicional api_pending¶
Además de los métodos de resolución de pago (confirmPayment ycancelPayment), existe la posibilidad de configurar un campo adicional en el Portal Paystore para realizar esta resolución de forma automática, en un momento determinado. Para esto, se debe crear un campo adicional en el Portal Paystore con el tipo JSON y la clave api_pending.
Valor del campo
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
confirmationTime |
String |
Sí | Intervalo, en minutos, para resolver los pagos pendientes. |
transactionConfirmation |
String |
Sí | Acción a tomar. Permite valores CONFIRM (Confirmar transacción) oUNDO (Deshacer transacción). |
{
"confirmationTime": "10",
"transactionConfirmation": "CONFIRM"
}
Ejemplo de flujo de pago¶
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.PaymentClient;
import br.com.phoebus.android.payments.api.PaymentRequestV2;
import br.com.phoebus.android.payments.api.PaymentV2;
import br.com.phoebus.android.payments.api.exception.ClientException;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, PaymentClient.PaymentCallback<PaymentV2> {
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(){
PaymentRequestV2 request = new PaymentRequestV2();
BigDecimal value = BigDecimal.valueOf(5000).movePointLeft(2);
request.setValue(value);
request.setAppTransactionId("2d2f7dc7-88e5-467e-86a3-f173fb3c7792");
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.startPaymentV2(request, this);
} catch (ClientException e) {
Log.e(TAG, "Error starting payment", e);
}
}
@Override
public void onSuccess(PaymentV2 paymentV2) {
Log.i(TAG, paymentV2.toString());
doConfirmPayment(paymentV2);
/*
Si, en su regla de comercial, necesita deshacer la transacción por algún motivo,
llamar al método CancelPayment(paymentV2)
**/
}
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, errorData.getResponseMessage());
Toast.makeText(this, errorData.getResponseMessage(), Toast.LENGTH_LONG).show();
}
private void doConfirmPayment(PaymentV2 paymentV2) {
try {
paymentClient.confirmPayment(paymentV2.getPaymentId(),
new PaymentClient.PaymentCallback<PaymentV2>() {
@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(PaymentV2 paymentV2) {
try {
paymentClient.cancelPayment(paymentV2.getPaymentId(),
new PaymentClient.PaymentCallback<PaymentV2>() {
@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);
}
}
}