Diller Tap2ID — POS Integration Guide

Redigert

Audience: External POS developers integrating Diller loyalty via payment terminals

Last Updated: February 2026

Introduction

Tap2ID allows loyalty members to identify themselves at the point of sale by simply tapping their payment card on the terminal — no phone number, no app, no barcode needed. The POS reads the card, matches it to a Diller loyalty member, fetches their coupons and benefits, applies discounts to the basket, and then charges the final amount — all in a seamless checkout experience.

This guide covers how to integrate Tap2ID into your POS system using two terminal families:

Nets (Ingenico/Baxi) — Uses BAXI.NET SDK with SendJson and DAM/Storebox for card identification

Verifone P630 — Uses PaymentSdk (PSDK) with Card Acquisition and tokenization

Both follow the same high-level flow but use different SDK calls to obtain the card identifier.

How Tap2ID Works

The checkout flow with Tap2ID follows these four key steps:

Step 1: Card Read (no charge)

The terminal reads the card and returns a token/member identifier without charging the card. For Nets, the terminal sends a SendJson request with GetAsset action 193. For Verifone, Card Acquisition with tokenRequest: true is used.

Step 2: Diller Lookup

The POS sends the identifier to the Diller API to retrieve member details and available coupons.

Step 3: Apply Benefits

The POS applies the member's available coupons and discounts to the basket, then calculates the final amount. For example, 349 NOK might be reduced to 299 NOK after discount.

Step 4: Payment (card charged)

The terminal processes a normal payment transaction for the discounted total. The customer taps or inserts their card again and may enter a PIN.

Note: The member must have pre-registered their card in the loyalty system. If the card is not recognized, the POS can fall back to phone number lookup and then register the card for future Tap2ID use.

Tap2ID with Nets (Baxi.NET)

Prerequisites

BAXI.NET SDK (baxi_dotnet.dll v1.14.1 or later) — available from NexiGroup

Terminal with Storebox/DAM support enabled (contact Nets/NexiGroup)

PreventLoyaltyFromPurchase property set to 0 on the BaxiCtrl instance

UseExtendedLocalMode property set to 1

Diller API credentials (client_id, client_secret, store_id)

Step 1: Read Card & Identify Member (SendJson)

At the start of checkout, send a SendJson call to the terminal with a GetAsset (action 193) request. This prompts the customer to tap their card. The terminal reads the card and queries Storebox for a linked member ID — without charging the card.

SendJson Request Example

The JSON payload should include the following structure with the GetAsset action and Storebox template:

Key Fields:

• type: 101 — Asset query message type

• action: 193 — GetAsset (read card and fetch linked data)

• mode: 4 — Transaction + asset lookup mode

• amount — The basket total in øre (cents). 349.00 NOK = "34900"

• txntype: "30" — Indicates a purchase context

• requestid — A unique request identifier (e.g., timestamp + random)

• template.name: "storebox" — Target the Storebox DAM system

• cardref: "<cardref.001>" — Literal placeholder (terminal replaces with actual card reference after tap)

Important: The <cardref.001> value must be sent as a literal string including the angle brackets. Ensure your JSON serializer does not escape the < and > characters.

In code, calling SendJson:

var args = new SendJsonEventArgs { JsonString = jsonPayload };

_baxi.SendJson(args);

Response: The terminal fires the OnLocalMode event when the customer taps their card. The response contains the DAM data including the member identifier in the attributes payload.

Step 3: Apply Discounts & Process Payment

After applying discounts and calculating the final amount, perform a standard TransferAmount call to charge the card:

Example TransferAmount Call:

var args = new TransferAmountEventArgs {

OperID = "0000",

Type1 = 0x30, // Purchase

Amount1 = 29900, // 299 NOK in øre (cents) — the discounted total

Type2 = 0x30,

Amount2 = 0,

Type3 = 0x30,

Amount3 = 0,

HostData = "",

ArticleDetails = "",

PaymentConditionCode = "",

AuthCode = ""

};

_baxi.TransferAmount(args);

// Wait for OnLocalMode event — customer taps/inserts card and enters PIN

Key Parameters:

• Type1 = 0x30 — Purchase transaction (0x31 for refund)

• Amount1 — Amount in øre (cents). 299.00 NOK = 29900

The OnLocalMode event fires when the transaction completes, providing the result, truncated PAN, auth code, timestamp, and terminal ID. After successful payment, sync the transaction to Diller using the Create Transaction endpoint (see Diller API Reference section).

Registering a New Card (InsertAsset)

If the Storebox lookup returns no member data (card not registered), you can ask the customer for their phone number, search Diller by phone, and if found, link the card to the member using InsertAsset (action 191).

The InsertAsset request has the same JSON structure as GetAsset but uses action 191. Key fields include:

• action: 191 — InsertAsset (associate card with member)

• msisdn — Member's phone number with country code (e.g., "4712345678" for Norway)

