Интеграция приложения с POSfix
Ваше приложение работает на том же Android-терминале, что и POSfix, и отправляет ему команды: продажу, оплату картой, Z-отчёт. POSfix выполняет фискальную и банковскую часть, а затем возвращает вам результат. Его экран не открывается.
Эта страница — для разработчиков, которые пишут приложение. Что вы передаёте в каждой команде, описано в Справочнике команд.
Что умеет ваше приложение
- Фискальная продажа с оплатой наличными, картой или MIA QR. POSfix отправляет чек в SFS и печатает его.
- Внесение и выдача наличных с сервисным чеком.
- X-отчёт и Z-отчёт. При Z закрывается и банковский день карточного терминала.
- Отмена и возврат оплаты картой.
- Копия чека, список продаж, сводка фискального дня.
- Каталог: товары, категории, ставки НДС, кассиры.
- Клиент программы лояльности: вы находите его по телефону или карте, а продажа начисляет ему баллы.
Чего оно не делает
- Не выдаёт чек возврата. В протоколе SFS (ACPS) есть только фискальный чек, сервисный чек и отчёт. Деньги вы возвращаете через
card.voidилиcard.refund, а возврат товара остаётся за рамками интеграции. - Не оплачивает бонусами программы лояльности и не применяет вознаграждения. Пока оно только идентифицирует клиента и начисляет ему баллы.
- Не активирует терминал. Активация выполняется один раз, на экране POSfix.
Единственный шаг на терминале: активация
Установите POSfix и активируйте его один раз, на его экране, кодом, который создаётся в Control Panel при назначении терминала. Дальше ничего настраивать не нужно: ни ключей, ни подтверждений, ни входа кассира.
Активация — это и лицензия. Пока терминал активирован, любое приложение на нём может отправлять команды. Если вы деактивируете его в Control Panel, POSfix начнёт отклонять команды с кодом TERMINAL_NOT_ACTIVATED после следующего соединения с сервером.
Как работают два приложения
- Ваше приложение привязывается к сервису POSfix. Если POSfix не был запущен, Android запускает его без экрана.
- Оно отправляет команду в виде JSON: имя команды, её данные и уникальный ключ.
- POSfix выполняет её тем же кодом, что и экран кассы: чек получается точно таким же, как выданный кассиром.
- Результат приходит обратно в callback, один раз.
Связь идёт через Android (Binder), а не через сеть. Android сообщает POSfix, какое приложение отправляет команду, и пакет этого приложения попадает в журнал запросов терминала.
После первой команды POSfix остаётся запущенным в фоне. Он сам запускается после перезагрузки терминала и после обновления, а в панели уведомлений появляется «POSfix».
Быстрый старт
1. Добавьте SDK. В settings.gradle.kts:
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven { url = uri("https://docs.posfix.md/sdk/maven") }
}
}
В build.gradle.kts приложения:
dependencies {
implementation("md.posfix:posfix-integration-sdk:1.0.0")
}
SDK требует Android 7.0 (API 24) или новее. Он сам добавляет в ваш манифест объявление <queries> для md.posfix.posfix, которого требует Android 11+, так что дописывать ничего не нужно.
2. Подключитесь.
val posfix = PosfixClient(context)
posfix.connect(object : PosfixClient.ConnectionListener {
override fun onConnected(apiVersion: Int) {
// готово к командам
}
override fun onDisconnected(reason: String) {
// POSfix остановился; выполняемые команды получают POSFIX_DISCONNECTED,
// а SDK сам заново привязывается к нему
}
})
3. Проверьте терминал.
posfix.execute("status") { response ->
val data = response.getJSONObject("data")
data.getBoolean("activated") // false = активируйте POSfix на его экране
}
4. Выдайте первый чек. Кофе за 25 леев, оплата наличными:
val sale = JSONObject("""
{
"items": [ { "name": "Cafea", "unitPrice": 25.00, "quantity": 1, "vatCode": "B" } ],
"payments": [ { "type": "1", "amount": 25.00 } ],
"amountReceived": 25.00,
"printReceipt": true
}
""")
val key = PosfixClient.newIdempotencyKey() // сохраните его, пока не узнаете результат
val sent = posfix.execute("sale.create", sale, key) { response ->
if (response.getBoolean("success")) {
val receipt = response.getJSONObject("data").getInt("receiptNumber")
} else {
val code = response.getJSONObject("error").getString("code")
}
}
Все callback-и приходят в главном потоке. execute сразу возвращает sent.requestId — он нужен, чтобы остановить продажу через cancel.
Для оплаты картой укажите "type": "2", и POSfix откроет платёжный экран банка. Подробности — в разделе Оплата картой, события и сбои.
Flutter, React Native и тестовое приложение
SDK работает и из Android-части приложения на Flutter или React Native. Интерфейс AIDL напрямую — для тех, кто не хочет зависеть от SDK: см. раздел «Без SDK» в Справочнике команд.
Исходный код SDK поставляется вместе с пакетом Maven. Демо-приложение с кнопками для всех команд можно получить по запросу на info@m-373.com.