STM32F103 POS bağlantısı hk.

M_B

Üye
Katılım
16 Şubat 2023
Mesajlar
281
Merhabalar,
STM32F103 ile Wifi üzerinden POS cihazıyla haberleştirmek istiyorum. ( Odeme alındı - Alınmadı gibi bilgiler )
Şu an bildiğim STM32F103 ile ESP-01 UART üzerinden bir birine bağlanabileçeği. İlerisi için henuz bilgi sahibi değilim.
Bu konuda çalışmış arkadaşlardan tecrubelerine ,yönlendirmelerine , anahar kelimeler ihtiyacım var.

Teşekkürler.
 
pos cihazları yüksek güvenlikli cihazlardır. basit şekilde ödeme alındı alınmadı gibi bir bilgi çıkışı vermezler.
yazarkasa ile bağlantısında bile yüksek güvenlikli iletişim kullanılır. bu güvenlik protokolleri sadece
sertifikalı donanım üreicileri ile paylaşılır.

Türkiye'deki yeni nesil ödeme kaydedici cihazların (Beko, Profilo, Ingenico vb.) çoğu GMP-3 adı verilen bir protokolü destekler. bu protokolü kullanmak için bankadan veya cihaz üreticisinden teknik döküman (SDK) talep etmen gerekir.

bunun bir istisnası olabilir nayax gibi wending machineler için tasarlanan pos cihazlarında basit bir röle ile bu çıkış verilebilir.
 
Ne yapmak istediğinizi biraz daha detaylı anlatırmısınız.
Detay vermek istemiyorsanız: Bu hizmeti alacağınız sağlayıcının sdk larına ihtiyacınız olacak. Bunları genelde ticari gizlilik anlaşması imzalanarak veriyorlar / satıyorlar.
 
Uygulamayı yanlış izahte etmiş olabilirim.
Yapılmak istenen bir bakıma Otomat cihazı.
Ekrandan ilgili ürün secimi yapıldıktan sonra POS cihaza yönlendirmek. Ödeme işlemi sonucuna göre cihazın aksiyon alması.

Yukarda bahsettiğim uygulamayı ESP32 Dwin ekran ve POS cihazı kullanarak yapmışlar.
POS ile ESP32 aynı wifi ağına bağlı olmalıymış. İletişim Protokol olarak REST API kullanmışlar.
POS cihazında ayarla kısmında REST API secimi olmalıymış.

POS Cihaz icin tanımlar:
Kod:
#include <Preferences.h>
#include <HTTPClient.h>
#include <Arduino.h>
#include <ArduinoJson.h>

#include <WiFiManager.h>

// POS MAKİNESİ İÇİN TANIMLAR
String sorgu = "";
String jsonData;
uint16_t opr_order = 0;
const char* opr_time = "2020-10-21T20:20:45.107290";
int okunan;
DynamicJsonDocument doc(4096);  //1024 byte json döküman yeri oluşturduk
const char* serverAddress = "192.xx.x.x:4567";  // POS MAKİNE İP Sİ SABİT OLMALIDIR
const int serverPort = 80;              // Sunucu portu
const String istek = "/Pairing";        // Sunucu eşleştirme isteği
const String istek2 = "/StartPayment";  // Sunucu eşleştirme isteği
float payment_price = 0.00;             // pos cihazından çekilecek olan fiyat

String ssid = "";
String password = "";
float big_price;
float small_price;


Preferences preferences;
WiFiClientSecure client;
String PRICE_SCRIPT_ID = "xxxxx......xxxx";

