Introducción
Desarrolla una aplicación de punto de venta para dispositivos móviles utilizando el SDK de Clip y un dispositivo Clip Plus.
Prerrequisitos
Para poder integrar el SDK de Clip a tu aplicación de Android, debes cumplir los siguientes prerrequisitos:
- Tener una cuenta de Clip.
- Que tu aplicación soporte, como mínimo, la versión 17 de Android.
- Agregar las librerías del SDK como dependencias en el proyecto de Android.
- Configurar los permisos del dispositivo requeridos por el SDK.
Ambientes de desarrollo
Nota
Por el momento no existe un ambiente “sandbox” para pruebas y sólo está disponible el ambiente de producción.
Trabajando con el proyecto demo
El SDK de Clip para Android te ofrece un proyecto demo. Es una referencia para la integración del SDK en una aplicación Android.
Las funciones que permite desarrollar la librería son:
- Crear un objeto de pago
- Obtener el historial de transacciones
- Iniciar y cerrar la sesión de Clip desde tu aplicación
- Configurar los ajustes del dispositivo (Settings)
- Crear enlaces para pagos a distancia
Permisos del dispositivo
Para poder integrar el SDK de Clip en tu aplicación de Android, es necesario incluir los siguientes permisos para el dispositivo que utilizará la aplicación.
Configura tu archivo AndroidManifest.xml con los siguientes permisos:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
La siguiente lista incluye una descripción para cada uno de los permisos del dispositivo:
- INTERNET: Permite que la aplicación se conecte a internet.
- ACCESS_NETWORK_STATE, ACCESS_WIFI_STATE: Permite verificar el estado de conectividad de red del dispositivo.
- ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION: Para obtener la ubicación del lugar en que se realiza la transacción.
- BLUETOOTH, BLUETOOTH_ADMIN: Para descubrir y emparejar nuevos dispositivos desde la aplicación Android y conectarse con la terminal de Clip.
Agregando las Dependencias
Es necesario agregar el SDK de Clip como dependencia en el archivo build.gradle de tu proyecto de Android.
Agrega el siguiente repositorio en el módulo del proyecto:
allprojects {
repositories {
…
maven {url 'https://developer.huawei.com/repo/'}
}
}
Agrega las siguientes dependencias en el módulo de aplicación:
dependencies {
implementation 'com.payclip.sdk:payment-ui:2.1.1'
implementation 'com.payclip.sdk:plus-reader:1.2.0'
}
Inicializando la aplicación
Inicializa el SDK de Clip desde tu clase Application.
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
ClipApi.init(this, ClipPlusApi())
}
}
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ClipApi.init(this, new ClipPlusApi());
}
}
Nota
La instancia de ClipPlusApi() brinda compatibilidad para los lectores Clip Plus y Clip Plus 2.
Iniciar la sesión de Clip
Desde tu aplicación, puedes iniciar la sesión de Clip en tu aplicación.
Para iniciar la sesión de Clip desde la aplicación, implementa la siguiente función:
ClipApi.login(email: String, password: String, object: LoginListener {
override fun onLoginSuccess(statusCode: Int) {
// Login was successful
}
override fun onLoginFailed(statusCode: Int) {
// Login failed
}
})
ClipApi.logout(String email, String password, new LoginListener() {
@Override
public void onLoginSuccess(int statusCode) {
//Login was successful.
}
@Override
public void onLoginFailed(int statusCode) {
//Login failed.
}
});
Nota
También es posible iniciar la sesión de Clip desde la pantalla de Ajustes.
Cerrar la sesión de Clip
Desde tu aplicación, puedes solicitar cerrar la sesión de Clip.
Para cerrar la sesión de Clip desde la aplicación, implementa la siguiente función:
ClipApi.logout(object : LogoutListener {
override fun onLogoutSuccess(statusCode: Int) {
// Logout was successful
}
override fun onLogoutFailed(statusCode: Int) {
// Logout failed
}
})
ClipApi.logout(new LogoutListener() {
@Override
public void onLogoutSuccess(int statusCode) {
//Logout was successful.
}
@Override
public void onLogoutFailed(int statusCode) {
//Logout failed.
}
});
Nota
También es posible cerrar la sesión de Clip desde la pantalla de Ajustes.
El objeto ClipPayment
Crear un objeto de pago
Para integrar la función de pagos con tarjeta usando el Clip Plus, se requiere:
- Crear un objeto de pago en la aplicación
- Agregar un listener para el botón o elemento gráfico de pago en tu aplicación
Para crear un objeto de pago, implementa la siguiente función:
val clipPayment = ClipPayment.Builder()
.amount(amount: BigDecimal)
.enableContactless(enabled: Boolean)
.enableTips(enabled: Boolean)
.roundTips(round: Boolean)
.enablePayWithPoints(enabled: Boolean)
.customTransactionId(customTransactionId: String?)
.build()
ClipPayment clipPayment = new ClipPayment.Builder()
.amount(BigDecimal: amount)
.enableContactless(boolean enabled)
.enabledTips(boolean enabled)
.roundTips(boolean round)
.enablePayWithPoints(boolean enabled)
.customTransactionId(String customTransactionId)
.build();
La siguiente tabla incluye una descripción para los elementos del objeto ClipPayment:
Elemento |
Tipo de Dato |
Descripción |
amount |
Big Decimal |
Cantidad de la transacción. |
enableContactless |
Boolean |
Por medio de un switch, permite activar o desactivar las transacciones con tecnología contactless en el dispositivo Clip Plus 2. |
enableTips |
Boolean |
Permite mostrar la pantalla de selección de propina en el flujo de pago. |
roundTips |
Boolean |
Cuando enableTips está activo, permite redondear los decimales de la cantidad de la propina. |
enablePayWithPoints |
Boolean |
Por medio de un switch, permite activar o desactivar el pago con puntos. |
customTransactionId |
String |
Referencia personalizada proporcionada por el cliente. Longitud: 100 caracteres Validación: cadena alfanumérica y los siguientes caracteres especiales @ # $ & ( ) _ - , . |
En el listener del botón de pago de tu aplicación, agrega la siguiente función:
ClipApi.launchPaymentActivity(activity: Activity, payment: ClipPayment, requestCode: Int)
ClipApi.launchPaymentActivity(Activity activity, ClipPayment payment, int requestCode);
El resultado de una transacción será recibido en el método onActivityResult() del Activity que invocó el método de pago.
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
when (requestCode) {
REQUEST_CODE_PAYMENT -> {
when (data?.getIntExtra(StatusCode.RESULT_CODE, StatusCode.FAILURE)) {
StatusCode.SUCCESSFUL -> {
val transactionResult = data.getParcelableExtra<ClipTransaction>(StatusCode.RESULT_PAYMENT_DATA)
// Transaction succeeded
}
StatusCode.FAILURE -> {
// Transaction failed
}
}
}
else -> super.onActivityResult(requestCode, resultCode, data)
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
String content;
if (requestCode == REQUEST_CODE_PAYMENT) {
case REQUEST_CODE_PAYMENT_RESULT :
switch(data.getIntExtra(StatusCode.RESULT_CODE, StatusCode.FAILURE)) {
case StatusCode . SUCCESSFUL :
ClipTransaction transactionResult = data . getParcelableExtra (StatusCode.RESULT_PAYMENT_DATA);
// Transaction succeeded
break;
case StatusCode . FAILURE :
int errorCode = data . getIntExtra (StatusCode.RESULT_ERROR, -1);
String errorCodeDesc = data . getStringExtra (StatusCode.RESULT_ERROR_DESC);
String messageError = data . getStringExtra (StatusCode.RESULT_ERROR_MESSAGE);
// Transaction failed
break;
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
Restringir pagos con ciertos tipos de tarjetas
El SDK de Clip permite especificar una lista de números BIN (Número de Identificación Bancario, por sus siglas en inglés) restringidos de las tarjetas de las que no se desea recibir pagos. El número BIN son los primeros seis dígitos de una tarjeta.
Nota
La función de restringir pagos por número BIN sólo es compatible con pagos con tarjeta swipe y chip. No es compatible para pagos en modo contactless.
Para proporcionar esta lista restringida al SDK, primero es necesario crear una lista de objetos del tipo CardBin cuyo único parámetro es un String que contiene el BIN de la tarjeta:
val listOfBins = listOf(CardBin(“XXXXXX”), CardBin(“XXXXXX”))
List<CardBin> listOfBins = Arrays.asList(CardBin(“XXXXXX”), CardBin(“XXXXXX”));
Nota
El regex que se valida es: ^\d{0,6}$
De no cumplir con el formato especificado, se regresará una excepción de tipo: InvalidParameterFormat.
Ya que se creó y envió la lista, es necesario llamar a la función ClipApi.setCardBinRestriction() y pasar como parámetro la lista creada:
ClipApi.setCardBinRestriction(restrictionType: RestrictionType, listOfBins: List<CardBin>)
ClipApi.setCardBinRestriction(RestrictionType restrictionType, List<CardBin> listOfBins);
La siguiente tabla incluye una descripción para el objeto RestrictionType:
Elemento |
Descripción |
RestrictionType.ALLOWED |
Únicamente se aceptarán pagos con las tarjetas provistas por medio de listOfBins. |
RestrictionType.DENIED |
Las tarjetas que se pasen por medio de listOfBins no se aceptarán en los pagos. |
Nota
Es necesario crear y enviar la lista de números restringidos antes de iniciar una transacción.
Obtener el historial de transacciones
El SDK de Clip permite obtener el historial de transacciones que se han realizado.
Las funciones disponibles para trabajar con el historial son las siguientes:
- search(): permite realizar una búsqueda de transacciones del mismo día y aplicar distintos filtros.
- detail(): muestra detalles para una transacción individual.
- refund(): realiza el reembolso de una transacción.
La siguiente tabla muestra los elementos en el objeto de respuesta ClipTransaction que regresan las funciones anteriores:
Elemento |
Descripción |
Tipo de dato |
|||
receiptNumber |
Identificador único de la transacción |
String |
|||
amount |
Cantidad del pago |
BigDecimal |
|||
tip |
Cantidad de la propina |
BigDecimal |
|||
totalAmount |
Cantidad total del pago incluyendo propina |
BigDecimal |
|||
cardType |
Tipo de tarjeta utilizada para el pago:
|
Object, string |
|||
last4 |
Últimos cuatro dígitos de la tarjeta utilizada para el pago |
String |
|||
installment |
Indica si el pago se difiere en mensualidades |
String |
|||
walletAmount |
Cantidad a pagar con monedero electrónico |
BigDecimal |
|||
walletType |
Tipo de monedero
|
Object |
|||
walletSubType |
Clasificación de la tarjeta de puntos. Posibles tipos de tarjetas:
|
String |
|||
merchantInvoiceId |
Referencia alfanumérica proporcionada por el vendedor |
String |
|||
status |
Estado de la transacción. Lista de posibles estados de la transacción:
|
Object, string |
|||
currency |
Código de divisa para la transacción del pago conforme a ISO 4217 |
String |
|||
paymentDate |
Fecha de creación del pago |
Date |
|||
location |
Objeto que contiene la información de ubicación |
Object |
|||
|
longitude |
Coordenada de longitud para la ubicación de la transacción |
Double |
||
|
latitude |
Coordenada de latitud para la ubicación de la transacción |
Double |
Buscar transacciones en el historial
Implementa la siguiente función para buscar transacciones en el historial:
ClipHistory.search(SearchParamsRequest.byDate(date: Date, page: Int), object : ClipHistoryListener.OnSearchSuccessListener {
override fun onSearchSuccess(response: List<ClipTransaction>?) {
}
}, , object : ClipHistoryListener.OnErrorListener {
override fun onError(error: StatusCode.ClipError) {
}
})
ClipHistory.search(SearchParamsRequest.byDate(Date date, int page), new ClipHistoryListener.OnSearchSuccessListener() {
@Override
public void onSearchSuccess(@Nullable List<ClipTransaction> list) {
}
}, new ClipHistoryListener.OnErrorListener() {
@Override
public void onError(@NotNull StatusCode.ClipError clipError) {
}
});
La siguiente tabla incluye una descripción para los parámetros de la función:
Elemento |
Descripción |
|
SearchParamsRequest |
Función de búsqueda |
|
|
.byCardNumber |
Realiza la búsqueda por el número de tarjeta utilizada para el pago |
|
.byDate |
Realiza la búsqueda por la fecha del pago |
|
.byDateRange |
Realiza la búsqueda por un rango de fechas definido |
|
.byReceiptNumber |
Realiza la búsqueda por el número de recibo que identifica al pago |
CardNumber: El objeto CardNumber está compuesto por los últimos 4 dígitos que aparecen en la tarjeta.
Elemento |
Descripción |
Tipo de dato |
|||
value |
L os últimos 4 dígitos que aparecen en la tarjeta. El regex que se valida es: ^\d{0,4}$ De no cumplir con el formato especificado, se regresará una excepción de tipo: InvalidParameterFormat. |
String |
ReceiptNumber: El objeto ReceiptNumber representa el número de recibo generado por Clip al concluir una transacción de manera exitosa.
Elemento |
Descripción |
Tipo de dato |
|||
value |
Número de recibo generado por Clip. El regex que se valida es: ^[a-zA-Z0-9-_]{0,}$ De no cumplir con el formato especificado, se regresará una excepción de tipo: InvalidParameterFormat. |
String |
Mostrar los detalles de una transacción
Implementa la siguiente función para mostrar los detalles de una transacción en específico:
ClipHistory.detail(receiptNumber: ReceiptNumber, object : ClipListener<ClipTransaction?> {
override fun onCompleteListener(response: ClipTransaction?, error: StatusCode.ClipError?) {}
})
ClipHistory.detail(ReceiptNumber receiptNumber, new ClipListener<ClipTransaction?>() {
@Override
public void onCompleteListener(@Nullable ClipTransaction clipTransaction, @Nullable StatusCode.ClipError error) {
}
});
La siguiente tabla incluye una descripción para los parámetros de la función:
Elemento |
Descripción |
|
receiptNumber |
Realiza la búsqueda por el número de recibo que identifica al pago |
|
timeZone |
Representación de la zona horaria. |
Realizar una devolución de transacción
Implementa la siguiente función para realizar una devolución de transacción en específico:
ClipRefund.refund(receiptNumber: ReceiptNumber, object : ClipListener<Boolean> {
override fun onCompleteListener(response: Boolean, error: StatusCode.ClipError?) {}})
ClipRefund.refund(ReceiptNumber receiptNumber, new ClipHistoryListener<Boolean>() {
@Override
public void onCompleteListener(boolean response, @Nullable StatusCode.ClipError error) {
}
}});
La siguiente tabla incluye una descripción para los parámetros de la función:
Elemento |
Descripción |
|
receiptNumber |
Número de recibo que identifica la transacción a realizar el reembolso |
Configurar los ajustes del dispositivo
La librería de Clip permite configurar ciertos ajustes del dispositivo desde tu aplicación de Android.
Actualmente, los ajustes de configuración que se pueden consultar son:
- Batería: muestra el nivel de batería en el dispositivo Clip.
- Firmware: muestra la versión de firmware instalada en el dispositivo Clip.
- Tiempo de apagado: permite configurar el tiempo de apagado automático en tu Clip Plus 2 para ahorrar batería.
- Sesión de Clip: la sección de ajustes permite cerrar sesión en la cuenta Clip.
- Lector conectado: permite conectar o desconectar un lector Clip por medio de conexión Bluetooth.
Nota
La configuración de Tiempo de apagado solo está disponible para el dispositivo Clip Plus 2.
Para agregar la función de configuración de ajustes, en el listener del botón tu aplicación Android, agrega la siguiente función:
ClipApi.showSettingsActivity(activity: Activity, loginEnabled: Boolean, logoutEnabled: Boolean, requestCode: Integer)
ClipApi.showSettingsActivity(Activity activity, boolean loginEnabled, boolean logoutEnabled, requestCode: Integer);
La siguiente tabla incluye una descripción para los parámetros de la función:
Elemento |
Tipo de Dato |
Descripción |
loginEnabled |
Boolean |
Permite mostrar un botón de Login dentro de la pantalla de ajustes. |
logoutEnabled |
Boolean |
Permite mostrar un botón de Logout dentro de la pantalla de ajustes. |
Pagos a distancia
El SDK de Clip permite que con tu propia aplicación de Android generes enlaces para pagos a distancia.
Esta sección incluye cómo implementar las siguientes funciones:
- Crear un enlace para pago a distancia
- Consultar el historial y realizar búsquedas
- Consultar detalles individuales de un pago a distancia
- Cancelar un enlace de pago a distancia
Crear un pago a distancia
Para poder generar un URL de pago a distancia, es necesario llamar a la siguiente función:
ClipApi.launchRemotePaymentActivity(activity: Activity, amount: BigDecimal, requestCode: Int)
ClipApi.launchRemotePaymentActivity(Activity activity, BigDecimal amount, int requestCode);
Consultar el historial de pagos a distancia
Para agregar la función de historial de pagos a tu aplicación, el primer paso es crear un objeto con el tipo de filtro que se desea aplicar.
Los diferentes tipos de búsqueda que incluye este método son:
- Fecha
- Rango de fechas
- Cantidad
- Correo electrónico del cliente
- Código de enlace de pago
Para buscar por cantidad del enlace de pago:
val query = SearchParamsRequest.byAmount(amount: String, page: Int)
Map<String, String> query = SearchParamsRequest.byAmount(String amount, int page);
Para buscar por dirección de correo electrónico del cliente:
val query = SearchParamsRequest.byCustomerEmail(customerEmail: String, page: Int)
Map<String, String> query = SearchParamsRequest.byCustomerEmail(String customerEmail, int page);
Para buscar por fecha:
val query = SearchParamsRequest.byDate(date: Calendar, page: Int)
Map<String, String> query = SearchParamsRequest.byDate(Calendar date, int page);
Para buscar por rango de fechas:
val query = SearchParamsRequest.byDateRange(dateFrom: Calendar, dateTo: Calendar, page: Int)
Map<String, String> query = SearchParamsRequest.byDateRange(Calendar dateFrom, Calendar dateTo, int page);
Para buscar por código del enlace de pago:
val query = SearchParamsRequest.byRequestNumber(requestCode: String, page: Int)
Map<String, String> query = SearchParamsRequest.byRequestNumber(String requestCode, int page);
Implementar el método de búsqueda:
Después de crear el método con el tipo o tipos de búsqueda a integrar en tu aplicación, agrega el método de búsqueda general.
Para agregar la función de historial de pagos a tu aplicación, implementa el siguiente método:
ClipRemotePayment.search(searchQuery: SearchQuery, object : ClipListener<RemotePaymentHistoryResponse?> {
override fun onCompleteListener(response: RemotePaymentHistoryResponse?, error: StatusCode.ClipError?) {
}
})
ClipRemotePayment.search(Map<String, String> searchQuery, new ClipListener<RemotePaymentHistoryResponse?>() {
@Override
public void onCompleteListener(@Nullable RemotePaymentHistoryResponse response, StatusCode.ClipError error) {
}
});
Filtrar el historial de pagos a distancia por estado de la transacción:
Adicionalmente, la lista de resultados del historial de pagos a distancia permite filtrar por estado de la transacción.
Los estados de transacción que puede tener un pago a distancia son:
- PENDING: estado pendiente de la transacción desde el momento de su creación hasta que se realiza el pago. Una transacción con estado pendiente tiene un tiempo de expiración de 72 horas.
- PAID: el pago a distancia ha sido completado de forma exitosa.
- CANCELLED: el pago a distancia fue cancelado antes de realizar el pago.
- OVERDUE: el pago no se completó dentro de las 72 horas de validez.
- REFUNDED: el pago fue reembolsado.
Para integrar el filtro por estado de transacción, crea el siguiente objeto:
val query = SearchParamsRequest.byStatus(status: RemotePaymentFilter, page: Int)
Map<String, String> query = SearchParamsRequest.byStatus(RemotePaymentFilter status, int page);
Los códigos de estado que actúan como parámetro son:
- RemotePaymentFilter.PENDING: 0
- RemotePaymentFilter.PAID: 1
- RemotePaymentFilter.CANCELLED: 2
- RemotePaymentFilter.OVERDUE: 3
- RemotePaymentFilter.REFUNDED: 4
La siguiente tabla describe los elementos que regresa la función en el objeto de respuesta RemotePaymentHistoryResponse:
Elemento |
Descripción |
Tipo de dato |
|||
RemotePaymentHistoryResponse |
Objeto que contiene los resultados de la consulta del historial
|
object |
|||
|
RemotePaymentItem |
Lista de objetos tipo RemotePaymentItem con información del historial de enlaces de pago a distancia. |
list |
||
|
|
requestId |
Identificador para la solicitud del enlace de pago. |
string |
|
|
|
requestCode |
Identificador para el pago, parámetro del enlace URL que se envía al cliente. |
string |
|
|
|
amount |
Cantidad a pagar. El límite actual para pagos a distancia es de 1500 pesos. |
big decimal |
|
|
|
customerEmail |
Correo electrónico del cliente |
string |
|
|
|
status |
Objeto que mapea el estado correspondiente del enlace de pago |
object |
|
|
|
|
RemotePaymentHistoryStatus |
Estado del enlace de pago al momento de la consulta. Posibles estados:
|
string |
|
|
createdDate |
Fecha de creación del enlace para pago a distancia |
date |
|
|
|
dueDate |
Fecha de expiración del enlace |
date |
|
|
RemotePaymentPagination |
Objeto de paginación para los resultados |
|
||
|
|
totalItems |
Número total de elementos que contiene la lista. |
integer |
|
|
|
itemsPerPage |
Especifica el número de elementos a mostrar en cada página. |
integer |
Consultar los detalles de un pago a distancia
Se consultan los detalles de una transacción por medio del identificador Request Code.
Para consultar los detalles de la transacción, agrega la siguiente función:
ClipRemotePayment.detail(requestCode: String, object : ClipListener<RemotePaymentDetailResponse?>{
override fun onCompleteListener(response: RemotePaymentDetailResponse, error: StatusCode.ClipError?) {
}
})
ClipRemotePayment.detail(String requestCode, new ClipListener<RemotePaymentDetailResponse>(){
@Override
public void onSuccess(@Nullable RemotePaymentDetailResponse response, @Nullable StatusCode.ClipError error) {
}
});
La siguiente tabla describe los elementos que regresa la función en el objeto de respuesta RemotePaymentDetailResponse:
Elemento |
Descripción |
Tipo de dato |
||
RemotePaymentDetailResponse |
Objeto que contiene los detalles de un pago a distancia |
object |
||
|
requestId |
Identificador para la solicitud del enlace de pago. |
string |
|
|
requestCode |
Identificador para el pago, parámetro del enlace URL que se envía al cliente. |
string |
|
|
amount |
Cantidad a pagar. El límite actual para pagos a distancia es de 1500 pesos. |
big decimal |
|
|
customerEmail |
Correo electrónico del cliente. |
string |
|
|
status |
Objeto que contiene información del estado del enlace de la transacción. |
object
|
|
|
|
RemotePaymentHistoryStatus |
Posibles estados:
|
|
|
createdDate |
Fecha de creación del enlace para pago a distancia. |
date |
|
|
dueDate |
Fecha de expiración del enlace de pago. |
date |
|
|
message |
Concepto personalizado al crear el enlace. |
string |
|
|
closedDate |
Fecha en que se finalizó el proceso de transacción. |
date |
|
|
link |
Enlace para el pago a distancia que contiene como parámetro el requestCode. |
string |
|
|
receiptNumber |
Número de recibo proporcionado por el cliente. |
string |
|
|
cardLast4 |
Últimos 4 dígitos del número de tarjeta utilizada para el pago. |
string |
Cancelar un pago a distancia
La librería del SDK de Clip permite cancelar un URL de pago a distancia antes de que se haya completado el pago.
La solicitud de un pago a distancia se identifica por un Request Code.
Para cancelar un pago a distancia, agrega la siguiente función:
ClipRemotePayment.cancel(requestCode: RequestCode, object : ClipListener<RemotePaymentDetailResponse?>{
override fun onCompleteListener(response: RemotePaymentDetailResponse?, error: StatusCode.ClipError?) {
}
})
ClipRemotePayment.cancel(RequestCode requestCode, new ClipListener<RemotePaymentDetailResponse>() {
@Override
public void onCompleteListener(@Nullable RemotePaymentDetailResponse response, @Nullable StatusCode.ClipError error) {
}
});