NFC ile Ödeme Kartı Bilgilerinin Alınması

ibrahimertanylmz
Huawei Developers - Türkiye
4 min readOct 25, 2023
High Tech Internet GIF By Matthew Butler

Giriş

Herkese selam! 👋 Bu makale, Kotlin’de bir Android Uygulaması için NFC Kullanarak Ödeme Kartı Bilgilerinin Alınması konusuna dayanmaktadır. NFC EMV kredi kartlarından genel verileri okumak ve çıkarmak için kullanılan “EMV NFC Paycard Enrollment” Java kütüphanesi adında bir yardımcı kütüphane bulunmaktadır. NFC ile kart numarası ve son geçerlilik tarihi gibi temel kredi kartı verilerini alacağız. Gelin NFC hakkında daha fazlasını inceleyelim ve örnek uygulamamızı geliştirelim!

NFC Nedir?

NFC

NFC (Yakın alan iletişimi), iki elektronik cihaz arasında 4 cm veya daha kısa bir mesafe üzerinden iletişim kurmayı sağlayan bir dizi iletişim protokolüdür. NFC, daha yetenekli kablosuz bağlantıları başlatmak için kullanılabilecek basit bir kurulum aracılığıyla düşük hızlı bir bağlantı sunar. NFC ile Android Geliştirme hakkında daha fazla bilgi edinmek istiyorsanız bağlantılardan NFC Temelleri ve Gelişmiş NFC’ye göz atabilirsiniz.

Geliştirme Süreci

Geliştirme kısmına başlayalım. Öncelikle AndroidManifest dosyasına gerekli izinleri ekleyin. Aşağıdaki NFC ve titreşim için izinleri ekleyin.

<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.VIBRATE" />

Daha sonra app level build gradle dosyasına EMV NFC Paycard Enrollment implementasyonunu ekleyin.

implementation 'com.github.devnied.emvnfccard:library:3.0.1'

Daha sonra APDU’yu NFC EMV kredi kartıyla değiştirmek için özel bir provider oluşturmanız gerekir ve Android için IsoDep sınıfına ile bir provider oluşturabilirsiniz:

class PcscProvider : IProvider {

private lateinit var mTagCom: IsoDep

@Throws(CommunicationException::class)
override fun transceive(pCommand: ByteArray?): ByteArray? {
var response: ByteArray? = null
try {
// send command to emv card
if (mTagCom.isConnected) {
response = mTagCom.transceive(pCommand)
}
} catch (e: IOException) {
throw CommunicationException(e.message)
}
return response
}

override fun getAt(): ByteArray {
var result: ByteArray?
result = mTagCom.historicalBytes // for tags using NFC-B
if (result == null) {
result = mTagCom.hiLayerResponse // for tags using NFC-B
}
return result
}

fun setmTagCom(mTagCom: IsoDep) {
this.mTagCom = mTagCom
}
}

Şimdi bir NFC adapter oluşturalım ve onu onCreate metodunda initialize edelim. Ayrıca Activity, onTagDiscovered yöntemini override etmek için ReaderCallBack’i implement etmelidir.

class MainActivity : AppCompatActivity(), ReaderCallback {
private var mNfcAdapter: NfcAdapter? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mNfcAdapter = NfcAdapter.getDefaultAdapter(this)
}
...

Daha sonra onResume fonksiyonu içerisinde resence delay and reader mode NfcAdapter için ayarlanmalıdır. Tüm kart türleri için ReaderMode’u etkinleştirin ve platform seslerini devre dışı bırakın.

override fun onResume() {
super.onResume()
if (mNfcAdapter != null) {
val options = Bundle()
options.putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, 250)

mNfcAdapter!!.enableReaderMode(
this,
this,
NfcAdapter.FLAG_READER_NFC_A or
NfcAdapter.FLAG_READER_NFC_B or
NfcAdapter.FLAG_READER_NFC_F or
NfcAdapter.FLAG_READER_NFC_V or
NfcAdapter.FLAG_READER_NFC_BARCODE or
NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS,
options
)
}
}

Daha sonra tag’in içeriğini almak için onTagDiscovered yöntemini override edin ve bunu implement ettiğimiz emvNfcCard kütüphanesiyle yapılandırın ve ayrıştırın. Ayrıca Parser kısmında oluşturduğumuz PCScProvider bizim sağlayıcımız olarak ayarlanacak. Daha sonra EmvCard’ı okuyup sonuçlarımızı kontrol edebiliriz. Tüm bu işlemler, bir alıcı-vericinin IOException olup olmadığını kontrol etmek için bir try-catch bloğunun içindedir.

override fun onTagDiscovered(tag: Tag?) {
val isoDep: IsoDep?
try {
isoDep = IsoDep.get(tag)
if (isoDep != null) {
(getSystemService(VIBRATOR_SERVICE) as Vibrator).vibrate(
VibrationEffect.createOneShot(
150,
10
)
)
}
isoDep.connect()
val provider = PcscProvider()
provider.setmTagCom(isoDep)
val config = EmvTemplate.Config()
.setContactLess(true)
.setReadAllAids(true)
.setReadTransactions(true)
.setRemoveDefaultParsers(false)
.setReadAt(true)
val parser = EmvTemplate.Builder()
.setProvider(provider)
.setConfig(config)
.build()
val card = parser.readEmvCard()
val cardNumber = card.cardNumber
Log.d("PaymentResultCardNumber: ", cardNumber)

val expireDate = card.expireDate
var date = LocalDate.of(1999, 12, 31)
if (expireDate != null) {
date = expireDate.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate()
}
Log.d("PaymentResultDate: ", date.toString())
try {
isoDep.close()
} catch (e: IOException) {
e.printStackTrace()
}
} catch (e: IOException) {
e.printStackTrace()
} catch (e: Exception) {
e.printStackTrace()
}
}
}

Daha sonra kodu android test cihazınızda çalıştırın ve kart numarası ve son kullanma tarihi sonuçlarını görmek için Kredi Kartı ile kontrol edin. Cihazınızda NFC’yi etkinleştirmeyi unutmayın. İşte loglardaki çıktılar! 🎉:

Geliştirme kısmı bu kadardı!

Sonuç

Makalede, Android’de EMV NFC Paycard Enrollment kitaplığını kullanarak NFC ile ödeme kartı bilgilerini almak için bir proje oluşturmak açıklandı. Geliştirme sonrasında NFC tag’inden gelen kart numarası ve son kullanma tarihi gibi bilgiler loglanarak kontrol edildi. Github’da NFC ile ödeme kartı bilgilerini almaya yönelik bir Kotlin örneği olmadığından bu makalenin yardımcı olacağını umuyorum!

Umarım bu makaleyi faydalı bulmuşsunuzdur ve herhangi bir yorumunuz veya sorunuz varsa lütfen yorumlarda bildirin.

Referanslar

--

--

ibrahimertanylmz
Huawei Developers - Türkiye

Android Developer @Huawei 💻, ESOGU Computer Engineering Graduate 🎓, Proactive Self-Starter, Quick Learner, Team Player 👨‍👦‍👦