SoftPOS deeplink dokumentáció

A SoftPOS alkalmazás csomagnevei#

A kérést mindig a környezetnek megfelelő csomagnak kell címezni:

KörnyezetCsomagnév
Élescom.paynance.sideapp.release
Tesztcom.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>

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" +
        "&currencyCode=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, nem null, és a kulcs sem marad ki.
  • A currencyCode a válaszban mindig numerikus ISO 4217 kód (348 vagy978), akkor is, ha a kérésben betűkóddal érkezett.
  • Az értékek típusosak: a success logikai érték, az eventId,currencyCode, amount és tipAmount szám.
  • A tranzakció kimenetelét az eventId mező hordozza – erre érdemes ágazni.

Az eventId mező lehetséges értékei

  • 0 – Sikeres tranzakció
  • 1000 – A felhasználó megszakította a tranzakciót
  • 1007 – A kártya elutasította a tranzakciót
  • 1016 – Megszakadt tranzakció
  • 1099 – Általános tranzakciós hiba
  • 1100 – 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ásPélda
ownerAppPackageIgenA 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észcom.example.app
actionIgenA kérés típusasale
amountIgenEngedélyezendő összeg (fillérben, tizedesjegy nélkül)1170
sessionIdAjánlottTranzakció-session azonosító (UUID formátumban). Egyedinek kell lennie, és változatlanul visszaérkezik a válaszban4bdebe62-c211-4ca0-a994-b2fbea2061c5
merchantReferenceAjánlottSzabad szöveges hivatkozás, amit a kereskedő használhat referenciakéntsome-reference
currencyCodeNemA 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 HUF348
currencyNemA currencyCode mező alternatív neve, azonos működésselHUF
tipAmountNemKívánt borravaló összege (fillérben). Alapértelmezett értéke 00
cashRegisterIdNemPénztárazonosító (kereskedő által beállított érték). Visszaérkezik a válaszbanXDE384678UY
customerTrnsNemSzabad szöveges hivatkozás, amit a vásárló használhat referenciakéntsome-reference
sourceCodeNemÜzletazonosító. Ha hiányzik, a terminálon éppen bejelentkezett üzletST3295L22322755KXC7LNFQ5S
terminalIdNemTerminálazonosító. Visszaérkezik a válaszbanS1F2-000158232325691
ownerAppDeepLinkCallbackNemVisszaérkezik a válasz burkában. A válasz kézbesítését nem befolyásolja, az mindig az ownerAppPackage csomagnak megyapp://callback

Válasz

