SDK Typescript
1 Przyklad uzycia SDK (Typescript)
Work in progress! - Draft [WIP]
- uzupełnić o &sig=
1.1 Implementator (dostawca / sklep / uslugodawca) i inicjalizacja platnosci
Przygotowanie instancji dla rejestru pay.wdft.ovh
const ps = new PaymentStandard("https://pay.wdft.ovh");
const providers = await ps.providers();
Przykładowy set z providers w odpowiedzi:
[
{
id: "bank-tst",
name: "bank testowy",
prettyName: "Bank Testowy S.A.",
logo: "https://pay.wdft.ovh/assets/test-bank/logo.png",
platforms: ["android", "ios"],
},
]
Generowanie linku platniczego
const paymentLink = ps.createPaymentLink({
provider_id: "bank-tst",
payment_id: "my-unique-payment-id",
transfer_amount: "1.12",
transfer_currency: "PLN",
transfer_description: "Demo payment for article",
receiver_name: "Gazeta Wyborna S.A.",
receiver_address: "ul. Wyspiańska 10, 00-001 Warszawa",
receiver_country: "PL",
payload: "",
receiver_iban: "PL22294000000000000000000000",
// In this case pay.wdft.ovh is not an role as registry! it's our saas payment provider here you need to implement this endpoint
webhook_confirm_url: "https://pay.wdft.ovh/webhook/:status",
});
Następnie parsujemy link
const parsed = new URL(paymentLink);
Link ten w oparciu o konfiguracje aplikacji bankowej zostanie uruchomiony przez “aplikacje bankowa”
https://pay.wdft.ovh/pay/wdft?wh=https%3A%2F%2Fpay.wdft.ovh%2Fwebhook%2F%3Astatus%3Fprovider_id%3Dsample-provider-id-from-registry%26payment_id%3Dsample-id%26payload%3D%26transfer_amount%3D1000.00%26transfer_currency%3DPLN%26transfer_description%3DDemo%2Bpayment%2Bfor%2Barticle%26receiver_name%3DWDFT%2BPSA%26receiver_address%3Dul.%2BWyspian%25CC%2581ska%2B10%252C%2B00-001%2BWarszawa%26receiver_country%3DPL%26receiver_iban%3DPL22294000000000000000000000
Możemy też z niego wygenerować kod QR dla płatności
W momencie kliknięcia zostaniemy przekierowani na aplikację. W przypadku braku aplikacji na stronę placeholder.
1.2 Bank
W momencie kiedy użytkownik przechodzi do aplikacji bankowej, bank musi:
- odczytać parametry
- zwalidować sumę kontrolną [WIP]
- uzupełnić templatkę
- potwierdzić operację (UI) - complete
- potwierdzić operację (Backend) - confirm
1.2.1 Applikacja bankowa
Bank w momencie uruchomienia parsuej dane tj. poprzez pobranie paremtru wh
:
const webhookCallbackUrl = parsed.searchParams.get("wh")!;
Rozparsowywując link
https://pay.wdft.ovh/webhook/:status?provider_id=sample-provider-id-from-registry&payment_id=sample-id&payload=&transfer_amount=1000.00&transfer_currency=PLN&transfer_description=Demo+payment+for+article&receiver_name=WDFT+PSA&receiver_address=ul.+Wyspiańska+10,+00-001+Warszawa&receiver_country=PL&receiver_iban=PL22294000000000000000000000
Uzyskujemy parametry:
[
[ "transfer_amount", "1000.00" ],
[ "transfer_currency", "PLN" ],
[ "transfer_description", "Demo payment for article" ],
[ "receiver_name", "WDFT PSA" ],
[ "receiver_address", "ul. Wyspiańska 10, 00-001 Warszawa" ],
[ "receiver_country", "PL" ],
[ "receiver_iban", "PL22294000000000000000000000" ]
]
W momencie wykonania przelewu w aplikacji bankowej, Bank generuje wygnature w oparciu o klucz “complete” (kliencki) i robi call na payment link tj.
:status
zostaje zastapiony complete
a nastepnie obliczona jest sygnatura zgodnie z kluczem
i podczas callu dodanie x-pay-signature
await ps.complete(webhookCallbackUrl, "client-secret");
albo odrzuca, :status zostaje zastapiony “reject”
await ps.reject(webhookCallbackUrl, "client-secret");
1.2.2 Backend bankowy
Bank w momencie dopisania transakcji do tablicy elixir już bez możliwości wycofania transakcji przez użytkownika zatwierdza ją.
:status
zostaje zastapiony confirm
a nastepnie obliczona jest sygnatura zgodnie z kluczem
i podczas callu dodanie x-pay-signature
await ps.confirm(webhookCallbackUrl, "backend-secret");
1.3 Impelmentator (dostawca / sklep / uslugodawca)
W momencie kiedy, sprzedawca otrzymuje webhook na /webhook/:status
w body otrzymuje encoded_url
oraz w naglowki x-pay-signature
Implementator robi “verify” w rejestrze w ktorym inicjalizowal “payment link”
const data = await ps.verifySignatureAndDecode(request.url, request.headers['x-pay-signature'])
W zaleznosci od :status
:
- confirmed - przelew zlecony, nie moze zostac wycofany, mozna wysylac towar,
- completed - ui bankowe przeszlo, przelew zlecony, mozna udostepnic tanie “tresci” online,
- rejected - odrzucona przez usera, niezrealizowana
W przypadku braku otrzymania webhook - timeout do 5 minut, nie przetwarzac.