A SoftPOS alkalmazás csomagnevei#
A kérést mindig a környezetnek megfelelő csomagnak kell címezni:
| Környezet | Csomagnév |
|---|---|
| Éles | com.paynance.sideapp.release |
| Teszt | com.paynance.sideapp.test |
Android 11-től a hívó alkalmazásnak deklarálnia kell, hogy látja ezeket a csomagokat. E nélkül a hívás hibaüzenet nélkül nem indul el:
<queries>
<package android:name="com.paynance.sideapp.release" />
<package android:name="com.paynance.sideapp.test" />
</queries>Deeplink küldése a SoftPOS alkalmazásnak#
A SoftPOS alkalmazást a következő módon lehet meghívni deeplink kéréssel:
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(
"paynance://sideapp/gateway" +
"?ownerAppPackage=eu.paynance.softpos.tester" +
"&ownerAppDeepLinkCallback=softpos-tester://gateway" +
"&sessionId=92e6e172-b3b2-4a94-bf77-0c868f4e32ba" +
"&sourceCode=ST3295L22322755KXC7LNFQ5S" +
"&terminalId=52CDD12E-3DDF-4C73-A037-673124E9D03A" +
"&cashRegisterId=CashRegisterId" +
"&amount=12000" +
"¤cyCode=348" +
"&merchantReference=some-reference" +
"&customerTrns=some-reference" +
"&tipAmount=2000" +
"&action=sale"
))
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)A deeplink kérés válaszának fogadása#
A válasz egy ACTION_SEND típusú, text/json MIME-típusú intentben érkezik, amelyet a SoftPOS alkalmazás közvetlenül a kérésben megadott ownerAppPackage csomagnak címez. A teljes válasz JSON-ként az Intent.EXTRA_TEXT extrában található.
A fogadó alkalmazásnak ezt az intent-filtert kell deklarálnia az AndroidManifest.xml fájlban:
<activity
android:name="com.example.URLResponseActivity"
android:label="Payment Result"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/json"/>
</intent-filter>
</activity>A válasz kiolvasása:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
handleResult(intent)
}
// Ha az Activity singleTop vagy singleTask módban fut
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
handleResult(intent)
}
private fun handleResult(intent: Intent) {
val payload = intent.getStringExtra(Intent.EXTRA_TEXT) ?: return
val message = JSONObject(payload).getJSONObject("message")
val eventId = message.getInt("eventId")
if (eventId == 0) {
// sikeres tranzakció
} else {
// hiba - a részleteket a message mező tartalmazza
}
}A válasz felépítése#
Minden válasz egy burokba van csomagolva. A tranzakció adatai a message objektumon belül találhatók, nem a JSON gyökerében:
{
"ownerAppPackage": "com.example.app",
"ownerAppDeepLinkCallback": "app://callback",
"message": {
...
}
}A burok ownerAppPackage és ownerAppDeepLinkCallback kulcsai csak akkor szerepelnek a válaszban, ha a kérés is tartalmazta őket – üres értékkel nem kerülnek bele.
Általános szabályok
- A hiányzó értékek helyén a
"---"szöveg szerepel, nemnull, és a kulcs sem marad ki. - A
currencyCodea válaszban mindig numerikus ISO 4217 kód (348vagy978), akkor is, ha a kérésben betűkóddal érkezett. - Az értékek típusosak: a
successlogikai érték, azeventId,currencyCode,amountéstipAmountszám. - A tranzakció kimenetelét az
eventIdmező hordozza – erre érdemes ágazni.
Az eventId mező lehetséges értékei
0– Sikeres tranzakció1000– A felhasználó megszakította a tranzakciót1007– A kártya elutasította a tranzakciót1016– Megszakadt tranzakció1099– Általános tranzakciós hiba1100– SZÉP-kártyás fizetés nem elérhető ezen a terminálon
Kártyás fizetési kérelem
A kereskedői alkalmazás a sale deeplink segítségével átadja a vezérlést a SoftPOS alkalmazásnak, hogy a vásárló bankkártyás fizetést tudjon végrehajtani.
Kérés
| Mező | Kötelező | Leírás | Példa |
|---|---|---|---|
ownerAppPackage | Igen | A kérést indító alkalmazás csomagazonosítója. Az alkalmazás ide küldi vissza az eredményt; e nélkül a kérés feldolgozatlanul elvész | com.example.app |
action | Igen | A kérés típusa | sale |
amount | Igen | Engedélyezendő összeg (fillérben, tizedesjegy nélkül) | 1170 |
sessionId | Ajánlott | Tranzakció-session azonosító (UUID formátumban). Egyedinek kell lennie, és változatlanul visszaérkezik a válaszban | 4bdebe62-c211-4ca0-a994-b2fbea2061c5 |
merchantReference | Ajánlott | Szabad szöveges hivatkozás, amit a kereskedő használhat referenciaként | some-reference |
currencyCode | Nem | A pénznem ISO 4217 szerinti kódja. Numerikus (348, 978) és betűkód (HUF, EUR) is elfogadott. Hiányzó vagy ismeretlen érték esetén HUF | 348 |
currency | Nem | A currencyCode mező alternatív neve, azonos működéssel | HUF |
tipAmount | Nem | Kívánt borravaló összege (fillérben). Alapértelmezett értéke 0 | 0 |
cashRegisterId | Nem | Pénztárazonosító (kereskedő által beállított érték). Visszaérkezik a válaszban | XDE384678UY |
customerTrns | Nem | Szabad szöveges hivatkozás, amit a vásárló használhat referenciaként | some-reference |
sourceCode | Nem | Üzletazonosító. Ha hiányzik, a terminálon éppen bejelentkezett üzlet | ST3295L22322755KXC7LNFQ5S |
terminalId | Nem | Terminálazonosító. Visszaérkezik a válaszban | S1F2-000158232325691 |
ownerAppDeepLinkCallback | Nem | Visszaérkezik a válasz burkában. A válasz kézbesítését nem befolyásolja, az mindig az ownerAppPackage csomagnak megy | app://callback |
Válasz
| Mező | Leírás | Példa |
|---|---|---|
success | Jelzi a sikeres engedélyezési eredményt | true |
eventId | A tranzakció kimenetelét azonosító kód | 0 |
message | Az eredmény szöveges leírása | Transaction successful |
type | A tranzakció típusa | Payment |
terminalId | Terminálazonosító (terminál sorozatszáma) | S1F2-000158232325691 |
authorizationId | Engedélyezési azonosító | 123456 |
primaryAccountNumberMasked | Maszkolt kártyaszám | 541333 **** 9999 |
applicationLabel | Kártyatípus címkéje | mc |
transactionDateTime | Tranzakció dátuma és ideje ISO 8601 formátumban | 2022-03-11T17:34:58.016Z |
sessionId | A kérésben megadott session-azonosító | 4bdebe62-c211-4ca0-a994-b2fbea2061c5 |
parentSessionId | Kártyás fizetésnél mindig --- | --- |
tipAmount | Borravaló összege fillérben | 50 |
cashRegisterId | Pénztárazonosító | XDE384678UY |
currencyCode | A pénznem ISO 4217 szerinti számkódja | 348 |
customerTrns | Vásárlói hivatkozás | some-reference |
merchantReference | Kereskedői hivatkozás | some-reference |
amount | A ténylegesen engedélyezett összeg fillérben, a borravalóval együtt | 1220 |
result | A tranzakció eredménye | Success |
errorCondition | A hiba oka, ha volt. Sikeres tranzakciónál --- | Refusal |
pspReference | A tranzakció egyedi azonosítója a fizetési szolgáltatónál. Ezzel az értékkel indítható később hivatkozott visszatérítés | ddaac9a6801569996b49cb36562d3549 |
Példa sikeres válaszra
{
"ownerAppPackage": "com.example.app",
"ownerAppDeepLinkCallback": "app://callback",
"message": {
"success": true,
"eventId": 0,
"message": "Transaction successful",
"type": "Payment",
"terminalId": "S1F2-000158232325691",
"authorizationId": "123456",
"primaryAccountNumberMasked": "541333 **** 9999",
"applicationLabel": "mc",
"transactionDateTime": "2022-03-11T17:34:58.016Z",
"sessionId": "4bdebe62-c211-4ca0-a994-b2fbea2061c5",
"parentSessionId": "---",
"tipAmount": 50,
"cashRegisterId": "XDE384678UY",
"currencyCode": 348,
"customerTrns": "some-reference",
"merchantReference": "some-reference",
"amount": 1220,
"result": "Success",
"errorCondition": "---",
"pspReference": "ddaac9a6801569996b49cb36562d3549"
}
}Kártyás fizetés visszatérítési kérelem
A kereskedői alkalmazás a card-refund deeplink segítségével indíthat visszatérítést. Kétféle visszatérítés létezik:
- Hivatkozott visszatérítés: a kérés tartalmazza az eredeti tranzakció PSP-referenciáját a
transactionReferencevagypspReferencemezőben. Az alkalmazás az eredeti tranzakcióhoz köti a jóváírást. - Hivatkozás nélküli visszatérítés: ha egyik mező sincs megadva, az alkalmazás önálló visszatérítést indít, amelyhez a vásárlónak oda kell érintenie a kártyáját.
Kérés
| Mező | Kötelező | Leírás | Példa |
|---|---|---|---|
ownerAppPackage | Igen | A kérést indító alkalmazás csomagazonosítója | com.example.app |
action | Igen | A kérés típusa | card-refund |
amount | Igen | Visszatérítendő összeg (fillérben) | 1170 |
merchantReference | Igen | Szabad szöveges hivatkozás, amit a kereskedő használhat referenciaként | some-reference |
transactionReferencepspReference | Hivatkozott visszatérítéshez | Az eredeti tranzakció PSP-referenciája, a fizetés válaszának pspReference mezőjéből. A két név egyenértékű | ddaac9a6801569996b49cb36562d3549 |
sessionId | Ajánlott | A visszatérítés saját, egyedi session-azonosítója | 6bddba6a-9812-4773-b1e5-682209c333d4 |
currencyCode | Nem | A pénznem ISO 4217 szerinti kódja, numerikus vagy betűkód. Alapértelmezett értéke HUF | 348 |
cashRegisterId | Nem | Pénztárazonosító. Visszaérkezik a válaszban | XDE384678UY |
terminalId | Nem | Terminálazonosító | S1F2-000158232325691 |
Válasz
A visszatérítés válasza a kártyás fizetésével megegyező mezőket tartalmaz, két eltéréssel: nincs benneparentSessionId, az authorizationId pedig az engedélyezési kód helyett a PSP-referenciát hordozza.
| Mező | Leírás | Példa |
|---|---|---|
success | Jelzi a visszatérítés sikerességét | true |
eventId | A tranzakció kimenetelét azonosító kód | 0 |
message | Az eredmény szöveges leírása | Transaction successful |
type | A tranzakció típusa | Refund |
terminalId | Terminálazonosító | S1F2-000158232325691 |
authorizationId | A visszatérítés PSP-referenciája | VCKZG9XM5F7B6R75 |
primaryAccountNumberMasked | Visszatérítésnél nem elérhető, értéke --- | --- |
applicationLabel | Visszatérítésnél nem elérhető, értéke --- | --- |
transactionDateTime | A visszatérítés dátuma és ideje ISO 8601 formátumban | 2022-03-11T17:34:58.016Z |
sessionId | A kérésben megadott session-azonosító | 6bddba6a-9812-4773-b1e5-682209c333d4 |
tipAmount | Visszatérítésnél mindig 0 | 0 |
cashRegisterId | Pénztárazonosító | XDE384678UY |
currencyCode | A pénznem ISO 4217 szerinti számkódja | 348 |
customerTrns | Visszatérítésnél nem elérhető, értéke --- | --- |
merchantReference | Kereskedői hivatkozás | some-reference |
amount | A visszatérített összeg fillérben | 1170 |
result | A tranzakció eredménye | Success |
errorCondition | A hiba oka, ha volt. Sikeres tranzakciónál --- | --- |
pspReference | A visszatérítés egyedi azonosítója a fizetési szolgáltatónál | VCKZG9XM5F7B6R75 |
SZÉP-kártyás fizetési kérelem
A kereskedői alkalmazás a szep-card-sale deeplink segítségével átadja a vezérlést a SoftPOS alkalmazásnak, hogy a vásárló SZÉP-kártyás fizetést tudjon végrehajtani. Az alkalmazás a szepértéket is elfogadja, azonos működéssel.
Kérés
| Mező | Kötelező | Alapértelmezett érték | Leírás |
|---|---|---|---|
ownerAppPackage | Igen | – | A kérést indító alkalmazás csomagazonosítója |
action | Igen | – | A kérés típusa: szep-card-sale vagy szep |
amount | Igen | – | Tranzakció összege fillérben |
provider | Igen | – | Fizetési szolgáltató. Hiányzó vagy ismeretlen érték esetén az alkalmazás elutasítja a kérést |
merchantReference | Ajánlott | – | Kereskedő által megadott szabad szöveges hivatkozás |
sessionId | Ajánlott | – | Tranzakció-session azonosító. Ha hiányzik, az alkalmazás a merchantReference értékét használja |
currency | Nem | HUF | Tranzakció pénzneme. A currencyCode név is elfogadott |
cashRegisterId | Nem | – | Pénztárazonosító (kereskedő által beállított érték) |
sourceCode | Nem | A bejelentkezett üzlet | Üzletazonosító |
A provider mező lehetséges értékei
RawKHBSZEP– K&HRawMBHSZEP– MBHRawOTPSZEP– OTP
Válasz
A SZÉP-kártyás fizetés válasza eltér a kártyás fizetésétől: nincs benne eventId éstype mező, az állapotot a status mező hordozza, az amount pedig szöveges értékként érkezik.
| Mező | Leírás | Példa |
|---|---|---|
success | Jelzi a kérés sikerességét | true |
status | A fizetés állapota | SUCCESSFUL |
message | A fizetés állapota szövegesen, a status mezővel megegyező érték | SUCCESSFUL |
amount | A fizetés összege fillérben, szöveges értékként | "50000" |
paymentReference | A fizetés egyedi azonosítója | ddaac9a6801569996b49cb36562d3549 |
sessionId | A fizetés azonosítója, a paymentReference mezővel megegyező érték | ddaac9a6801569996b49cb36562d3549 |
merchantReference | Kereskedő által megadott szabad szöveges hivatkozás | some-reference |
name | A kereskedő neve | Kalács Bt. |
address | A bolt címe | 8000 Székesfehérvár Kossuth utca 3. |
terminalId | A terminál azonosítója | S1F2-000158232325691 |
requestDateTime | A kérés időpontja ISO 8601 formátumban | 2025-09-24T09:07:08.882Z |
transactionDateTime | A tranzakció időpontja ISO 8601 formátumban | 2025-09-24T09:07:08.882Z |
A status mező lehetséges értékei
SUCCESSFUL– Sikeres tranzakcióCANCELED– Megszakított tranzakcióTIMEOUT– Időtúllépés miatt megszakított tranzakcióERROR– Hibás tranzakció
Elutasított SZÉP-kártyás kérés
Ha a terminál nem tudja kiszolgálni a SZÉP-kártyás kérést, az alkalmazás nem a fenti válaszalakot küldi, hanem a kártyás fizetéssel megegyező mezőkészletet, eventId: 1100 értékkel. Az elutasítás okát amessage mező tartalmazza:
| message | Ok |
|---|---|
szep_provider_missing | A provider mező hiányzik vagy ismeretlen értéket tartalmaz |
szep_disabled | A SZÉP-kártyás fizetés ki van kapcsolva az üzletnél |
szep_provider_not_enabled | Az üzlet nem engedélyezte az adott szolgáltatót |
Az elutasított kérés sessionId-ja újra felhasználható: az ok megszüntetése után ugyanazzal az azonosítóval megismételhető a kérés.
Példa sikeres válaszra
{
"ownerAppPackage": "com.example.app",
"ownerAppDeepLinkCallback": "app://callback",
"message": {
"success": true,
"status": "SUCCESSFUL",
"message": "SUCCESSFUL",
"amount": "50000",
"paymentReference": "ddaac9a6801569996b49cb36562d3549",
"sessionId": "ddaac9a6801569996b49cb36562d3549",
"merchantReference": "some-reference",
"name": "Kalács Bt.",
"address": "8000 Székesfehérvár Kossuth utca 3.",
"terminalId": "S1F2-000158232325691",
"requestDateTime": "2025-09-24T09:07:08.882Z",
"transactionDateTime": "2025-09-24T09:07:08.882Z"
}
}Hibakeresés#
| Tünet | Lehetséges ok |
|---|---|
| A SoftPOS alkalmazás el sem indul | Hiányzó <queries> blokk a hívó alkalmazás manifestjében, vagy nem a környezetnek megfelelő csomagnév |
| A fizetés lefut, de válasz nem érkezik | A fogadó activityn hiányzik az ACTION_SEND + text/json intent-filter, vagy nincs android:exported="true" megadva |
| A válasz megérkezik, de minden mező üres | A feldolgozás a JSON gyökeréből olvas; a tranzakció adatai a message objektumban vannak |
| A hívásra nem történik semmi | Hiányzó ownerAppPackage vagy amount paraméter, illetve nem számként értelmezhető amount |
| A megismételt kérés nem indít tranzakciót | Az adott sessionId már feldolgozás alatt áll, vagy az elmúlt 2 órában lezárult. Új tranzakcióhoz új sessionId szükséges |
| Böngészőből vagy WebView-ból indított link nem nyílik meg | A deeplink alkalmazásból indítva működik. Böngészőből történő indítás nem támogatott |