String SALES_SCRIPT_ID = "xxxxx....xxxx";
POS odeme işlem adımları:
Kod:
void post_to_pairing() {
  sorgu = "Pairing";
  HTTPClient http;
  http.setTimeout(5000);
  http.begin("http://" + String(serverAddress) + ":" + istek);
  http.addHeader("Content-Type", "application/json");
  Serial.println("http://" + String(serverAddress) + ":" + istek);
  int httpResponseCode = http.POST(PairingJson());

  if (httpResponseCode > 0) {
    String response = http.getString();
    Serial.println("HTTP Response Code: " + String(httpResponseCode));
    httpAnswer(response);

  } else {
    Serial.print("err:");
    Serial.println(httpResponseCode);
   }
  http.end();
}
////////////////*********************************************************************//////////////
String PairingJson() {
  jsonData = "";  // json stringi temizle
  doc.clear();
  doc["HasError"] = false;
  doc["Message"] = "";
  JsonObject TransactionHandle = doc.createNestedObject("TransactionHandle");
  TransactionHandle["SerialNumber"] = "xxxxxxx";
  TransactionHandle["TransactionDate"] = String(opr_time);
  TransactionHandle["TransactionSequence"] = opr_order;
  TransactionHandle["Fingerprint"] = "xxxxxxxxxxxxx";

  serializeJson(doc, jsonData);
  return jsonData;
}
////////////////*********************************************************************//////////////
void post_to_payment() {
  sorgu = "StartPayment";
  HTTPClient http;
  http.setTimeout(40000);
  http.begin("http://" + String(serverAddress) + ":" + istek2);
  http.addHeader("Content-Type", "application/json");
  Serial.println("http://" + String(serverAddress) + ":" + istek2);
  int httpResponseCode = http.POST(PaymentJson());

  if (httpResponseCode > 0) {
    String response = http.getString();
    Serial.println("HTTP Response Code: " + String(httpResponseCode));
    // Serial.println(response);
    httpAnswer(response);

  } else {
    Serial.print("err:");
    Serial.println(httpResponseCode);
  }
  http.end();
}
////////////////*********************************************************************//////////////
String PaymentJson() {
  jsonData = "";  // json stringi temizle
  doc.clear();
  JsonObject TransactionHandle = doc.createNestedObject("TransactionHandle");
  TransactionHandle["SerialNumber"] = "xxxxxx";
  TransactionHandle["TransactionDate"] = String(opr_time);
  TransactionHandle["TransactionSequence"] = opr_order + 1;
  TransactionHandle["Fingerprint"] = "xxxxxxxxxxx";

  JsonObject Payment = doc.createNestedObject("Payment");
  Payment["Amount"] = String(payment_price);  // ÇEKİLECEK FİYAT
  Payment["installmentCount"] = 1;
  Payment["puan"] = 0;
  Payment["CurrencyCode"] = "TRY";
  Payment["CardReadTimeout"] = 20;
  Payment["AllowDismissCardRead"] = false;

  JsonObject Payment_AdditionalInfo = Payment.createNestedObject("AdditionalInfo");
  Payment_AdditionalInfo["print"] = false;
  Payment_AdditionalInfo["receiptImage"] = false;
  Payment_AdditionalInfo["customerReceiptImageEnabled"] = false;
  Payment_AdditionalInfo["merchantReceiptImageEnabled"] = false;
  Payment_AdditionalInfo["receiptWidth"] = "80mm";
  Payment_AdditionalInfo["headUnmaskLength"] = 4;
  Payment_AdditionalInfo["tailUnmaskLength"] = 4;

  serializeJson(doc, jsonData);
  return jsonData;
}
////////////////*********************************************************************//////////////
void httpAnswer(String answer) {
  StaticJsonDocument<0> filter;
  filter.set(true);
  DeserializationError error = deserializeJson(doc, answer, DeserializationOption::Filter(filter));
  if (error) {
    Serial.print("deserializeJson() failed: ");
    Serial.println(error.c_str());
    return;
  }
  bool hasabondon = doc["HasAbondon"];
  bool haserror = doc["HasError"];
  const char* message = doc["Message"];
  JsonObject TransactionHandle = doc["TransactionHandle"];
  opr_order = TransactionHandle["TransactionSequence"];
  opr_time = TransactionHandle["TransactionDate"];
  JsonObject Data = doc["Data"];
  const char* sales_return = Data["emvErrorText"];  // "Başarılı" yada "İşlem Red" dönecek

  // POS CİHAZINDAN DÖNEN BİLGİLER//*****////*****////************/////////////**********////////

  if (String(message) == "İşlemden vazgeçildi") {
    Serial.println("zaman aşımı");
    delay(10000);
  } else if (String(message) == "EMV: İşlem Başarısız") {
    Serial.println("işlem iptal edildi");
    delay(7500);
  } else if (hasabondon == false && haserror == false && String(sales_return) == "Başarılı") {
    Serial.println("PARA ÇEKILDI ");
    pay_pass = true;             
    return Go_to_machine(); // Yapılacak işleme gidiyor.
  } else if (haserror == true) { 
    Serial.println("Hata kodu: " + String(message));
    Serial.println("Operasyon Sırası: " + String(opr_order));
     Serial.println("Operasyon Zamanı: " + String(opr_time));
    delay(30);
    if (sorgu == "Pairing") return post_to_pairing();
    if (sorgu == "StartPayment") return post_to_payment();
  } else Serial.println("SORGU BAŞARILI <OK>");
}

