Utilizar SDK

1. Implementa las interfaces.

Crea un activity que implemente las interfaces: ITransactionListener, IReportsListener y sus métodos correspondientes.

Implementación:

class KotlinActivity : AppCompatActivity(), ITransactionListener, IReportsListener {
  ...
}

2. Establece las variables necesarias.

Antes de poder hacer uso de las funciones, es necesario declarar e inicializar algunas variables.

Declaración de variables globales:

private val connectReader: IConnectReader by lazy { ConnectReaderDevice(this) }
private lateinit var transaction: INpTransactions
private lateinit var reports: INpReports
private lateinit var miniPreferences: IMiniPreferences

Asígnales un valor en el método onCreate().

Implementación:

transaction = NpTransactions(this, connectReader, this)
reports = NpReports(this, this)
miniPreferences = MiniPreferences(this)

3. Inicia sesión.

Para iniciar sesión asigna un usuario, contraseña y ambiente de trabajo dentro del método onCreate().

Implementación:

miniPreferences.setInitializeSDK(userNameDefault, password, ConfigSdk.PRODUCTION)

Campo

Tipo

Descripción

userNameDefault

String

Usuario de NetPay.

password

String

Contraseña.

ConfigSdk

String

Ambiente de trabajo (Sandbox, Production).

4. Conecta el dispositivo.

Inicializa la variable connectReader en el método onCreate().

Implementación:

connectReader.initialize { result ->
 when (result) {
   is ConnectDiscoveryState.Started -> {
     Toast.makeText(this, "find device started", Toast.LENGTH_SHORT).show()
   }
   is ConnectDiscoveryState.Found -> {
     val device = result.deviceConnected
     connectAndCancelFindingDevice(result.deviceConnected.deviceName, result.deviceConnected.deviceAddress)

     startTransactionAction.apply{
       text = "Iniciar Transacción: ${device.deviceName}"
     }
     enableButton(startTransactionAction)

     Toast.makeText(this, "Device found: ${device.deviceName}", Toast.LENGTH_SHORT).show()
   }
   is ConnectDiscoveryState.Finished ->  {
     Toast.makeText(this, "finish finding device", Toast.LENGTH_SHORT).show()
   }
 }
}

Registra el dispositivo en el método onStart():

Implementación:

override fun onStart() {
    super.onStart()
    connectReader.registerReceiver()
}

Agrega la función startConnectReaderDevice() e invócala dentro del método onRequestPermissionsResult().

Implementación:

private fun startConnectReaderDevice() {
    connectReader.findAdapterDevices { result ->
      if (!connectReader.adapterIsEnabled()) {
        startActivityForResult(connectReader.adapterEnableRequestIntent(), ENABLE_BT_REQUEST_CODE)
      }
      Log.i("FIND ADAPTER MSG", result.message)
    }
  }

Los dispositivos se mostrarán en el mensaje de respuesta de la inicialización de la variable connectReader.

Agrega el método connectAndCancelFindingDevice().

Implementación:

private fun connectAndCancelFindingDevice(deviceName: String, deviceAddress: String) {
    connectReader.registerDevice(deviceName, deviceAddress)
}

Ejecuta el método connectAndCancelFindingDevice() después de seleccionar un dispositivo.

Campo

Tipo

Descripción

deviceName

String

Nombre de tu lector Mini.

deviceAddress

String

MacAddres del lector Mini.

5. Genera una transacción

Inicializa la transacción con sus respectivos valores:

Implementación:

transaction.initialize(
  config = ConfigSdk.PRODUCTION,
  userName = userNameDefault,
  password = //contraseña,
  requireSignature = false
)

Campo

Tipo

Descripción

config

String

Indica a qué ambiente de trabajo apuntar. Las opciones son PRODUCTION (ambiente productivo) y SANDBOX (ambiente de pruebas).

userName

String

Usuario.

password

String

Contraseña.

requireSignature

Bool

Indica si el SDK habilitará la firma digital durante la transacción. Si este campo está se establece en false el voucher de la venta no tendrá una firma.

Posteriormente, se debe implementar el método callback valuesToProcessing(...).

Implementación:

override fun valuesToProcessing(values: (total: Double, tip: Double, reference: String, promotion: String) -> Unit) {
    val total = editTransValue.text.toString()

    val referenceText = editTextReference.text.toString()
    val referenceEncoded = encodeString(referenceText)

    val promotionIndex = spinnerPromotion.selectedItemPosition
    val promotionSelected = PromotionEnum.values().get(promotionIndex)

    values(total.toDouble(), 0.0, referenceEncoded, promotionSelected.value)
  }

Campo

Tipo

Descripción

reference

String

Este campo debe contener una referencia de la venta. This field must contain the Sale reference value.

total

Double

Monto total de la venta con la propina incluída.

promotion

String

