Card Present (NFC Contactless) Transactions

A Card Present (CP) NFC contactless transaction lets you process payments by reading encrypted card data transmitted wirelessly from the cardholder's card or mobile wallet. The cardholder taps their NFC-enabled card, smartphone, or wearable device against a compatible contactless reader at the point of sale.

Unlike EMV chip transactions that require card insertion, NFC contactless transactions complete without physical contact — offering the fastest checkout experience at the point of sale. The payment data structure is identical to EMV chip, with the only difference being the card capture method: tap instead of insert.

Common use cases include:

  • Customer-Facing Retail: High-volume POS environments where speed and contactless experience reduce queue times.
  • Mobile Wallet Payments: A customer pays using Apple Pay, Google Pay, or Samsung Pay by tapping their device against the NFC reader.
  • Fallback from Chip: NFC tap is preferred but the cardholder's card does not support contactless — the transaction falls back to EMV chip insertion.

How it Works

NFC contactless CP transactions require you to set cardPresent to true and populate the posData object with contactless-specific values. Two configurations are supported depending on whether you intend to capture the payment immediately or at a later time.

NFC Authorization (Preauthorization)

Use this configuration when performing an authorization-only transaction that will be captured later. Set authorizationIndicator to "Undefined" and transactionStatus to "Preauthorization".

{
  "cardPresent": true,
  "authorizationIndicator": "Undefined",
  "posData": {
    "cardholderPresence": "Present",
    "deviceAttendance": "Attended",
    "deviceInputCapability": "ChipSwipe",
    "deviceLocation": "OnPremise",
    "panCaptureMethod": "ContactlessChip",
    "partialApprovalSupport": "Supported",
    "transactionStatus": "Preauthorization"
  }
}

NFC Sale

Use this configuration when the transaction is intended to be finalized immediately. Set authorizationIndicator to "Final" and transactionStatus to "Normal".

{
  "cardPresent": true,
  "authorizationIndicator": "Final",
  "posData": {
    "cardholderPresence": "Present",
    "deviceAttendance": "Attended",
    "deviceInputCapability": "ChipSwipe",
    "deviceLocation": "OnPremise",
    "panCaptureMethod": "ContactlessChip",
    "partialApprovalSupport": "Supported",
    "transactionStatus": "Normal"
  }
}

Understanding Partial Approvals

The partialApprovalSupport field determines whether the issuing bank can approve a portion of the requested amount when the card has insufficient funds for the full transaction.

ValueDescriptionWhen to use
SupportedThe issuer can approve a partial amount. Your application collects the remaining balance using another payment method.Use when your application supports split-tender payments.
NotSupportedThe transaction is declined if insufficient funds are available. No partial approval is returned.Use when your application does not support multiple payment methods for a single transaction.

Example: Purchase amount is $100. Available funds on the card are $60. The issuer approves $60, and the merchant collects the remaining $40 using another payment method.


Best Practices

PracticeDescription
Prefer NFC contactless over swipe when availableNFC contactless carries the same low fraud risk and interchange rate as EMV chip. Always prefer tap or chip over magnetic stripe when the card and hardware support it.
Set panCaptureMethod to "ContactlessChip"Passing an incorrect capture method will result in interchange downgrade or network decline.
Set deviceInputCapability to "ChipSwipe"This declares that the device supports both chip and swipe entry alongside contactless, required for correct interchange classification on NFC transactions.
Accurately reflect the transaction environment in posDataEach posData field must match the actual transaction context. Incorrect values cause interchange downgrades or network declines.
Handle partial approvals explicitlyIf your application supports split-tender payments, set partialApprovalSupport to "Supported" and handle partial approval responses in your integration logic.


.readme-logo { display: none !important; }