Table of Contents
Overview
This article covers EMV Card Present Direct Connect SCA indicators and how to proceed in instances a transaction is flagged for SCA.
What Are SCA Indicators?
Card issuers in the European Union and European Economic Area (EU/EEA) will soon be required to comply with updated PSD2, Strong Customer Authentication (SCA) regulatory requirements. For contactless transactions, this requires two-factor authentication when 150 Euros or 5 consecutive contactless transactions have been completed since the card was last authenticated. A decline under these conditions is known as a soft decline and should be re-attempted.
Depending on the card scheme, the issuer may request the card be further authenticated by re-submitting the transaction with Online PIN and/or as a Contact transaction and is flagged to the integration via an SCA indicator.
SCA Indicators
Fall Forward
The transaction will be declined with a FallForwardToContact indicator in the response object with a value of true (boolean). This can be returned in the response object during a contactless authentication. The integration should restart the transaction with only the EMV contact interface enabled, and include the original platform transaction reference in a TransactionLinks block with a type of FallForwardToContactInitiator.
Online PIN Required
The transaction will be declined with a OnlinePinRequired indicator in the response object with a value of true (boolean). This can be returned in the response object during a contactless authentication. The integration should prompt for PIN entry and re-submit the authentication with the PIN block present, and include the original platform transaction reference in a TransactionLinks block with a type of OnlinePinRequiredInitiator.
SCA Flow
Mastercard
// Determine Online PIN support from mChipCvmCapability (DF8118) in terminal configuration
// Check if Online PIN is required and supported
if (OnlinePINRequired == true && OnlinePINSupported == true) {
// Prompt for Online PIN and resend the original authorization request with Online PIN data
// Store the Online PIN data as part of ExtendedProperties
// Include the original platform transaction reference in a TransactionLinks block with type OnlinePinRequiredInitiator
} else if (OnlinePINRequired == true && OnlinePINSupported == false) {
// Restart the transaction with contactless interface disabled
}
// Check if Fallforward to Contact is true
if (FallforwardToContact == true) {
// Restart the transaction with contactless interface disabled
// Include the original platform transaction reference in a TransactionLinks block with type FallForwardToContactInitiator
}
Visa
// Determine Online PIN support from Terminal Transaction Qualifiers (tag 9F66, Byte 1, Bit 3)
// Determine Form Factor Indicator from tag 9F6E returned by the card
// Check if Online PIN is required and supported
if (OnlinePINRequired == true && OnlinePINSupported == true) {
// Prompt for Online PIN and resend the original authorization request with Online PIN data
// Store the Online PIN data as part of ExtendedProperties
// Include the original platform transaction reference in a TransactionLinks block with type OnlinePinRequiredInitiator
} else if (OnlinePINRequired == true && OnlinePINSupported == false) {
// Check if Form Factor Indicator is null or indicates a condition and if contact interface is supported
if ((FormFactorIndicator == null || FormFactorIndicator.Byte[0].Bits[4:0] == 0) && ContactInterfaceSupported == true) {
// Restart the transaction with contactless interface disabled
}
// Check specific bits in the second byte of the Form Factor Indicator
if (FormFactorIndicator.Byte[1].Bit[7] == 1 || FormFactorIndicator.Byte[1].Bit[1] == 1) {
// Restart the transaction with CVM (Cardholder Verification Method) Limit set to 0
} else {
// Decline the transaction
}
}
// Check if Fall Forward to Contact is true
if (FallForwardToContact == true) {
// Check if Form Factor Indicator is null or indicates a condition and if contact interface is supported
if ((FormFactorIndicator == null || FormFactorIndicator.Byte[0].Bits[4:0] == 0) && ContactInterfaceSupported == true) {
// Restart the transaction with contactless interface disabled
// Include the original platform transaction reference in a TransactionLinks block with type FallForwardToContactInitiator
}
// Check specific bits in the second byte of the Form Factor Indicator
if (FormFactorIndicator.Byte[1].Bit[7] == 1 || FormFactorIndicator.Byte[1].Bit[1] == 1) {
// Restart the transaction with CVM (Cardholder Verification Method) Limit set to 0
// Include the original platform transaction reference in a TransactionLinks block with type FallForwardToContactInitiator
} else {
// Decline the transaction
}
}
Amex
// Determine if Online PIN is required
if (OnlinePINRequired == true) {
// Determine ExpressPay kernel version by value of Enhanced Reader Capabilities (tag 9F6E, Byte 4, Bits 2 & 1)
if (ExpressPayKernelVersion = 4.0) {
// Prompt for Online PIN and resend the original authorization request with Online PIN data
// Store the Online PIN data as part of ExtendedProperties
// Include the original platform transaction reference in a TransactionLinks block with type OnlinePinRequiredInitiator
} else {
// Restart the transaction with contactless interface disabled
}
}
// Check if FallForward to Contact is true
if (FallForwardToContact == true) {
// Restart the transaction with contactless interface disabled
// Include the original platform transaction reference in a TransactionLinks block with type FallForwardToContactInitiator
}
Discover/Diners
// Determine if Online PIN is required
if (OnlinePINRequired == true) {
// Determine Online PIN support by value of Terminal Transaction Qualifiers (tag 9F66, Byte 1, Bit 3) in terminal configuration
if (OnlinePINSupported == true) {
// Prompt for Online PIN and resend the original authorization request with Online PIN data
// Store the Online PIN data as part of ExtendedProperties
// Include the original platform transaction reference in a TransactionLinks block with type OnlinePinRequiredInitiator
} else {
// Restart the transaction with contactless interface disabled
}
}
// Check if Fallforward to Contact is true
if (FallForwardToContact == true) {
// Restart the transaction with contactless interface disabled
// Include the original platform transaction reference in a TransactionLinks block with type FallForwardToContactInitiator
}