Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

It is important calling the function ola_contacless_clean() once the Transaction is completed.

Exemple

Below an exemple of how to perform a transaction with an external EntryPoint :

Code Block
languagekotlin
private fun performTransaction() {

    //Mock data of the SelectPPSE and FinalSelect from the external EP
    val selectPPSE = byteArrayOf(0x00, 0xA4.toByte(), 0x04, 0x00, 0x0e, 0x32, 0x50, 0x41, 0x59, 0x2e, 0x53, 0x59, 0x53, 0x2e, 0x44, 0x44, 0x46, 0x30, 0x31, 0x00)
    val selectFinal = byteArrayOf(0x00, 0xA4.toByte(), 0x04, 0x00, 0x07, 0xA0.toByte(), 0x00, 0x00, 0x00, 0x03, 0x10, 0x10, 0x00)

    // Beginning of transaction (card detection, SELECT PPSE, SELECT FINAL)
    if (detectCard(60) != 2) {

        Log.e("MainActivity", "performTransaction - error while detecting card")
        return
    }

    if (sendApdu(selectPPSE) == null) {

        Log.e("MainActivity", "performTransaction - error while sending SELECT PPSE")
        return
    }

    val fci = sendApdu(selectFinal)
    if (fci == null ){

        Log.e("MainActivity", "performTransaction - error while sending SELECT FINAL")
        return
    }

    // Step 1 - Clean SDK context
    //agnos.olaContactlessPreprocess()
    agnos.olaContactlessFlushAIDSupported()

    // Step 2 - Set Transaction Related Data
    val now = LocalDateTime.now()
    agnos.olaEmvSetTag(OlaTag.TRANSACTION_DATE, Utils.bcdDate(now))
    agnos.olaEmvSetTag(OlaTag.TRANSACTION_TIME, Utils.bcdTime(now))

    val ccy = Currency.getInstance(Locale.getDefault())
    agnos.olaEmvSetTag(OlaTag.AMOUNT_AUTHORISED, Utils.bcdAmount(100)) // 1.00$
    agnos.olaEmvSetTag(OlaTag.TRANSACTION_CURRENCY_CODE, Utils.ccyCode(ccy))
    agnos.olaEmvSetTag(OlaTag.TRANSACTION_CURRENCY_EXPONENT, Utils.ccyExponent(ccy))

    agnos.olaEmvSetTag(OlaTag.TRANSACTION_TYPE, byteArrayOf(0x00))
    agnos.olaEmvSetTag(OlaTag.TRANSACTION_CATEGORY_CODE, byteArrayOf(0x11))

    // Step 3 - Pass FCI to SDK context
    agnos.olaEmvSetTag(fci[0].toInt(), fci.copyOfRange(2, fci.size - 2))

    // Step 4 - Set kernel ID (only using Visa with this example)
    agnos.olaEmvSetTag(0x9F2A, byteArrayOf(0x03))

    // Step 5 - Set AID data
    agnos.olaContactlessAddAIDSupported(ConfigData.products[4].AID(),
        ConfigData.products[4].partial,
        ConfigData.products[4].kernel.kernelId,
        ConfigData.products[4].kernel.config())

    var tcc = Holders.SingleObjectHolder<ByteArray>()
    val err = agnos.olaEmvGetTag(OlaTag.TRANSACTION_CURRENCY_CODE, tcc)

    // Step 6 - Perform reste of transaction
    agnos.olaContactlessDoTransaction()

    var tcc2 = Holders.SingleObjectHolder<ByteArray>()
    val err2 = agnos.olaEmvGetTag(OlaTag.TRANSACTION_CURRENCY_CODE, tcc2)

    // Step 7 - Get results
    var outcome = Holders.SingleObjectHolder<OlaOutcomeParameter>()
    agnos.olaContactlessGetOutcome(outcome)

    var tcc3 = Holders.SingleObjectHolder<ByteArray>()
    val err3 = agnos.olaEmvGetTag(OlaTag.TRANSACTION_CURRENCY_CODE, tcc3)
    Log.v("MainActivity", "performTransaction - result for getTag(): $err3 => " +
            Utils.bytesToHex(tcc3.get()))

    Log.v("MainActivity", "performTransaction - transaction complete")
}