Geliştirici Dokümanı
Bu doküman geliştiriciler için adım adım Token Integration Hub Protokolüne nasıl entegre olunacağını anlatır.
Last updated
Bu doküman geliştiriciler için adım adım Token Integration Hub Protokolüne nasıl entegre olunacağını anlatır.
Last updated
“Add Reference…” butonuna tıkalyın.
“IntegrationHub.dll” adlı dosyayı seçip OK tuşuna basın.
Bu aşamalardan sonra kod içinde IntegrationHub kütüphanesini kullanabilirsiniz:
Bu kısım isteğe bağlıdır, ancak önerilmektedir; çünkü JSON oluşturacak ve ayrıştıracaksınız. Sağladığımız sınıflar ve kütüphaneler, bunu yapmanızı kolaylaştıracaktır. Bu dokuman, bu adımı tamamlamışsınız gibi devam edecektir. Kendi JSON dönüştürme sistemlerinizi yazmak isterseniz, bunu yapmaktan çekinmeyin; ancak bu dokumanla ilerlemek zorlaşabilir.
Newtonsoft.Json paketini NuGet ile indirin
Projenize, şablon dosyalarında sağlanan Basket.cs
, FiscalInfo.cs
ve ReceiptInfo.cs
sınıflarını ekleyin.
Communication nesnesini, uygulama genelinde erişilebilir olmasını sağlamak için Program sınıfı kapsamında bir singleton olarak başlatın. İletişimin uygulama başlayınca hemen başlamasını istemiyorsanız Objeyi bir buton yardımı ile kullanıcı butona basınca oluşturabilirsiniz.
Cihaz durumu ve seri iletişimi yönetmek için callback'leri ayarlayın ve sepet nesnesini ana formun içinde bir üye değişkeni olarak ayarlayın. Aşağıdaki kod parçası, şablon projedeki kodun basitleştirilmiş bir versiyonudur.
Communication, kodunuz ile Android ÖKC cihazı arasında Integration Hub API'sini kullanarak iletişimi kolaylaştıran bir objedir. İletişimi başlatmak için öncelikle bu nesneyi oluşturmalısınız. Bu nesne oluştuktan sonra arka planda DLL bağlanmış olacak ve dokumanın ileri kısımlarında anlatıldığı gibi cihaz bağlanması veya bağlantı kopması durumlarında sizi callback mekanizması ile bilgilendiriyor olacak. Detaylı kullanım için Token Template Simulator uygulamasının kaynak kodlarına bakabilirsiniz.
Cihaz durumlarındaki değişiklikleri dinlemek için setDeviceStateCallback()
komutunu kullanın. Bu callback, yeni bir cihaz bağlandığında veya mevcut cihaz bağlantısı kesildiğinde yürütülecektir.
isConnected
parametresi, callbackin bir cihaz bağlantısı mı yoksa bağlantı kesilmesi mi olduğunu temsil eder. True değeri, bir cihazın bağlı olduğu anlamına gelir; false değeri ise bir cihazın bağlantısının kesildiğini gösterir.
id
cihazın mali numara bilgisini döndürür.
Bu fonksiyon, senkron olarak çalışan getDeviceInfo()
'u çağırdığı için ana program akışınızı engelleyebilir. Kullanırken dikkatli olun, ana programınızın engellenmemesi için thread'ler veya diğer yapılar kullanın. Optimal bir durumda çalıştırılması çok az zaman alır, ancak sorunlara yol açabilir.
IntegrationHub.dll hem X30 TR hem de 300 TR ile uyumlu çalışmaktadır. Anlık olarak hangi cihazın bağlı olduğunu anlamak için getActiveDeviceIndex
komutunu kullanabilirsiniz. Device state callback ile bağlantının sağlandığına emin olduktan sonra bu komutu çağırdığınızda X30 TR için 0, 300 TR için ise 1 değerini dönecektir.
Device state callback'i ile bağlantının sağlandığına emin olduktan sonra getFiscalInfo()
komutunu kullanarak ÖKC cihazından bölüm ve kaydedilmiş ürün bilgilerini alın. Bağlantının sağlandığına nasıl emin olunacağı ile alakalı kod örneği Token Template Simulator'ün kaynak dosyalarında bulunmaktadır. Bu fonksiyon, bir JSON dizesi döndürür; bu JSON dizesinin örneği örnekler bölümünde bulunabilir.
Fiscal bilgilerini almak protokolü kullanmak için zorunludur fiscal bilgileri alınmadan satış işlemlerine başlamayın.
Bu fonksiyon senkron olarak çalıştığı için ana program akışınızı engelleyebilir. Kullanırken dikkatli olun; ana programınızın engellenmemesi için thread'ler veya diğer yapılar kullanın. Optimal bir durumda çalıştırılması çok az zaman alır, ancak sorunlara yol açabilir.
sendBasket()
fonksiyonu, sepet bilgilerini ÖKC cihazına göndermek için kullanılır. Parametre olarak bir sepet JSON'u sağlanmalıdır. Bu JSON'un örneğini 'JSON Örnekleri' bölümünde bulabilirsiniz.
Eğer X30 TR' ye bağlıysanız, hem sepet hem ödeme bilgilerini aynı istek içinde sendBasket
fonksiyonu ile göndermelisiniz.
Eğer 300 TR' ye bağlıysanız, sadece 1 tane ödeme varsa ödeme bilgisini sepet içerisindeki ürün bilgileriyle beraber sendBasket
komutu ile gönderebilirsiniz. Birden fazla ödeme yollanmak istenirse sendBasket
komutu ile sepet gönderildikten sonra sendPayment
komutu ile ödemeler tek tek gönderilmelidir.
300TR için örnek sendPayment
isteği:
300TR' de fiş iptali için ise,sendPayment
isteği içinde isVoid değerini true göndermeniz yeterli.
setSerialInCallback()
komutunu kullanarak ÖKC'den gelen yanıtları dinleyin. Bu komutu girdikten sonra, ayrı bir thread' de izlenen iletişim, gelen bilgileri belirlediğiniz callback fonksiyonuna yönlendirilecektir.
Type
, ÖKC'den gelen verinin türünü temsil eder; türler ve tanımları bu belgede bulunan Türler tablosunda bulunabilir.
Value
, veriyi temsil eden JSON dizesidir.
Callback fonksiyonu ayarlandığında, gönderilen satışların durumu belirttiğiniz callback fonksiyonuna iletilecektir.
Aşağıda callback fonksiyonunun örnek kullanımı görülebilir. Satış JSON'u örneği 'Örnek JSON' bölümünde bulunabilir.
TLV (Tag-Length-Value) protokolü, verileri yapılandırılmış bir şekilde depolamak ve taşımak için kullanılan bir veri kodlama şemasını ifade eder. Bu protokolde, veriler TLV paketleri adı verilen birimlere ayrılmıştır. Her TLV paketi üç bileşen içerir: Tür (Type), Uzunluk (Length) ve Değer (Value).
Type (Tag): Bu, değer alanında bulunan verinin türünü tanımlayan 2 baytlık bir tanımlayıcıdır.
Length: Bu, değer alanında bulunan verinin uzunluğunu tanımlayan 4 baytlık bir tanımlayıcıdır.
Value: Bu, değer alanında bulunan verinin kendisin tanımlayan boyutu değişebilen bir tanımlayıcıdır.
Protokolümüzde veri bütünlüğünü sağlamak amacı ile tüm TLV ile iletilen verilerde belirli bir şema kullandık. Bu şemaya göre veri akışın TLV Başlangıç Paketi - TLV Veri Paketi - TLV Bitiş Paketi şeklinde sağlıyoruz böylece aradaki bozulmaları engellemiş ve eksik paketleri tespit edebilmiş oluyoruz. Aynı zamanda her TLV paketinin sonunda bir checksum ile veri bütünlüğünü kontrol ediyoruz.
Paketlerin hepsi sıkıştırılmış ve şifrelenmiş halde gönderiliyor. Şifreleme PC tarafından handshake adımları bittikten sonra oluşan anahatar ile sağlanıyor. Handshake'in detayları aşağıda bulunmaktadır.
Protokolümüzde, cihaz güvenliği ve doğrulamasını sağlamak için bir yöntem uygulanmıştır. Süreç, PC'den ÖKC'ye bir mesaj gönderilmesiyle başlar. ÖKC, bu mesajı cihaz sertifikasıyla imzalar. İmzalama işleminden sonra, ÖKC cihaz sertifikasını PC ile paylaşır. PC, gönderilen mesajın sağlanan sertifika ile oluşturulabileceğini doğrulamak için sertifikanın açık anahtarını ve ECDSA (Eliptik Eğri Dijital İmza Algoritması) kullanır. Bu doğrulama adımı, cihazın geçerli olduğunu onaylar ve iletişime güvenle devam etmemize olanak tanır. Doğrulamada bir sorun varsa, iletişime devam edilmez.
Aşağıdaki tablo, kütüphanede mevcut olan istek türlerini açıklamaktadır. Bu türler, seri iletişimdeki callback aracılığıyla dinlenebilir.
0
Cihaz bilgisini döner.
1
Sepet'in gönderildiği paket.
2
Fiscal bilgisinin döndüğü paket.
3
Satış bilgisini döner.
4
Hello paketi.
5
Sertifika paketi.
6
Anahtar paylaşımı paketi.
7
Bağlantı sonlandırma paketi.
9
Sepet işlenme durumu hakkında bilgi veren paket.
10
Gönderilen Ödemenin cevabı (sadece 300TR' de parçalı ödemele senaryoları için )
49
TLV başlangıç paketi.
50
TLV bitiş paketi.
60
Error bilgisi paketi.
Örnek
Açıklama
Alan
Tip
Açıklama
Örnek Değer
basketID
string
UUID
“93ced0be-99f5-4e42-b0ca-bc781c778d69”
createInvoice
bool
Fiş oluştur.
true
documentType
int
Satış tipi.
SATIS(0), AVANS(9000), FATURA TAHSILATI(9001), CARI TAHSILAT(9002), FATURA BILGI FISI(9005), E-FATURA BILGI FISI(9006), E-ARSIV BILGI FISI(9007), ECZANE(9008)
isVoid
bool
Eğer true ise iptal fisi basilacaktir.
false
items
[object]
Sepetteki ürünlerin listesi.
paymentItems
[object]
Ödeme planının listesi.
customerInfo
object
Müşteri Bilgisi.
adjust
object
İndirim/Arttırım bilgisi.
note
string
Fiş altı notu
Alan
Tip
Açıklama
Örnek Değer
barcode
string
Eşya barkodu.
8690006200
name
string
Eşya adı.
"Su"
pluNo
int
Eşya PLU numarası.
0
price
int
Eşyanın kuruş cinsinden fiyatı
500
sectionNo
int
Kısım no.
1
unit
string
Ölçü birimi.
"Adet"
quantity
int
Miktarın 100 ile çarpılmış hali.
1000
Alan
Tip
Açıklama
Örnek Değer
amount
int
Kuruş cinsinden ödeme miktarı.
1000
type
int
1
Ödeme Tipi
Değer
Açıklama
PAYMENT_CASH
1
Nakit
PAYMENT_CHEQUE
2
Çek
PAYMENT_CREDITCARD
3
Kredi Kartı
PAYMENT_FOOD
7
Yemek Kartı
PAYMENT_ODEMESIZ
8
Ödemesiz
PAYMENT_IKRAM
9
İkram
PAYMENT_VERESIYE
10
Veresiye
PAYMENT_PUAN
11
Puan
PAYMENT_VPOS
12
EPOS Ödeme
PAYMENT_MOBILE
13
Mobil Ödeme
PAYMENT_EMONEY
14
E-Para Ödeme
PAYMENT_CHARITY
15
Bağış
PAYMENT_BOND
16
Bond ile Ödeme
PAYMENT_OPENACCOUNT
17
Açık Hesap
PAYMENT_MONEYTRANSFER
18
Para Transferi
PAYMENT_TRANSPORTATIONCARD
19
Ulaşım Kartı
PAYMENT_GIFTCARD
20
Hediye Kartı
Alan
Tip
Açıklama
Örnek Değer
buildingName
string
Bina adı.
"Building B"
buildingNumber
string
Bina numarası.
"202"
cityName
string
Şehir adı.
"City Y"
citySubdivisonName
string
İlçe adı.
"Subdivision 2"
country
string
Ülke adı.
"Country B"
email
string
Email.
"customer2@example.com"
isLock
bool
Eğer true ise gonderilen bilgiler ÖKC'de değiştirilemez.
false
name
string
İsim.
"Ege Yardımcı"
postalZone
string
Posta kodu.
"67890"
region
string
Bölge.
"Region Y"
room
string
Oda numarası.
"20"
street
string
Sokak adı.
"Street B"
taxID
string
Vergi numarası.
"0987654321"
taxScheme
string
Vergi dairesi.
"Scheme B"
telefax
string
Telefax numarası.
"654321"
telephone
string
Telefon numarası.
"0123456789"
Alan
Tip
Açıklama
Örnek Değer
description
string
İndirim/Arttırım açıklaması. Fişte bastırılır.
"İndirim"
discountOrSurcharge
int
0 indirim, 1 arttırım.
0
type
int
0 fiyat indirim/arttırımı, 1 yüzdelik indirim arttırım.
0
value
int
Adet başına İndirim veya arttırım değerinin 100 ile çarpılmış hali
2000
totalValue
int
Ürüne yapılan toplam indirim veya artırım değerinin 100 ile çarpılmış hali
2000
2 adet olan bir ürüne value=1000 gönderirseniz 20 TL, totalValue=1000 gönderirseniz 10 TL indirim/artırım yapılmış olur.
Sepete indirim/artırım yaparken sadece value gönderilebilir. totalValue kullanılamaz.
Örnek
Açıklama
Alan
Tip
Açıklama
Örnek Değer
businessMode
int
Isletme modu.
Standart(0), Eczane(1), Konaklama(2)
pluCount
int
Cihazda kayitli PLU adeti.
1
plus
[object]
Cihazda kayıtlı ürünlerin listesi.
[{"barcode": "", "name": "Elma", "pluNo": 0, "price": 2000, "sectionNo": 1, "taxPercent": 1000, "type": 0, "unit": "Adet", "vatID": 1}]
receiptLimit
int
Fiş limiti. Bu tutarın üstüne bilgi fişi oluşturulmalıdır.
6900
sectionCount
int
Cihazda kayıtlı kısımların sayısı.
2
sections
[object]
Cihazda kayıtlı kısımların listesi.
[{"limit": 0, "name": "GİDA", "price": 0, "sectionNo": 1, "taxPercent": 1000, "type": 0}, {"limit": 0, "name": "TEKEL", "price": 0, "sectionNo": 2, "taxPercent": 2000, "type": 0}]
Alan
Tip
Açıklama
Örnek Değer
barcode
string
Ürün barkodu.
""
name
string
Ürün ismi
"Elma"
pluNo
int
PLU numarası.
0
price
int
Ürün fiyatı kuruş cinsinden.
2000
sectionNo
int
Bağlı oldugu kısım numarası.
1
taxPercent
int
Vergi dilimi.
1000
type
int
Ürün tipi.
Standart(0), Konaklama(1)
unit
string
Ölçü birimi.
"Adet"
vatID
int
-
1
Alan
Tip
Açıklama
Örnek Değer
limit
int
-
0
name
string
Kısım adı.
"GİDA"
price
int
-
0
sectionNo
int
Kısım numarası.
1
taxPercent
int
Vergi dilimi.
1000
type
int
-
0
Satış durumu JSON'u, ÖKC tarafından ana makineye gönderilecektir. İşte bu JSON'un iki örneği: biri başarılı bir satış, diğeri ise başarısız bir satış. Bu bilgiler callback'ler aracılığıyla gözlemlenebilir.
Örnek