Przejdź do głównej zawartości

Rejestracja transakcji

Ten przewodnik przeprowadzi Cię krok po kroku przez proces rejestracji transakcji za pomocą API dpay.pl. Wykorzystamy najprostszą metodę integracji - Simple Gateway (przekierowanie do bramki płatności).

Wymagania wstępne

Przed rozpoczęciem upewnij się, że masz:

Schemat działania

POST/api/v1_0/payments/registerPełny kontrakt rejestracji: parametry, checksum i kody błędów.Pełny kontrakt w API Reference

Krok 1: Przygotowanie danych

Zbierz wymagane dane do zapytania:

Parametry wymagane

PoleTypOpisPrzykład
servicestringNazwa serwisu z panelu (alternatywnie name)"abc123"
transactionTypestringTyp transakcji"transfers"
valuestringKwota (0.01-999999.99, z kropką dziesiętną)"29.99"
url_successstringURL po udanej płatności"https://mojsklep.pl/sukces"
url_failstringURL po nieudanej płatności"https://mojsklep.pl/blad"
url_ipnstringURL do powiadomień IPN"https://mojsklep.pl/api/ipn"
checksumstringSuma kontrolna SHA-256(patrz niżej)

Parametry opcjonalne

PoleTypOpis
channelstringKonkretny kanał płatności (patrz zależności niżej)
emailstringAdres e-mail klienta (wymagany, gdy podasz channel)
client_namestringImię klienta (wymagane, gdy podasz channel)
client_surnamestringNazwisko klienta (wymagane, gdy podasz channel)
accept_tosbooleanPotwierdzenie akceptacji regulaminu przez klienta (wymagane, gdy podasz channel)
blik_codestringKod BLIK - 6 cyfr (dla płatności BLIK Level 0), wymaga user_ip i user_agent
blik_aliasstringAlias BLIK OneClick (max 128 znaków, wymaga user_ip i user_agent)
register_blik_aliasobjectRejestracja aliasu BLIK OneClick (label, type) - wymaga blik_code, user_ip, user_agent
register_blik_recurring_aliasobjectRejestracja aliasu płatności cyklicznych BLIK (typ PAYID; m.in. label, type, model, frequency, limity kwotowe, daty ważności) - wymaga blik_code, user_ip, user_agent. Usługa włączana per serwis - patrz Płatności cykliczne BLIK
register_card_recurringobjectRejestracja mandatu płatności cyklicznych kartą (label + opcjonalne frequency, limity, daty) - patrz Płatności cykliczne kartą
card_recurring_aliasstringAlias mandatu kartowego do obciążenia cyklicznego (max 128 znaków) - patrz Płatności cykliczne kartą
authorize_onlybooleanPre-autoryzacja na zapisanym tokenie zamiast obciążenia (używane z card_recurring_alias) - patrz Płatności cykliczne kartą
alias_ipn_urlstringURL do powiadomień o zmianach statusu aliasu (max 500 znaków)
no_delaybooleanTylko płatności cykliczne BLIK: false pozwala operatorowi BLIK wstrzymać transakcję do 72 h w oczekiwaniu na potwierdzenie klienta w aplikacji. Domyślnie true (odpowiedź natychmiastowa). Wartość false wymaga włączenia opcji dla serwisu
descriptionstringOpis transakcji
customstringWłasne dane (np. ID zamówienia)
productsarrayLista produktów
payoutobjectInstrukcja wypłaty 1:1 - kierowanie środków na zweryfikowane konta merchanta (patrz Wypłaty 1:1). Wymaga włączenia opcji dla serwisu.
currency_codestringKod waluty (np. PLN, EUR). Wymagany, gdy podasz phone_number
phone_numberstringNumer telefonu klienta (9-15 znaków)
billing_addressobjectAdres rozliczeniowy klienta (wykorzystywany m.in. przy płatnościach odroczonych)
shipping_addressobjectAdres dostawy (wykorzystywany m.in. przy płatnościach odroczonych)
device_infoobjectDane urządzenia i przeglądarki klienta - wymagany dla transactionType: mb_way_direct (patrz niżej)
user_ipstringAdres IP klienta - wymagany przy blik_code, blik_alias i płatnościach cyklicznych BLIK
user_agentstringUser agent przeglądarki klienta - wymagany przy blik_code, blik_alias i płatnościach cyklicznych BLIK
nobanks0/1Flaga kanałów: ukrycie przelewów bankowych na bramce
paysafecard0/1Flaga kanałów: Paysafecard
creditcard0/1Flaga kanałów: karty płatnicze
paypal0/1Flaga kanałów: PayPal
blik0/1Flaga kanałów: BLIK
installment0/1Flaga kanałów: raty

