> For the complete documentation index, see [llms.txt](https://docs.nevogate.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.nevogate.com/egyszeri-fizetesek-one-time-payment/nativ-mobiltarca/kesobbi-terheles-ketlepcsos-fizetes/apple-pay-fizetesi-folyamat.md).

# Apple Pay fizetési folyamat

A fizetési folyamat leírását négy részre bontottuk a könnyebb átláthatóság miatt. Az elválasztás alapját a kereskedő boltjából indított négy fő lépés adja, ezek a lépések a következők:

A. **`InitWallet`** - a kereskedői munkamenet hitelesítése és a kétlépcsős tranzakció inicializálása\
B. **`StartWallet`** - a fizetési token átadása és a kétlépcsős tranzakció indítása\
C. **`Result`** - a kétlépcsős tranzakció eredményének lekérése rendszerünkből\
D. **`Close`** - a kétlépcsős tranzakció lezárása

{% hint style="info" %}
Az A, B és C lépések együttesen adják ki a vásárló jelenlétében történő fizetési folyamatot, ami a tranzakciós összeg befoglalásával végződik.

A D lépés az első három lépést követően később is elvégezhető, de ennek hatására fejeződik be a tranzakció terheléssel, vagy a befoglalt összeg feloldásával.

A felsorolt pontok egy sikeres fizetési folyamatot írnak le.
{% endhint %}

#### **A. `InitWallet` - a kereskedői munkamenet hitelesítése és a kétlépcsős tranzakció inicializálása**

1. A kereskedő oldala az Apple Pay elérhetőségének ellenőrzése után megjeleníti az Apple Pay gombot,
2. ezután a vásárló megnyomja a gombot.
3. A kereskedő oldala létrehozza az Apple Pay munkamenetet a rendelés összegével és devizanemével.
4. A munkamenet `onvalidatemerchant` eseményének hatására a kereskedő oldala elküldi a kereskedő szerverének a fizetési oldal címét és az esemény `validationURL` értékét.
5. A kereskedő szervere új, kétlépcsős mobiltárcás fizetési tranzakciót kezdeményez rendszerünkben (`InitWallet`), az `AutoCommit` paraméter `false` értékével.
6. Rendszerünk hitelesíti a beérkezett kérést (autentikáció),
7. ezután rendszerünk egy egyedi tranzakció azonosítót (`TransactionId`) és az Apple Pay kereskedői munkamenetének adatait küldi vissza a kereskedő szerverének (sikeres hitelesítés esetén).
8. A kereskedő szervere tárolja az egyedi tranzakció azonosítót, a munkamenet adatait pedig változatlanul visszaadja a kereskedő oldalának.
9. A kereskedő oldala a kapott munkamenet adatokkal lezárja a kereskedői munkamenet hitelesítését (`session.completeMerchantValidation()`).

Az inicializálás során a natív fizetési módot a `Wallet.Type` paraméter (`apple_pay`), a kliens típusát a `Wallet.Environment` paraméter (`web`), a fizetési oldal címét pedig a `Wallet.ShopUrl` paraméter jelöli. Mindkét fizetési szolgáltatónál át kell adni az `onvalidatemerchant` esemény `validationURL` értékét is (`Wallet.ValidationUrl`).

{% hint style="info" %}
SimplePay esetén az inicializálás során a fizetési szolgáltatónál is létrejön a tranzakció. Barion Smart Gateway esetén ekkor kizárólag a kereskedői munkamenet hitelesítése történik meg, a szolgáltatói fizetési tranzakció a tranzakció indításakor (`StartWallet`) jön létre.
{% endhint %}

{% hint style="warning" %}
Az inicializálásra és a tranzakció indítására a kereskedő szerver oldalán kerüljön sor. Biztonsági okokból a **hitelesítési adatok nem kerülhetnek a böngészőbe**, a rendelés összegét, devizanemét és a kiválasztott fizetési szolgáltatót pedig szerver oldalon ellenőrizze.
{% endhint %}

#### **B. `StartWallet` - a fizetési token átadása és a kétlépcsős tranzakció indítása**

1. A vásárló jóváhagyja a fizetést az Apple Pay felületén,
2. ezután a kereskedő oldala az `onpaymentauthorized` eseményből kapott teljes fizetési tokent (`event.payment.token`) elküldi a kereskedő szerverének.
3. A kereskedő szervere a tárolt tranzakció azonosítóval és a fizetési tokennel (`Wallet.Token`) elindítja a tranzakciót rendszerünkben (`StartWallet`).
4. Rendszerünk ellenőrzi a tranzakció azonosítót és továbbítja a fizetési tokent a fizetési szolgáltatónak (sikeres ellenőrzés esetén), majd megtörténik a **tranzakció összegének befoglalása**,
5. ezután rendszerünk megválaszolja a befoglalás eredményét a kereskedő szerverének.
6. A kereskedő szervere az eredményt visszaadja a kereskedő oldalának.
7. A kereskedő oldala a kapott válasz alapján lezárja az Apple Pay felületét (`completePayment()`), hiba esetén sikertelen eredményt jelezve a vásárlónak.
8. Ha a válasz nem üres visszairányítási URL címet (`RedirectUrl`) tartalmaz, a kereskedő oldala erre a címre irányítja a vásárló böngészőjét.
9. Rendszerünk a fizetési szolgáltatótól kapott eredmény alapján beállítja a tranzakció státuszát. Az eredmény a fizetési szolgáltatótól függően aszinkron módon is megérkezhet.
10. Rendszerünk a tranzakció státuszának beállítását követően aszinkron módon meghívja az inicializáció (`InitWallet`) során átadott `NotificationUrl` címet is.

{% hint style="warning" %}
A **B.2.** lépésben a teljes `event.payment.token` objektumot továbbítsa, ne csak annak `paymentData` mezőjét. A fizetési szolgáltató felé szükséges Base64-kódolást rendszerünk végzi el.
{% endhint %}

{% hint style="info" %}
Ha a vásárló a fizetési token létrejötte előtt megszakítja a munkamenetet, ne indítsa el a tranzakciót. Új fizetési kísérlethez új Apple Pay munkamenetet és új tranzakciót hozzon létre.
{% endhint %}

#### **C. `Result` - a kétlépcsős tranzakció eredményének lekérése rendszerünkből**

1. A kereskedő szervere a `ResponseUrl` és `NotificationUrl` hívás hatására egy tranzakció azonosítót tartalmazó `Result` kéréssel lekérdezi a befoglalás eredményét rendszerünkből.
2. Rendszerünk ellenőrzi a tranzakció azonosítót,
3. ezután rendszerünk megválaszolja a befoglalás státuszát a kereskedő szerverének (sikeres ellenőrzés esetén).
4. A kereskedő szervere tárolja a befoglalás státuszát, majd a kereskedő oldala értesíti a vásárlót a tranzakció eredményéről.

{% hint style="warning" %}
Figyeljen arra, hogy minden `NotificationUrl` hívást követően is indítson egy `Result` kérést rendszerünk felé.
{% endhint %}

{% hint style="info" %}
A tranzakció indítására (`StartWallet`) kapott `SUCCESSFUL` eredménykód a kérés sikeres feldolgozását jelzi, nem a befoglalás sikerességét. SimplePay esetén a végleges eredmény aszinkron módon is megérkezhet, ezért a függőben lévő tranzakciót a kereskedő felületén folyamatban lévő fizetésként jelezze. Apple Pay fizetés esetén a folyamat nem tartalmaz külön tranzakció befejezése (`CompleteWallet`) lépést.
{% endhint %}

**D. `Close` - a kétlépcsős tranzakció lezárása**

1. A kereskedő kezdeményezi a tranzakció lezárását a tranzakció azonosító segítségével (`TransactionId`) és a lezárás módjának megadásával, mely lehet:\
   • a teljes befoglalt összeg terhelése\
   • a befoglalt összeg részterhelése (és a maradék összeg feloldása)\
   • a teljes befoglalt összeg feloldása
2. Rendszerünk hitelesíti a beérkezett kérést, majd továbbítja azt a fizetési szolgáltató felé, aki végrehajtja a tranzakció lezárását.
3. Ezután rendszerünk megválaszolja a lezárás eredményét a kereskedő szerverének (sikeres hitelesítés esetén).
4. A kereskedő szervere tárolja a kapott választ és értesíti a vásárlót a tranzakció eredményéről.