Arkadastan alabildiğim ve ögrenebildiğim yapı bu.
Bu bilgiler doğrultuusnda ki düşünce ve yorumlarınızı ogrenmek isterim.
Teşekkürler.
 
Kullanılan ödeme sisteminin sdksına ihtiyacınız olacak. Deneme yanılma ile bunu bulma şansınız zor.
Zaten çalışan bir sistem üzerinde geliştirme yapıyorsanız, başlangıç noktasını geçmiş sayılırsınız. Anonim olarak ihtiyacınız olan bilgileri bulmanız çok zor. Niye pos hizmeti aldığınız sağlayıcının ilgili birimi ile iletişim kurmuyorsunuz.

Fiziksel pos cihazı ile denemeler yapıyorsanız, bu özelliklerinin (rest, mdb, pulse veya kendine has iletişim protokolü) cihazda ve/veya ödeme sunucu tarafında açık olduğundan emin olmanız gerekir. Sağlayıcı bu hizmeti uzaktan kapatmış veya açmamış olabilir. Bunların cevabını buradan vermek imkansız.
 
böyle bir iş isteniyorsa zaten bir bankadan pos alıyorsunuz demektir. posu veren banka (el terminali değil) bu SDK'yı da sağlayacaktır.
bu kod eksik kod içinde api ile haberleşirken bir api key, login credentials bir şekil güvenlik katmanı olmak zorunda.

artı bu kodda çok ciddi mantık hataları var:
Serial.println("işlem iptal edildi");
delay(7500);

bu seviyede işlemler yapacak bir aletde böyle blocking fonksiyonlar istenmez.
 
Son düzenleme:

Forum istatistikleri

Konular
8,801
Mesajlar
143,412
Üyeler
3,528
Son üye
cemalvercetti

Son kaynaklar

Son profil mesajları

Abdullah karaoglan falcon_browning Abdullah karaoglan wrote on falcon_browning's profile.
selamın aleyküm ses sistemindeki cızırtıyı hallettınızmi
"Araştırma, ne yaptığını bilmediğinde yaptığın şeydir." - Wernher von Braun
“Kendi yolunu çizen kişi, kimsenin izinden gitmez.” – Nietzsche
Kim İslâm’da güzel bir çığır açarsa (güzel bir alışkanlık başlatırsa), onun sevabı ve kendisinden sonra ona uyanların sevapları, onların sevaplarından hiçbir şey eksilmeksizin ona da yazılır.
erdemtr55 taydin erdemtr55 wrote on taydin's profile.
Merhaba Taydin bey,
Gruba spms serisi yapıcak mısınız?
ben 3 sargılı toroid ile 2 adet flyback sürücek bir devre yapmayı düşünüyorum.size soracak sorularım vardı?
Back
Top