<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Abidi Ahmed</title>
    <description>The latest articles on Forem by Abidi Ahmed (@abidiahmed).</description>
    <link>https://forem.com/abidiahmed</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3485908%2F7f9569e7-71b0-4b26-98d6-93e3019bebfa.png</url>
      <title>Forem: Abidi Ahmed</title>
      <link>https://forem.com/abidiahmed</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/abidiahmed"/>
    <language>en</language>
    <item>
      <title>I Built a Flutter Package That Reads Credit Card Data via NFC — Here's How</title>
      <dc:creator>Abidi Ahmed</dc:creator>
      <pubDate>Fri, 06 Mar 2026 13:02:51 +0000</pubDate>
      <link>https://forem.com/abidiahmed/i-built-a-flutter-package-that-reads-credit-card-data-via-nfc-heres-how-6ol</link>
      <guid>https://forem.com/abidiahmed/i-built-a-flutter-package-that-reads-credit-card-data-via-nfc-heres-how-6ol</guid>
      <description>&lt;p&gt;&lt;em&gt;A deep dive into building &lt;code&gt;emv_nfc_reader&lt;/code&gt;, an open-source Flutter plugin that extracts card numbers, cardholder names, transaction history, and more from EMV chip cards using NFC.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Have you ever wondered what data lives inside your credit card's chip? Beyond the card number printed on the front, EMV chips store a wealth of information — transaction counters, security flags, bank identifiers, and even a history of your recent purchases.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;&lt;a href="https://pub.dev/packages/emv_nfc_reader" rel="noopener noreferrer"&gt;emv_nfc_reader&lt;/a&gt;&lt;/strong&gt; — an open-source Flutter plugin that lets you tap a physical credit card against your Android phone and extract all of this data in seconds. In this article, I'll walk you through &lt;strong&gt;what&lt;/strong&gt; the package does, &lt;strong&gt;how&lt;/strong&gt; it works under the hood, and &lt;strong&gt;how&lt;/strong&gt; you can integrate it into your own Flutter project.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faf9asufsvc9wsnng9vlc.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faf9asufsvc9wsnng9vlc.gif" alt="Hero demo showing a card being tapped and data appearing instantly&amp;lt;br&amp;gt;
" width="400" height="711"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🔍 What Can You Actually Extract?
&lt;/h2&gt;

&lt;p&gt;When you tap a card, &lt;code&gt;emv_nfc_reader&lt;/code&gt; returns a &lt;code&gt;Map&amp;lt;String, String&amp;gt;&lt;/code&gt; containing over &lt;strong&gt;20 data fields&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Fields&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Card Identity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PAN (Card Number), Expiry Date, PAN Sequence Number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cardholder Info&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cardholder Name, Language Preference, Country Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bank Details&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IBAN, BIC, Application Label&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security Counters&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Transaction Counter (ATC), PIN Tries Remaining, Last Online ATC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transaction History&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Date, Amount, Currency of recent transactions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Proprietary Data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Issuer Application Data (IAD), Form Factor Indicator, Card Transaction Qualifiers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: This library reads only publicly accessible data from the chip. It &lt;strong&gt;cannot&lt;/strong&gt; extract PINs, CVVs, or private cryptographic keys. EMV security is designed to make that impossible.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  🚀 Getting Started in 3 Minutes
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1: Add the Dependency
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;emv_nfc_reader&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^1.0.3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 2: Add NFC Permission
&lt;/h3&gt;

&lt;p&gt;In your &lt;a&gt;android/app/src/main/AndroidManifest.xml&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;"android.permission.NFC"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;uses-feature&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;"android.hardware.nfc"&lt;/span&gt; &lt;span class="na"&gt;android:required=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Read a Card
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:emv_nfc_reader/emv_nfc_reader.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EmvNfcReader&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;cardData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startReading&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cardData&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Card Number: &lt;/span&gt;&lt;span class="si"&gt;${cardData['pan']}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Expiry: &lt;/span&gt;&lt;span class="si"&gt;${cardData['expiry']}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Holder: &lt;/span&gt;&lt;span class="si"&gt;${cardData['cardholder']}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Transactions Used: &lt;/span&gt;&lt;span class="si"&gt;${cardData['atc']}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Three lines of setup, one function call, and you have the card's data.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ How It Works Under the Hood
&lt;/h2&gt;

&lt;p&gt;If you're curious about the EMV protocol, here's a simplified view of what happens during a single tap:&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1 — Discovery
&lt;/h3&gt;

&lt;p&gt;The phone sends a &lt;strong&gt;SELECT&lt;/strong&gt; command for the PPSE (Proximity Payment System Environment). The card responds with a list of available applications (Visa, Mastercard, Amex, etc.).&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 2 — Application Selection
&lt;/h3&gt;