MezőLeírásPélda
successJelzi a sikeres engedélyezési eredményttrue
eventIdA tranzakció kimenetelét azonosító kód0
messageAz eredmény szöveges leírásaTransaction successful
typeA tranzakció típusaPayment
terminalIdTerminálazonosító (terminál sorozatszáma)S1F2-000158232325691
authorizationIdEngedélyezési azonosító123456
primaryAccountNumberMaskedMaszkolt kártyaszám541333 **** 9999
applicationLabelKártyatípus címkéjemc
transactionDateTimeTranzakció dátuma és ideje ISO 8601 formátumban2022-03-11T17:34:58.016Z
sessionIdA kérésben megadott session-azonosító4bdebe62-c211-4ca0-a994-b2fbea2061c5
parentSessionIdKártyás fizetésnél mindig ------
tipAmountBorravaló összege fillérben50
cashRegisterIdPénztárazonosítóXDE384678UY
currencyCodeA pénznem ISO 4217 szerinti számkódja348
customerTrnsVásárlói hivatkozássome-reference
merchantReferenceKereskedői hivatkozássome-reference
amountA ténylegesen engedélyezett összeg fillérben, a borravalóval együtt1220
resultA tranzakció eredményeSuccess
errorConditionA hiba oka, ha volt. Sikeres tranzakciónál ---Refusal
pspReferenceA 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ésddaac9a6801569996b49cb36562d3549

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 atransactionReference vagy pspReference mező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ásPélda
ownerAppPackageIgenA kérést indító alkalmazás csomagazonosítójacom.example.app
actionIgenA kérés típusacard-refund
amountIgenVisszatérítendő összeg (fillérben)1170
merchantReferenceIgenSzabad szöveges hivatkozás, amit a kereskedő használhat referenciakéntsome-reference
transactionReference
pspReference
Hivatkozott visszatérítéshezAz 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
sessionIdAjánlottA visszatérítés saját, egyedi session-azonosítója6bddba6a-9812-4773-b1e5-682209c333d4
currencyCodeNemA pénznem ISO 4217 szerinti kódja, numerikus vagy betűkód. Alapértelmezett értéke HUF348
cashRegisterIdNemPénztárazonosító. Visszaérkezik a válaszbanXDE384678UY
terminalIdNemTerminá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ásPélda
successJelzi a visszatérítés sikerességéttrue
eventIdA tranzakció kimenetelét azonosító kód0
messageAz eredmény szöveges leírásaTransaction successful
typeA tranzakció típusaRefund
terminalIdTerminálazonosítóS1F2-000158232325691
authorizationIdA visszatérítés PSP-referenciájaVCKZG9XM5F7B6R75
primaryAccountNumberMaskedVisszatérítésnél nem elérhető, értéke ------
applicationLabelVisszatérítésnél nem elérhető, értéke ------
transactionDateTimeA visszatérítés dátuma és ideje ISO 8601 formátumban2022-03-11T17:34:58.016Z
sessionIdA kérésben megadott session-azonosító6bddba6a-9812-4773-b1e5-682209c333d4
tipAmountVisszatérítésnél mindig 00
cashRegisterIdPénztárazonosítóXDE384678UY
currencyCodeA pénznem ISO 4217 szerinti számkódja348
customerTrnsVisszatérítésnél nem elérhető, értéke ------
merchantReferenceKereskedői hivatkozássome-reference
amountA visszatérített összeg fillérben1170
resultA tranzakció eredményeSuccess
errorConditionA hiba oka, ha volt. Sikeres tranzakciónál ------
pspReferenceA visszatérítés egyedi azonosítója a fizetési szolgáltatónálVCKZG9XM5F7B6R75
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ékLeírás
ownerAppPackageIgen–A kérést indító alkalmazás csomagazonosítója
actionIgen–A kérés típusa: szep-card-sale vagy szep
amountIgen–Tranzakció összege fillérben
providerIgen–Fizetési szolgáltató. Hiányzó vagy ismeretlen érték esetén az alkalmazás elutasítja a kérést
merchantReferenceAjánlott–Kereskedő által megadott szabad szöveges hivatkozás
sessionIdAjánlott–Tranzakció-session azonosító. Ha hiányzik, az alkalmazás a merchantReference értékét használja
currencyNemHUFTranzakció pénzneme. A currencyCode név is elfogadott
cashRegisterIdNem–Pénztárazonosító (kereskedő által beállított érték)
sourceCodeNemA bejelentkezett üzletÜzletazonosító

A provider mező lehetséges értékei

  • RawKHBSZEP – K&H
  • RawMBHSZEP – MBH
  • RawOTPSZEP – 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ásPélda
successJelzi a kérés sikerességéttrue
statusA fizetés állapotaSUCCESSFUL
messageA fizetés állapota szövegesen, a status mezővel megegyező értékSUCCESSFUL
amountA fizetés összege fillérben, szöveges értékként"50000"
paymentReferenceA fizetés egyedi azonosítójaddaac9a6801569996b49cb36562d3549
sessionIdA fizetés azonosítója, a paymentReference mezővel megegyező értékddaac9a6801569996b49cb36562d3549
merchantReferenceKereskedő által megadott szabad szöveges hivatkozássome-reference
nameA kereskedő neveKalács Bt.
addressA bolt címe8000 Székesfehérvár Kossuth utca 3.
terminalIdA terminál azonosítójaS1F2-000158232325691
requestDateTimeA kérés időpontja ISO 8601 formátumban2025-09-24T09:07:08.882Z
transactionDateTimeA tranzakció időpontja ISO 8601 formátumban2025-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:

messageOk
szep_provider_missingA provider mező hiányzik vagy ismeretlen értéket tartalmaz
szep_disabledA SZÉP-kártyás fizetés ki van kapcsolva az üzletnél
szep_provider_not_enabledAz ü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ünetLehetséges ok
A SoftPOS alkalmazás el sem indulHiá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 érkezikA 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ő üresA feldolgozás a JSON gyökeréből olvas; a tranzakció adatai a message objektumban vannak
A hívásra nem történik semmiHiányzó ownerAppPackage vagy amount paraméter, illetve nem számként értelmezhető amount
A megismételt kérés nem indít tranzakciótAz 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 megA deeplink alkalmazásból indítva működik. Böngészőből történő indítás nem támogatott