Smart SDK.

Los pasos, para integrar tu aplicación de Android con el SDK de NetPay, se detallan a continuación:

1. Añadir repositorio necesario.

La implementación del SDK es mediante JitPack el cual nos ayuda a incluir repositorios remotos a nuestro proyecto.

El primer paso es añadir Maven Jitpack a la lista de repositorios en el fichero raíz gradle (Project).

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

2. Añadir la información de la dependencia.

El siguiente paso es añadir la información de la dependencia que se quiere incluir en la aplicación en el fichero gradle (Module: app).

📘

Nota

Puedes revisar las últimas versiones liberadas directamente desde Jitpack la versión mas actualizada es la 1.1.5.

Ejemplo de cómo añadir la dependencia con la versión V1.1.5 es la siguiente.

dependencies {
    implementation 'com.gitlab.netpaymx.netpay-sdks:smart-sdk:V1.1.5'
}

Demo SDK.

📘

Nota

Para cualquier duda se anexa la liga del drive donde se encuentra el ejemplo del Demo SDK en el siguiente enlace https://drive.google.com/drive/folders/1nSUJ5yl8afwnyO4_LlmW-IjS4Sk0iOof para su descarga.
Este enlace incluye:

  • APK listo para instalar "app-debug.apk".
  • Carpeta .zip con el proyecto Demo "smart-sdk-demo-v8.zip".
Demo SDK.Demo SDK.

Demo SDK.

3. Importar dependencias.

Se deben importar las siguientes dependencias a tu archivo .java o .kt donde se utilizarán las operativas de venta.

import mx.com.netpay.sdk.SmartApiFactory
import mx.com.netpay.sdk.exceptions.SmartApiException
import mx.com.netpay.sdk.models.*

4. Inicializar el SDK.


Debes inicializar el SDK para poder hacer uso de todas las funcionalidades disponibles llamando al método createSmartApi().

En este ejemplo creamos una constante llamada smartApi y le asignamos el valor devuelto.

private val smartApi = SmartApiFactory.createSmartApi(this)
private SmartApi smartApi = SmartApiFactory.INSTANCE.createSmartApi(this);

5. Crear objeto SaleRequest para una venta.

Se debe crear una instancia de la clase SaleRequest que puede recibir los siguientes parámetros:

Parámetro.

Tipo de parámetro.

Descripción.

Restricciones.

appId

String

Nombre del paquete de la aplicación.

*Obligatorio

amount

Double

Monto a cobrar, máximo 2 decimales.

*Obligatorio

msi

Int

Indica la cantidad de meses a diferir la compra (3, 6, 9, 12, 18).

Opcional

tip

Double

Monto opcional para propina, máximo 2 decimales.

Opcional

folio

String

Número identificador de transacción que puede ser enviado en la solicitud de venta.

*Obligatorio

val sale = SaleRequest("mx.com.netpay.demosdk", amount,msi,tip,folio)
SaleRequest sale = new SaleRequest("mx.com.netpay.demosdk", amount, tip,msi, null, null,
                        null, null, folio, null, null, null, null,
                        null, null);

5.1 Implementar propina.

En caso de implementar ventas con propina, utilizar el siguiente código:

saleButton.setOnClickListener {
  
val folio = folio.text.toString()
val amount = amountTE.text.toString().toDoubleOrNull()?:0.0
val tip = tip.text.toString().toDoubleOrNull()?:0.0
 val msi = msi.text.toString().toIntOrNull()()?:0
val sale = SaleRequest("mx.com.netpay.demosdk", amount, folio = folio,msi = msi, tip = tip)
  
 try {
                smartApi.doTrans(sale)
            } catch (e: SmartApiException) {
                Toast.makeText(this, e.message,Toast.LENGTH_LONG).show()
            }
        }
double amount = Double.parseDouble(amountEt.getText().toString());
double tip =Double.parseDouble(amountEt.getText().toString());
SaleRequest sale = new SaleRequest("mx.com.netpay.demosdk", amount, tip,null, null, null, null, null, null, null, null, null, null,null, null);