&lt;p&gt;The library selects the highest-priority application and sends a &lt;strong&gt;GET PROCESSING OPTIONS (GPO)&lt;/strong&gt; command. This is the "handshake" where the card and terminal agree on the transaction parameters.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Visa Challenge&lt;/strong&gt;: Many Visa cards require carefully crafted Terminal Transaction Qualifiers (TTQ). Getting the right byte combination (&lt;code&gt;F620C000&lt;/code&gt;) was one of the trickiest parts of this project. Without it, the card simply refuses to respond.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Phase 3 — Record Reading
&lt;/h3&gt;

&lt;p&gt;Using the &lt;strong&gt;Application File Locator (AFL)&lt;/strong&gt; from the GPO response, the library reads each record from the card's internal file system. This is where the PAN, expiry date, and cardholder name live.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 4 — Advanced Extraction
&lt;/h3&gt;

&lt;p&gt;Finally, the library sends &lt;strong&gt;GET DATA&lt;/strong&gt; commands for fields that aren't included in the standard records:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;80 CA 9F 17&lt;/code&gt; → PIN Try Counter&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;80 CA 9F 36&lt;/code&gt; → Application Transaction Counter&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;80 CA 5F 53&lt;/code&gt; → IBAN&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;80 CA 9F 4D&lt;/code&gt; → Log Entry (for transaction history)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📊 Real-World Example: Building a Card Scanner App
&lt;/h2&gt;

&lt;p&gt;Here's a more complete example showing how to build a premium-looking card scanner UI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;_CardScannerState&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;CardScanner&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;_reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EmvNfcReader&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kt"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;_card&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_scan&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_reader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startReading&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="n"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_card&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Handle NFC errors&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;children:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="c1"&gt;// Visual credit card widget&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_card&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;CreditCardWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;pan:&lt;/span&gt; &lt;span class="n"&gt;_card&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'pan'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s"&gt;'****'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;expiry:&lt;/span&gt; &lt;span class="n"&gt;_card&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'expiry'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s"&gt;'--/--'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;holder:&lt;/span&gt; &lt;span class="n"&gt;_card&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'cardholder'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s"&gt;'CARD HOLDER'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;

        &lt;span class="c1"&gt;// Data sections&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_card&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;...[&lt;/span&gt;
          &lt;span class="n"&gt;InfoRow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Transaction Count'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_card&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'atc'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s"&gt;'N/A'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="n"&gt;InfoRow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'PIN Tries Left'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_card&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'pinTry'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s"&gt;'N/A'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="n"&gt;InfoRow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'IBAN'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_card&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'iban'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s"&gt;'N/A'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;

        &lt;span class="n"&gt;ElevatedButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="n"&gt;_scan&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Tap Your Card'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 What I Learned Building This
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Every Card Brand is Different
&lt;/h3&gt;

&lt;p&gt;Visa, Mastercard, and Amex all implement the EMV specification slightly differently. Visa's qVSDC protocol embeds the PAN inside the GPO response (Tag 57), while Mastercard stores it in separate record files. The library handles both transparently.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Banks Control What You See
&lt;/h3&gt;

&lt;p&gt;Some fields (like IBAN and Cardholder Name) are entirely optional. Many European banks include them, while North American banks often strip them out for privacy. Your app should always handle &lt;code&gt;null&lt;/code&gt; values gracefully.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The Chip Never Reveals Its Secrets
&lt;/h3&gt;

&lt;p&gt;EMV chips use a "Secure Element" — a tamper-resistant hardware module that stores private keys. Even with physical access to the chip, you cannot extract these keys. This is why EMV cards can't be cloned like magnetic stripes. The chip signs each transaction with a unique cryptogram, making replay attacks impossible.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔮 What's Next?
&lt;/h2&gt;

&lt;p&gt;I'm planning to add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;iOS Support&lt;/strong&gt; via Core NFC&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Card Art Detection&lt;/strong&gt; — identifying the visual design based on the BIN&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline Balance&lt;/strong&gt; for prepaid cards that support it&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔗 Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;pub.dev&lt;/strong&gt;: &lt;a href="https://pub.dev/packages/emv_nfc_reader" rel="noopener noreferrer"&gt;pub.dev/packages/emv_nfc_reader&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/abidiahmedcom/emv_nfc_reader" rel="noopener noreferrer"&gt;github.com/abidiahmedcom/emv_nfc_reader&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Author Portfolio&lt;/strong&gt;: &lt;a href="https://abidiahmed.com" rel="noopener noreferrer"&gt;https://abidiahmed.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;If you found this useful, give the package a ⭐ on GitHub and a 👍 on pub.dev. It helps other developers discover it!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have questions or feature requests? Open an issue on GitHub or drop a comment below.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt;: &lt;code&gt;#flutter&lt;/code&gt; &lt;code&gt;#dart&lt;/code&gt; &lt;code&gt;#nfc&lt;/code&gt; &lt;code&gt;#emv&lt;/code&gt; &lt;code&gt;#mobile-development&lt;/code&gt; &lt;code&gt;#open-source&lt;/code&gt; &lt;code&gt;#android&lt;/code&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>android</category>
      <category>nfc</category>
      <category>kotlin</category>
    </item>
  </channel>
</rss>