• memberno — Diller member ID (from the phone search result)

• cardref: "<cardref.001>" — Terminal replaces with the tapped card's reference

The terminal prompts the customer to tap their card. On success, the card → member link is stored in Storebox, and future taps will return the member ID automatically. Check statustext === "OK" to confirm the card was registered successfully.

Step 1: Card Acquisition & Tokenization

The PaymentSdk must be initialized and a session must be active before performing card acquisition. The initialization sequence is:

  1. Initialize SDK → PaymentSdk.InitializeFromValues(listener, params)

  2. 2. Login → TransactionManager.LoginWithCredentials(credentials)

  3. 3. Start Session → TransactionManager.StartSession(transaction)

  4. 4. Card Acquisition → TransactionManager.RequestCardData2(request)

Example Card Acquisition Call:

var request = CardAcquisitionRequest.Create(

tokenRequest: true, // IMPORTANT: Request tokenization

message: "Please tap card", // Terminal display message

presentationMethods: new[] {

CardPresentationMethod.CTLS_CARD, // Contactless

CardPresentationMethod.CHIP, // Chip insert

CardPresentationMethod.MAG_STRIPE // Swipe (fallback)

}

);

_transactionManager.RequestCardData2(request);

// Wait for CardInformationReceivedEvent callback (up to 60 seconds)

Critical: tokenRequest: true is essential — it tells the Verifone system to generate tokens for the card. Without this, you will not get the identifier needed for Diller. Tokenization must also be enabled on the backend/terminal configuration through Verifone support.

Extracting Card Data & Tokens

When the customer taps their card, the SDK fires the HandleCardInformationReceivedEvent callback. Extract the card data as follows:

public override void HandleCardInformationReceivedEvent(CardInformationReceivedEvent evt) {

var cardInfo = evt.CardInformation;

// Card details

string brand = cardInfo.PaymentBrand; // "VISA", "MASTERCARD", etc.

string panLast4 = cardInfo.PanLast4; // "1234"

string expiry = cardInfo.CardExpiry; // "2612" (YYMM)

// Tokens — this is what you send to Diller

var tokens = cardInfo.Tokens; // Array of token objects

foreach (var token in tokens) {

string type = token.TokenType; // "ANALYTICS", "REUSE", etc.

string value = token.Value; // The token string

string scheme = token.Scheme; // "VISA", etc.

}

// PanHandle — alternative identifier

string panHandle = cardInfo.PanHandle;

}

Token Types:

• ANALYTICS — Persistent card identifier generated by Verifone backend (preferred for Diller)

• REUSE — Token for reusing the card in subsequent transactions (fallback if ANALYTICS not available)

Use the ANALYTICS token (or REUSE as fallback) as the card identifier for Diller member lookup.

Step 2: Query Diller for Member Details & Coupons

With the ANALYTICS token from card acquisition, query the Diller API to look up the member and retrieve available coupons. Display the coupons to the cashier and apply selected discounts to the basket before proceeding to payment.

Step 3: Process Payment

After discounts are applied, process payment using the standard PaymentSdk flow. Create a Payment object with the final discounted amount and currency code. The currency should be passed as ISO 4217 numeric code (e.g., 578 for NOK, 752 for SEK, 978 for EUR).

Then call StartPayment with the payment object. The customer will be prompted to tap or insert their card again and may need to enter a PIN. Wait for the PaymentCompletedEvent callback (up to 90 seconds) for the result.

After successful payment, sync the transaction to Diller using the Create Transaction API endpoint (see Diller API Reference section below).

Verifone Card Registration

If the Diller API returns no member for the ANALYTICS token (card not registered), you can ask the customer for their phone number, search Diller by phone, and if a member is found, register the card token to that member.

Send a POST request to register the card. The request body should include the ANALYTICS token, card brand (uppercase), and expiry date in YY-MM format.

POST https://api.dillerapp.com/api/v2.0/stores/{storeId}/members/{memberId}/register-card
Authorization: Bearer {access_token}
Content-Type: application/json

{
"identifier": "tok_analytics_xxxx...",

Identify Member by Card Token
"brand": "VISA",
"expiry_date": "26-12"
}

Key fields for registration:
• identifier — The ANALYTICS token value from card acquisition
• brand — Normalized card brand in uppercase: VISA, MASTERCARD, AMERICAN EXPRESS
• expiry_date — Expiry in YY-MM format (e.g., "26-12" for December 2026)

Note: Terminal expiry formats vary (YYMM, MMYY, YY/MM). Normalize to YY-MM before sending to Diller.

After registration, future Tap2ID lookups with this token will return the member instantly.

POST https://api.dillerapp.com/conn

Var denne artikkelen nyttig?

Beklager det! Vil du fortelle oss mer?

Takk for tilbakemeldingen!

Det oppstod et problem med innsendingen av tilbakemeldingen din
Vennligst sjekk tilkoblingen din og prøv igjen.