📘

Nota

Para activar en la Smart PinPad DEV la opción de propina, ir al apartado de [configuración].
https://netpay.readme.io/docs/introducci%C3%B3n-7#configuraci%C3%B3n-de-la-terminal-opcional

6. Crear método doTrans() para enviar una venta.

Podemos enviar una petición para realizar el cobro mediante el método doTrans(), el cual recibe por parámetro el objeto de tipo SaleRequest creado en el paso anterior.

saleButton.setOnClickListener {
  
val folio = folio.text.toString()
val amount = amountTE.text.toString().toDoubleOrNull()?:0.0
val tip = tip.text.toString().toDoubleOrNull()?:0.0
 val msi = msi.text.toString().toIntOrNull()()?:0
val sale = SaleRequest("mx.com.netpay.demosdk", amount, folio = folio,msi = msi, tip = tip)
  
 try {
                smartApi.doTrans(sale)
            } catch (e: SmartApiException) {
                Toast.makeText(this, e.message,Toast.LENGTH_LONG).show()
            }
        }
double amount = Double.parseDouble(amountEt.getText().toString());

                double tip =Double.parseDouble(amountEt.getText().toString());

                SaleRequest sale = new SaleRequest("mx.com.netpay.demosdk", amount, tip,null, null, null,
                        null, null, null, null, null, null, null,
                        null, null);
                smartApi.doTrans(sale);

7. Crear objeto ReprintRequest para reimpresión de Ticket.

Para poder reimprimir el Ticket de una venta realizada, es necesario crear una instancia de la clase
ReprintRequest la cual recibe por parámetros lo siguiente:

Parámetro.

Tipo de parámetro.

Descripción.

Restricciones.

appId

String

Nombre del paquete de la aplicación.

*Obligatorio

orderId

String

Número de la orden a reimprimir.

*Obligatorio

val sale = ReprintRequest("mx.com.netpay.demosdk", orderId )
try {
    smartApi.doTrans(sale)
} catch (e: SmartApiException) {
    Toast.makeText(this, e.message,Toast.LENGTH_LONG).show()
}
String orderId = orderIdEt.getText().toString();
                ReprintRequest reprintRequest = new ReprintRequest("mx.com.netpay.demosdk", orderId);
                smartApi.doTrans(reprintRequest);

8. Crear objeto CancelRequest para cancelar una venta.

Si se desea cancelar una venta previamente realizada, es necesario crear un objeto de tipo CancelRequest, el cuál recibe por parámetros lo siguiente:

Parámetro.

Tipo de parámetro.

Descripción.

Restricciones.

appId

String

Nombre del paquete de la aplicación.

*Obligatorio

orderId

String

Número de la orden a cancelar.

*Obligatorio

val sale = CancelRequest("mx.com.netpay.demosdk", orderId )
try {
    smartApi.doTrans(sale)
} catch (e: SmartApiException) {
    Toast.makeText(this, e.message,Toast.LENGTH_LONG).show()
}
String orderId = orderIdEt.getText().toString();
               
CancelRequest voidRequest = new CancelRequest("mx.com.netpay.demosdk", orderId);
smartApi.doTrans(voidRequest);

📘

Nota.

Sólo se puede cancelar una transacción realizada el mismo día, y la cancelación se debe solicitar antes de las 20:00 hora Ciudad de México por el monto total.

9. Obtener la respuesta.