Este campo indica si la venta tiene una promoción. Las opciones son: sin promoción, 3 meses, 6 meses, 9 meses, 12 meses y 18 meses (Ver valores en PromotionEnum).

tip

Double

Monto de la propina.

Algunas tarjetas pueden tener múltiples aplicaciones (Débito / Crédito), para estos casos se debe seleccionar en la opción en el método selectedAppAction().

6. Obtén la respuesta de una transacción

El resultado de la transacción se recibirá en el método callback transactionsResult().

Implementación:

override fun transactionsResult(message: String, processed: Boolean) {
  runOnUiThread {
    if (processed) {
      Log.d(TAG, "transactionsResult message: $message")
        transactionId = message.split(":")[1]
        orderId = message.split(":")[2]
      }
  }
}

Campo

Tipo

Descripción

message

String

En este campo se recibirán los valores transactionId y orderdId en caso de que la transacción fue exitosa.

processed

Bool

Indica si la transacción fue exitosa.

En caso de que una transacción no reciba una respuesta por parte del servidor se ejecutará un reverso automático de la misma y el resultado se mostrará en el método callback reverseResult(). El reverso cancelará la venta en caso de que esta sí se haya aprobado.

Implementación:

override fun reverseResult(message: String, processed: Boolean) {
  runOnUiThread {
    Toast.makeText(this, "reverse: $message", Toast.LENGTH_SHORT).show()
    }
}

7. Cancela una venta

Para cancelar una venta es necesario contar previamente con el transactionId de la venta a cancelar.

Implementación:

transaction.processRefund(
  transactionId = transactionId
)

Campo

Tipo

Descripción

transactionId

String

Identificador de la transacción, este se obtiene en la respuesta de una transacción ó en la consulta de una venta.

8. Obtén la respuesta de una venta cancelada

La respuesta para una venta cancelada se recibe en el método refundResult().

Implementación:

override fun refundResult(message: String, processed: Boolean) {
  runOnUiThread {
    if (processed) {
      // Se completó la cancelación
    }
  }
}

9. Consulta un reporte de ventas

Para consultar la ventas realizadas hay que proporcionar un rango de fechas.

Implementación:

reports.getReportSalesByDateAndUser(
  startDate = "2020-10-18",
  endDate = "2020-10-20,
  userId = null
)

Campo

Tipo

Descripción

startDate

String

Día de inicio del reporte que se quiere consultar. El formato debe ser yyyy-MM-dd.

endDate

String (Opcional)

Último día del reporte que se quiere consultar. El formato debe ser YYYY-MM-DD. Este campo puede tener el valor null en caso que la consulta sea únicamente de un día.

userId

String (Opcional)

Identificador del usuario que realizó la transacción. En caso de tener el valor null el servicio regresará la venta de todos los usuarios que contiene el comercio.

10. Obtén la respuesta de un reporte de ventas

La respuesta de este servicio regresa un arreglo con toda la información de las ventas realizadas dentro del rango de fechas. La respuesta se recibe en el método reportSalesByDateAndUserResult():

Implementación:

override fun reportSalesByDateAndUserResult(processed: Boolean, message: String?, reportSales: Response?) {
    Log.i(TAG, "reportSalesByDateAndUserResult")
    reportSales?.let {
      Log.i(TAG, "reportSales.report?.valueList?.value?.size: ${reportSales.report?.valueList?.value?.size}")
      tvResponse.text = reportSales.report?.valueList.toString()
      //Gson
      //val sales = fromJson(reportSales.report?.valueList, SalesResponseValue::class.java).value
    }
    message?.let {
      Log.i(TAG, "message: $message")
    }
  }

Ejemplo del JSON de respuesta:

{
  "contentType": "Report",
  "resourceName": "ReportSalesByDateAndUser",
  "report": {
    "valueList": {
      "value": [
        {
          "orderId": "5227220201019144140737",
          "transactionId": "1511f0ba-284d-460f-9e33-e66507a96106",
          "cardNumber": "9898",
          "userId": "36142",
          "transTypeCd": "A",
          "transStatus": "C",
          "transDate": "2020-10-19T14:41:41-0500",
          "authCode": "222222",
          "amount": "2.00",
          "responseCode": "00",
          "responseMsg": "Aprobada",
          "authDate": "2020-10-19T14:41:41-0500",
          "userName": "[email protected]",
          "ticketID": "",
          "voucherID": "",
          "tipAmount": 0.0,
          "latitude": 25.654299,
          "longitude": -100.215834,
          "web": false
        }
      ]
    }
  },
  "response": {
    "approved": true,
    "responseCode": "00",
    "responseMsg": "Aprobada",
    "timeIn": "1603301717167",
    "timeOut": "1603301717628",
    "type": "JSON"
  }
}

Campo

Descripción

Tipo

Ejemplo