Zależności parametru channel

ostrzeżenie

Jeśli przekażesz channel, pola email, client_name, client_surname i accept_tos stają się wymagane - ich brak zakończy się błędem walidacji (HTTP 422).

Wartości tester, paypal, installment i paysafecardniedozwolone jako channel.

Obiekt device_info (wymagany dla MB WAY)

Dla transactionType: mb_way_direct obiekt device_info jest wymagany wraz z polami: browserAcceptHeader, browserJavaEnabled (string "true"/"false"), browserLanguage, browserColorDepth, browserScreenHeight, browserScreenWidth, browserTZ (liczby), browserUserAgent, systemFamily, deviceID, applicationName, geoLocalization.

Typy transakcji

TypOpis
transfersPrzelewy bankowe (PBL)
dcb_gatewayDirect Carrier Billing
card_authAutoryzacja karty płatniczej
mb_way_directPłatność MB WAY
bizum_directPłatność Bizum (Hiszpania, EUR)
blik_recurringObciążenie cykliczne BLIK z zarejestrowanego aliasu PAYID (patrz Płatności cykliczne BLIK)
card_recurringObciążenie cykliczne kartą z zarejestrowanego mandatu (patrz Płatności cykliczne kartą)
informacja

Typ transfers to domyślny typ dla prostego przekierowania do bramki płatności (Simple Gateway), gdzie klient sam wybiera metodę płatności.

Krok 2: Generowanie checksum

Checksum to suma kontrolna zapewniająca integralność danych. Generowana jest algorytmem SHA-256 z połączenia pól rozdzielonych znakiem |:

sha256({service}|{hash}|{value}|{url_success}|{url_fail}|{url_ipn})
Normalizacja value

Serwer przed weryfikacją checksum normalizuje value do dwóch miejsc po przecinku (np. 10 staje się 10.00, 9.9 staje się 9.90). Jeśli wysyłasz kwotę w innym formacie, do checksum i tak musisz użyć wartości znormalizowanej - inaczej otrzymasz błąd Invalid checksum. Najprościej: zawsze wysyłaj value już sformatowane do dwóch miejsc.

Przykład w PHP

$service = 'abc123';
$hash = '9a8b7c6d5e4f3a2b1c0d';
$value = '29.99';
$urlSuccess = 'https://mojsklep.pl/sukces';
$urlFail = 'https://mojsklep.pl/blad';
$urlIpn = 'https://mojsklep.pl/api/ipn';

$checksum = hash('sha256',
$service . '|' . $hash . '|' . $value . '|' .
$urlSuccess . '|' . $urlFail . '|' . $urlIpn
);

Przykład w JavaScript (Node.js)

const crypto = require('crypto');

const service = 'abc123';
const hash = '9a8b7c6d5e4f3a2b1c0d';
const value = '29.99';
const urlSuccess = 'https://mojsklep.pl/sukces';
const urlFail = 'https://mojsklep.pl/blad';
const urlIpn = 'https://mojsklep.pl/api/ipn';

const checksum = crypto
.createHash('sha256')
.update(`${service}|${hash}|${value}|${urlSuccess}|${urlFail}|${urlIpn}`)
.digest('hex');

Przykład w Python

import hashlib