Cuando el usuario termina con la actividad subsiguiente y regresa, el sistema llama al método onActivityResult() de la actividad. Este método incluye tres parámetros:
• requestCode (Int) [requerido]: Código de solicitud que se pasó a startActivityForResult().
• resultCode (Int) [requerido]: Código de resultado especificado por la segunda actividad. El valor será RESULT_OK en caso de que la operación se haya realizado de manera correcta. En caso de que no, el resultado será RESULT_CANCELEDE, ya sea por que se haya retirado el usuario o falló la operación por algún motivo.
• data (Intent) [requerido]: Intent que lleva los datos del resultado.

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if(data != null) {
        val response = when(requestCode) {
            Constants.SALE_REQUEST -> smartApi.onResult(requestCode,resultCode,data) as SaleResponse
            Constants.CANCEL_REQUEST -> smartApi.onResult(requestCode,resultCode,data) as CancelResponse
            Constants.REPRINT_REQUEST-> smartApi.onResult(requestCode,resultCode,data) as ReprintResponse
            else -> null
        }
        tvResponse.text = Gson().toJson(response) //TextView para mostrar la respuesta en formato JSON
    }
}
@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(data != null) {
            BaseResponse response = null;
            switch (requestCode) {
                case Constants.SALE_REQUEST:
                    response = (SaleResponse) smartApi.onResult(requestCode,resultCode,data);
                    break;

                case Constants.CANCEL_REQUEST:
                    response = (CancelResponse) smartApi.onResult(requestCode,resultCode,data);
                    break;

                case Constants.REPRINT_REQUEST:
                    response = (ReprintResponse) smartApi.onResult(requestCode,resultCode,data);

                    break;

                case Constants.PRINT_REQUEST:
                    response = (PrintResponse) smartApi.onResult(requestCode,resultCode,data);
                    break;
            }
            if(response != null) {
                responseTv.setText(new Gson().toJson(response));
            }
        }
    }

Ver detalle de los JSON de respuesta Venta, Reimpresión y Cancelación.

10. Crear objeto PrintRequest para Ticket personalizado.

Si se requiere implementar la solicitud de impresión, se puede utilizar el siguiente código:

print.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Crear una página
                IPage page = smartApi.createPage();

                //Crear unidad que contiene texto y otros formatos
                IPage.ILine.IUnit unit1 = page.createUnit();
                unit1.setText("Texto 1");
                unit1.setGravity(Gravity.START);

                //Se pueden agregar 2 o más unidades a una línea y se dividirá en columnas
                IPage.ILine.IUnit unit2 = page.createUnit();
                unit2.setText("Texto 2");
                unit2.setGravity(Gravity.END);

                //Se crea una línea y se agregan sus unidades.
                page.addLine().
                        addUnit(unit1).
                        addUnit(unit2);

                //Se crea una nueva unidad
                IPage.ILine.IUnit unit3 = page.createUnit();
                unit3.setText("Texto 3");
                unit3.setGravity(Gravity.CENTER);

                //Se crea una nueva línea y se agrega la unidad pasada
                page.addLine().addUnit(unit3);

                //Se crea un request del tipo PrintRequest con el package name del app y la página creada
                PrintRequest printRequest = new PrintRequest("mx.com.netpay.demosdk", page);

                smartApi.doTrans(printRequest);
            }
        });

11. Customizar el logo en el ticket de venta.

Ejemplo de Ticket con un logo implementado.

val page = smartApi.createPage()
                val bm = BitmapFactory.decodeResource(resources,R.drawable.logo_ticket)

                smartApi.doTrans(sale,page,bm)

📘

Nota.

El tamaño del logotipo debe tener como máximo una altura de 100px y un ancho de 150px. De lo contrario podría generar conflicto.

12. JSON de respuesta Venta, Reimpresión y Cancelación

{
    "affiliation":" 9352287370",
    "amount":"109.0",
    "authCode":"222222",
    "bin":"376665",
    "cardType":"C",
    "cardTypeName":"AMEX",
    "folioNumber":"prueba1",
    "isRePrint":false,
    "orderId":"200917102306-0820649118",
    "reprintModule":"C", 
    "spanRoute":"1234",
    "transDate":"SEP,17,20 15:10:06",
    "transType":"A",
    "meessage":"Transaccion exitosa",
    "success":true
  }
{
    "autCode":"222222",
    "folioNumber":"prueba1",
    "isRePrint":true,
    "orderId":"200917102306-0820649118",
    "reprintModule":"C", 
    "spanRoute":"8425",
    "transType":"A",
    "meessage":"Transaccion exitosa",
    "success":true
  }
{
    "autCode":"222222",
    "folioNumber":"prueba1",
    "isRePrint":false,
    "orderId":"200917102306-0820649118",
    "reprintModule":"C", 
    "spanRoute":"8425",
    "transType":"V",
    "meessage":"Transaccion exitosa",
    "success":true
  }