orderId

Identificador de la orden, lo genera la aplicación por cada transacción.

String

"5227220201019134607260"

transactionId

Identificador de la transacción, lo genera el Sistema por cada transacción.

String

"e4a7844f-95e6-4cc8-ad6d-93960b1f9e7e"

cardNumber

Últimos 4 dígitos de la tarjeta que realizó la transacción.

String

"9898"

userId

Identificador del usuario que realizó la transacción.

String

"36142"

transTypeCd

Indica el tipo de transacción que se realizó.

String

"A" - Tarjeta
"P" - Efectivo

transStatus

Estatus de la transacción.

String

"C" - Aprobada
"D" - Rechazada
"V" - Cancelada
"RV" - Reversada

transDate

Fecha en que se recibió la transacción

String

"2020-10-19T13:46:07-0500"

authCode

Código de autorización de la transacción.

String

"222222"

amount

Monto de la transacción.

String

"200.00"

responseCode

Respuesta de la transacción

String

"00" - Aprobada
"05" - Rechazada

responseMsg

Mensaje de respuesta de la transacción.

String

"Aprobada"

authDate

Fecha en que se procesó la transacción.

String

"2020-10-19T13:46:08-0500"

userName

Usuario que realizó la transacción

String

"[email protected]"

tipAmount

Monto de la propina incluida en la transacción.

Double

10.0

latitude

Latitud de donde se realizó la transacción.

Double

25.6714

longitude

Longitud de donde se realizó la transacción.

Double

-100.309 25

11. Consulta el detalle de una venta

El detalle de venta sirve para obtener más información de la venta y es necesario contar con un transactionId.

Implementación:

reports.getReportSalesDetail(
  transactionID
)

Campo

TIpo

Descripción

transactionId

String

Identificador de la transacción, este se obtiene en la respuesta de una transacción ó en la consulta de una venta.

12. Obtén la respuesta del detalle de una venta

La respuesta se recibe en el método reportSalesByDateAndUserResult().

Implementación:

override fun reportSaleDetailsResult(response: Response?, success: Boolean) {
    runOnUiThread {
      // Respuesta en objeto response
      }
}

Ejemplo del JSON de respuesta:

{
  "contentType": "Report",
  "resourceName": "ReportSalesDetail",
  "order": {
    "orderId": "5227220201019174732079",
    "transaction": {
      "type": "A",
      "authCode": "222222",
      "transactionId": "c4f9b0d8-8867-4186-827e-ddecbb0074b0",
      "merchantId": "7489228",
      "total": {
        "total": 2.58,
        "tip": 0.0
      },
      "authDate": "2020-10-19T17:47:33-0500",
      "transStatus": "C",
      "bankName": "SANTANDER",
      "cardTypeName": "MASTERCARD",
      "cardNature": "D",
      "arqc": "3F33B0E72B90BAC5",
      "aid": "A0000000041010",
      "spanRoute": "8710",
      "web": false
    },
    "cashierId": 36142,
    "cashierName": "Farmacias Test ",
    "products": [
      {
        "id": 0,
        "amount": 1.0,
        "price": 2.58,
        "description": "Cobro directo",
        "lastUpdateTimestamp": 1559326021000
      }
    ]
  },
  "report": {},
  "response": {
    "approved": true,
    "responseCode": "00",
    "responseMsg": "Aprobada",
    "timeIn": "1603300499469",
    "timeOut": "1603300509133",
    "type": "JSON"
  }
}

Campo

Descripción

Tipo

Ejemplo

merchantId

Identificador de la afiliación.

String

"7489228"

bankName

Nombre del banco de la tarjeta.

String

"SANTANDER"

cardTypeName

Marca de la tarjeta.

String

"MASTERCARD"

cardNature

Naturaleza de la tarjeta.

String

"D" - Débito
"C" - Crédito

arqc

ARQC

string

"3F33B0E72B90BAC5"

aid

Application Id.

String

"A0000000041010"

13. Consulta el voucher de una venta

Para consultar el voucher de una venta es necesario contar con el orderId.

Implementación:

transaction.getImageVoucher(
  orderId = orderId
)

Campo

Tipo

Descripción

orderId

String

Identificador de la transacción, se obtiene en la respuesta de una transacción ó en la consulta de una venta.

14. Obtén respuesta del voucher de una venta

La respuesta se recibe en el método imageResult().

Implementación:

override fun imageResult(processed: Boolean, image: String?, message: String?) {
  runOnUiThread {
    if(processed){
      image?.let {
          image_voucher.setImageBitmap(base64ToBitmap(image))
        }
    } else {
      Toast.makeText(this, "processed: $processed message: ${message ?: "null"}", Toast.LENGTH_SHORT).show()
      }
  }
}

En el objeto image se recibe un String con el valor en b64 de la imagen.


Did this page help you?