service = 'abc123'
hash_key = '9a8b7c6d5e4f3a2b1c0d'
value = '29.99'
url_success = 'https://mojsklep.pl/sukces'
url_fail = 'https://mojsklep.pl/blad'
url_ipn = 'https://mojsklep.pl/api/ipn'

data = f'{service}|{hash_key}|{value}|{url_success}|{url_fail}|{url_ipn}'
checksum = hashlib.sha256(data.encode('utf-8')).hexdigest()

Krok 3: Wysłanie zapytania do API

Wyślij zapytanie POST na endpoint rejestracji płatności:

POST https://api-payments.dpay.pl/api/v1_0/payments/register
Content-Type: application/json

Pełny przykład cURL

curl -X POST https://api-payments.dpay.pl/api/v1_0/payments/register \
-H "Content-Type: application/json" \
-d '{
"transactionType": "transfers",
"service": "abc123",
"value": "29.99",
"url_success": "https://mojsklep.pl/sukces",
"url_fail": "https://mojsklep.pl/blad",
"url_ipn": "https://mojsklep.pl/api/ipn",
"checksum": "e3b0c44298fc1c149afb..."
}'

Przykład w PHP (cURL)

$payload = [
'transactionType' => 'transfers',
'service' => $service,
'value' => $value,
'url_success' => $urlSuccess,
'url_fail' => $urlFail,
'url_ipn' => $urlIpn,
'checksum' => $checksum,
];

$ch = curl_init('https://api-payments.dpay.pl/api/v1_0/payments/register');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
curl_close($ch);

$result = json_decode($response, true);

Krok 4: Obsługa odpowiedzi

API dpay.pl zwraca odpowiedź w formacie JSON:

Odpowiedź sukcesu

{
"error": false,
"msg": "https://secure.dpay.pl/transfer@pay@A75AEBB4-4B89-4834-AD43-EF442C133769",
"status": true,
"transactionId": "A75AEBB4-4B89-4834-AD43-EF442C133769"
}
PoleTypOpis
errorbooleanfalse jeśli zapytanie zostało przetworzone poprawnie
msgstringURL bramki płatności - przekieruj klienta na ten adres
statusbooleantrue przy sukcesie, false przy błędzie
transactionIdstringUnikalny identyfikator transakcji

Odpowiedź sukcesu bez URL bramki - "Internal processing" (HTTP 200)

Dla płatności przetwarzanych w tle bez przekierowania klienta (np. BLIK Level 0, BLIK OneClick, MB WAY) pole msg nie zawiera adresu URL, tylko stały tekst Internal processing:

{
"error": false,
"msg": "Internal processing",
"status": true,
"transactionId": "A75AEBB4-4B89-4834-AD43-EF442C133769"
}

Transakcja czeka na potwierdzenie (np. w aplikacji bankowej klienta). O wyniku dowiesz się z IPN lub odpytując o status transakcji.

Odpowiedź sukcesu - "Transaction paid" (HTTP 200)

Jeśli transakcja została opłacona już w trakcie przetwarzania zapytania (np. natychmiastowe obciążenie z aliasu), odpowiedź zawiera dodatkowo obiekt z danymi transakcji:

{
"error": false,
"msg": "Transaction paid",
"status": true,
"transactionId": "A75AEBB4-4B89-4834-AD43-EF442C133769",
"additionalInfo": {
"transaction": { "...": "dane transakcji" }
}
}

Odpowiedź błędu transakcji (HTTP 200)

Zwracana np. przy nieprawidłowym kodzie BLIK lub anulowanej transakcji:

{
"error": true,
"msg": "Transaction canceled",
"status": false,
"transactionId": "42191111-A7AE-392E-8C09-7965C1DC6B0B",
"additionalInfo": {
"error": "ER_WRONG_TICKET",
"error_description": null
}
}
PoleTypOpis
errorbooleantrue - wystąpił błąd
msgstringOpis błędu
statusbooleanfalse - transakcja nie powiodła się
transactionIdstringIdentyfikator transakcji
additionalInfoobjectOpcjonalne szczegóły błędu (np. kod błędu BLIK)