Campo

Descripción

Tipo

Ejemplo

Tipo de transacción a la que aplica

success

Si la respuesta es exitosa contesta con "true" si la respuesta es declinada contesta con "false".

Boolean

Dependiendo el resultado:

  1. """true""
  2. ""false"""

Venta.
Reimpresión.
Cancelación.

message

Mensaje que indica el estatus de la transacción. Puede indicar si esta fue aceptada o declinada y por qué motivo.

String

Dependiendo el resultado:

  1. """Transacción exitosa""
  2. ""Error de conexión""
  3. ""TRANSACCION RECHAZADA"

Venta.
Reimpresión.
Cancelación.

authCode

Valor generado por la autoridad de autorización para una transacción aprobada.

String

"222222"

Venta.
Reimpresión.
Cancelación.

folioNumber

Número identificador de transacción que puede ser enviado en la solicitud de venta.

String

"Prueba1"

spanRoute

Últimos 4 dígitos de la tarjeta.

String

"1234"

Venta.

orderId

Identificador de número de transacción. Puede ser utilizado posteriormente en reimpresión y cancelación.

String

"200917102306-0820649118"

Venta.
Reimpresión.
Cancelación.

folioNumber

Número identificador de transacción que puede ser enviado en la solicitud de venta.

String

Actualmente no se envía en la respuesta de regreso

Venta.

bin

Bin de la tarjeta 6 primeros dígitos de la tarjeta.

String

"376664"

Venta.

amount

Monto total de la transacción con todo y propina.

String

"109.0"

Venta.

cardTypeName

Representa el nombre del tipo de marca de la tarjeta, Visa, Master Card, etc.

String

Dependiendo la tarjeta ingresada:

  1. "AMEX"
  2. VISA
  3. MASTERCARD

Venta.

affiliation

Número de afiliación del comercio.

String

"9352287370"

Venta

transDate

Fecha y hora de la transacción.

String

"SEP,17,20 15:10:06"

Venta.

cardType

Identificador de tipo de tarjeta. Débito (D), Crédito (C).

String

"C"

Venta.
Reimpresión.
Cancelación.

isRePrint

Valor que indica si la transacción es Reimpresión "true" y si es Cancelación o Venta es "false"

Boolean

Venta y cancelación: "false"

Reimpresión: "true"

Venta.
Reimpresión.
Cancelación.

transType

Indica el tipo de operación realizada. Venta (A), Cancelación (V).

String

Venta: "A"
Reimpresión: "A"
Cancelación: "V"

Venta.
Reimpresión.
Cancelación.

reprintModule

Identificador interno.

String

"C"

Venta.
Reimpresión.
Cancelación.

13. Otras respuestas

{
    "bin": "",
    "folioNumber": "",
    "isRePrint": false,
    "message": "TRANSACCION RECHAZADA",
    "success": false
}
{
    "bin": "",
    "folioNumber": "",
    "isRePrint": false,
    "message": "Error de conexión",
    "success": false
}
{
    "bin": "",
    "folioNumber": "",
    "isRePrint": false,
    "message": "Cancelado por el Usuario",
    "success": false
}
{
    "bin": "",
    "folioNumber": "",
    "isRePrint": false,
    "message": "PROMOCION NO VALIDA PARA EL TIPO DE TARJETA",
    "success": false
}

Que sigue...

El siguiente paso es continuar en el apartado de Certificación en el cual se detalla las pruebas a realizar para validar el correcto funcionamiento de la integración.

Did this page help you?