CVM Limit
Overview
In EMV the amount from which cardholder verification is required can be configured on the readers, this is the “CVM Limit” configuration. Furthermore, this limit can be configured independently for contact or contactless transactions. Please note that if this is set to reader, then this configuration remains fixed for that reader after usage, this means that if cvm limit is updated on reader “A” then this limit will remain set unless is changed again.
In the case of contactless transactions the CVM limit comparison should be interpreted as “greater than” relationship, i.e with a CVM limit of $100.00 the CMV(like PIN or signature) will be requiere in transaction from $100.01 and up. If you are using currencies with no cents, the same applies: CVM $100 implies the CVM will be required from $101, instead for contact transactions the CVM limit comparison should be interpreted as “greater than or equal to” relationship.
Implementation
Please see the following example of how to set the CVM Limit of 10 Argentine pesos in each platform, use DeviceConfigurator to create a decorator of the scanned device you wish to connect to. Once you get the “configurableDevice” then it should be provided to the TransactionIntent on the “provideDevice” step:
- iOS
- Android
- React Native
The CVM limit configurations are set in the device used in the transaction, the class DeviceConfigurationBuilder provide methods for set the CVMs , the class DeviceConfigurator provide the method deviceWithConfiguration that return a configured device , this new device must be provide when TransactionIntentDelegate.onDeviceRequired is called.
let device = ... //obtain with reader scanner
let cvmLimit = try! Money(amount: 10, currency: .ars)
let deviceConfiguration = DeviceConfigurationBuilder()
.setContactCvmLimit(cvmLimit)
.setContactlessCvmLimit(cvmLimit).build()
let configurableDevice = try? DeviceConfigurator.deviceWithConfiguration(device: device, deviceConfiguration: deviceConfiguration)
val device = selectedDevice!!
val cvmLimit = SDKMoney(BigDecimal.TEN, SDKCurrency.ars())
val deviceConfiguration = SDKDeviceConfiguration.Builder().apply {
contactCvmLimit(cvmLimit)
contactlessCvmLimit(cvmLimit)
}.build()
val configurableDevice = SDKDeviceConfigurator.deviceWithConfiguration(device, deviceConfiguration)
const { foundReaders } = useReaderScanner(3000)
const reader = foundReader[0] // select any reader
const cvmLimit = { amount: 100, currency: Currencies.ARS }
const readerId = new ReaderIdWithConfiguration(reader.id, {
'contactCvmLimit': cvmLimit,
'contactlessCvmLimit': cvmLimit,
})
// then transaction.provideDevice(readerId)