Мне поручено создать программу, которая может инициировать платеж на карточном терминале Ingenico. Это меньшая часть более крупного проекта по созданию собственной POS-системы для бизнеса. Но я сталкиваюсь с множеством препятствий, затрудняющих эту проблему.
У меня нет опыта программирования с последовательными портами. Документация, которую я нашел в Интернете, содержит только записи строк или байтов. Примеры просты, но не дают мне достаточно информации.
Нет документации для устройства, которое я использую. Ingenico не предоставляет эту информацию. Единственный способ выяснить, какие данные ожидает от читателя карты инициирование платежа, - это уже завершенный проект на github. Вот ссылка
https://github.com/Ousret/pyTeliumManager
Эта реализация в python и использует систему на основе linux. Мы бы использовали это, но нам нужна более индивидуальная реализация, поэтому я делаю это в java.
Я посмотрел и посмотрел в этом проекте, чтобы найти, как данные структурированы и затем отправляются через соединение через последовательный порт, но в этот момент я пропускаю их из-за незнания. Я совсем не знаком с python, и единственное, что я знаю, это то, что данные для инициирования платежа следующие ...
число с плавающей запятой для суммы транзакции
три строки, одна для типа валюты (доллары США, евро и c), способ оплаты (карта) и идентификатор кассы (может быть любым, для личного учета)
и три логических значения: одно, если вы хотите дождаться подтверждения транзакции, одно, если вы хотите получить подтверждение банка, и одно, если вы хотите, чтобы информация о платеже была сохранена. (Я установил все это в ложь, так как в данный момент они не нужны. Я просто пытаюсь написать что-то, что работает как доказательство концепции, прежде чем создавать интерфейс)
Теперь, Вот часть моего тестового кода, и большая часть этого похожа на то, что я нашел в inte rnet в моем исследовании.
public static void main(String[] args) {
SerialPort cerealPort = new SerialPort("COM9");
try {
System.out.println("Port opened: " + cerealPort.openPort());
System.out.println("reading bytes " + cerealPort.readBytes());
System.out.println("name " + cerealPort.getPortName());
cerealPort.writeString("bing bong");
//cerealPort.setEventsMask(256);
System.out.println("Params setted: " + cerealPort.setParams(9600, 8, 1, 0));
System.out.println("\"Hello World!!!\" successfully writen to port: " + cerealPort.writeBytes("Hello World!!!".getBytes()));
System.out.println("Port closed: " + cerealPort.closePort());
}
catch (SerialPortException ex){
System.out.println(ex);
}
}
}
Этот код действительно ничего не делает и был просто чтобы проверить, что связь с устройством работает правильно. Обратите внимание, что при запуске этого кода на терминале ничего не происходит.
Теперь у меня есть класс с именем TelliumData, в котором содержатся описанные мной члены данных.
public class TelliumData {
float amount;
String paymentMode = "debit";
String currency = "USD";
String checkoutId = "1";
boolean transactionWait = false; // waits for trans to end. Set to True if you need valid transaction status otherwise, set it to False.
boolean collectPaymentInfo = false;
boolean forceBankVerify = false;
}
У меня есть 0 идей, как передать эту информацию в терминал, используя функции из JSS C
Мой вопрос, по сути, как мне отправить эти данные через последовательный порт?
Я пытался использовать .writebytes и .writeint для отправки всех данных по одному, но это ничего не делает и не вызывает инициализацию платежа на устройстве чтения карт.
I не понимаю, как реализация python сделала это тоже. Было бы здорово, если бы кто-то мог объяснить, как эти данные упаковываются и отправляются.