Błąd po stronie merchanta (HTTP 400)

Zwracany przy błędach po stronie merchanta (nieprawidłowy checksum, wyłączony kanał, nieprawidłowa kwota):

{
"status": "failed",
"message": "Invalid checksum",
"errors": {
"checksum": "Invalid checksum"
}
}
PoleTypOpis
statusstring"failed"
messagestringKonkretny komunikat błędu (np. "Invalid checksum", "Amount is less than 0.01 PLN")
errorsobjectObiekt klucz → komunikat ze szczegółami błędów (np. {"value": "Invalid value"})

Błąd walidacji pól (HTTP 422)

Braki lub złe formaty pól zapytania (np. brak url_success, zły format blik_code, brak email przy podanym channel) zwracane są ze statusem 422 w standardowym formacie:

{
"message": "The url_success field is required.",
"errors": {
"url_success": ["The url_success field is required."]
}
}

W formacie 422 errors to obiekt klucz → tablica komunikatów dla danego pola.

Krok 5: Przekierowanie klienta

Po otrzymaniu odpowiedzi z polem error: false, przekieruj klienta na adres URL zawarty w polu msg:

PHP

if (!$result['error']) {
// Zapisz transactionId w bazie danych
saveTransaction($orderId, $result['transactionId']);

// Przekieruj klienta do bramki płatności
header('Location: ' . $result['msg']);
exit;
} else {
// Obsłuż błąd
echo 'Błąd rejestracji płatności: ' . $result['msg'];
}

JavaScript (Express.js)

if (!result.error) {
// Zapisz transactionId w bazie
await saveTransaction(orderId, result.transactionId);

// Przekieruj klienta
res.redirect(result.msg);
} else {
res.status(400).json({ error: result.msg });
}

Krok 6: Odbieranie IPN

Po zakończeniu płatności dpay.pl wyśle powiadomienie IPN na adres url_ipn. Szczegółowy opis obsługi IPN znajdziesz w przewodniku Obsługa IPN.

Pełny przykład - PHP

<?php
// Konfiguracja
$service = getenv('DPAY_SERVICE');
$hash = getenv('DPAY_HASH');

// Dane zamówienia
$value = '29.99';
$urlSuccess = 'https://mojsklep.pl/sukces';
$urlFail = 'https://mojsklep.pl/blad';
$urlIpn = 'https://mojsklep.pl/api/ipn';

// Generowanie checksum
$checksum = hash('sha256',
$service . '|' . $hash . '|' . $value . '|' .
$urlSuccess . '|' . $urlFail . '|' . $urlIpn
);

// Rejestracja płatności
$payload = json_encode([
'transactionType' => 'transfers',
'service' => $service,
'value' => $value,
'url_success' => $urlSuccess,
'url_fail' => $urlFail,
'url_ipn' => $urlIpn,
'checksum' => $checksum,
]);

$ch = curl_init('https://api-payments.dpay.pl/api/v1_0/payments/register');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

$result = json_decode($response, true);

if ($httpCode === 200 && !$result['error']) {
// Przekieruj klienta do bramki
header('Location: ' . $result['msg']);
exit;
} else {
http_response_code(500);
echo 'Błąd: ' . ($result['msg'] ?? 'Nieznany błąd');
}

Najczęstsze błędy

BłądPrzyczynaRozwiązanie
Invalid checksumNieprawidłowa suma kontrolnaSprawdź kolejność pól, klucz Hash i normalizację value do dwóch miejsc
Service not foundNieznana nazwa serwisuSprawdź pole service w panelu
Amount is less than 0.01 PLNKwota poniżej minimumMinimalna kwota transakcji to 0.01

Co dalej?

  • Obsługa IPN - naucz się odbierać i weryfikować powiadomienia o płatności
  • BLIK Level 0 - zintegruj bezpośrednie płatności BLIK
  • BLIK OneClick - płatności jednym kliknięciem z zapisanym aliasem
  • Karty S2S - dodaj płatności kartowe Server-to-Server