Przejdź do głównej zawartości

BLIK OneClick

BLIK OneClick umożliwia płatności jednym kliknięciem - bez konieczności wpisywania 6-cyfrowego kodu BLIK przy kolejnych transakcjach. Klient rejestruje alias bankowy podczas pierwszej płatności, a następnie płaci jednym kliknięciem.

Korzyści

  • Szybsze płatności - brak kodu T6 przy kolejnych transakcjach
  • Wyższa konwersja - mniej kroków w procesie płatności
  • Wygoda klienta - płatność jednym kliknięciem

Jak działa BLIK OneClick?

Proces składa się z dwóch etapów:

  1. Rejestracja aliasu - pierwsza płatność z kodem BLIK i zgodą na zapisanie aliasu
  2. Płatność aliasem - kolejne płatności bez kodu BLIK

Wymagania

  • Aktywny Punkt Płatności z włączoną obsługą BLIK OneClick
  • Możliwość przechowywania alias_value po stronie serwera (powiązanego z kontem klienta)
  • Dostęp do adresu IP i User-Agent klienta (wymagane przez regulacje)

Endpoint

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

Rejestracja aliasu (pierwsza płatność)

Podczas pierwszej płatności klient wpisuje kod BLIK i wyraża zgodę na zapisanie aliasu. Zapytanie jest analogiczne do BLIK Level 0, z dodatkowym polem register_blik_alias.

Parametry zapytania

PoleTypWymaganeOpis
transactionTypestringTak"transfers"
servicestringTakNazwa serwisu z panelu
valuestringTakKwota w PLN
url_successstringTakURL po udanej płatności
url_failstringTakURL po nieudanej płatności
url_ipnstringTakURL do powiadomień IPN
checksumstringTakSuma kontrolna SHA-256
blik_codestringTak6-cyfrowy kod BLIK
user_ipstringTakAdres IP klienta
user_agentstringTakNagłówek User-Agent klienta
register_blik_aliasobjectTakDane aliasu do rejestracji
alias_ipn_urlstringNieAdres URL do powiadomień o zmianach statusu aliasu (max 500 znaków); gdy pominięty, powiadomienia trafiają na url_ipn

Obiekt register_blik_alias

PoleTypWymaganeOpis
labelstringTakEtykieta aliasu widoczna dla klienta (max 50 znaków)
typestringTakTyp aliasu - musi być "UID"
valuestringNieWłasna wartość aliasu (max 128 znaków). Gdy pominięta, dpay generuje wartość automatycznie

Generowanie checksum

Checksum generowany jest identycznie jak dla standardowej płatności:

sha256({service}|{SecretHash}|{value}|{url_success}|{url_fail}|{url_ipn})
Rekomendacja: podaj własną wartość aliasu

Zalecamy przekazanie własnej wartości w register_blik_alias.value (np. identyfikatora wygenerowanego po Twojej stronie) i zapisanie jej po stronie serwera w powiązaniu z kontem klienta - będzie potrzebna do kolejnych płatności aliasem oraz do sprawdzania jego statusu przez POST /blik/aliases. Gdy pole pominiesz, wartość zostanie wygenerowana automatycznie po stronie dpay.

Przykład zapytania

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...",
"blik_code": "123456",
"user_ip": "192.168.1.100",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"register_blik_alias": {
"label": "Mój sklep",
"type": "UID"
}
}'

PHP

<?php
$service = getenv('DPAY_SERVICE');
$secretHash = getenv('DPAY_SECRET_HASH');

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

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

$payload = json_encode([
'transactionType' => 'transfers',
'service' => $service,
'value' => $value,
'url_success' => $urlSuccess,
'url_fail' => $urlFail,
'url_ipn' => $urlIpn,
'checksum' => $checksum,
'blik_code' => $_POST['blik_code'],
'user_ip' => $_SERVER['REMOTE_ADDR'],
'user_agent' => $_SERVER['HTTP_USER_AGENT'],
'register_blik_alias' => [
'label' => 'Mój sklep',
'type' => 'UID',
],
]);

$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);
curl_close($ch);

$result = json_decode($response, true);

JavaScript (Node.js / Express)

const crypto = require('crypto');
const axios = require('axios');

async function registerBlikAlias(req, res) {
const service = process.env.DPAY_SERVICE;
const secretHash = process.env.DPAY_SECRET_HASH;

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}|${secretHash}|${value}|${urlSuccess}|${urlFail}|${urlIpn}`)
.digest('hex');

const response = await axios.post(
'https://api-payments.dpay.pl/api/v1_0/payments/register',
{
transactionType: 'transfers',
service,
value,
url_success: urlSuccess,
url_fail: urlFail,
url_ipn: urlIpn,
checksum,
blik_code: req.body.blik_code,
user_ip: req.ip,
user_agent: req.headers['user-agent'],
register_blik_alias: {
label: 'Mój sklep',
type: 'UID',
},
}
);

return response.data;
}

Odpowiedź API

{
"error": false,
"msg": "Internal processing",
"status": true,
"transactionId": "abc-def-123-456"
}

Pole status jest wartością logiczną (true/false).

Po otrzymaniu tego statusu, klient musi potwierdzić transakcję oraz rejestrację aliasu w swojej aplikacji bankowej. Wynik płatności otrzymasz przez IPN.

Płatność aliasem (OneClick)

Przy kolejnych płatnościach klient nie musi wpisywać kodu BLIK. Zamiast tego wystarczy przekazać zapisany alias_value.

Parametry zapytania

PoleTypWymaganeOpis
transactionTypestringTak"transfers"
servicestringTakNazwa serwisu z panelu
valuestringTakKwota w PLN
url_successstringTakURL po udanej płatności
url_failstringTakURL po nieudanej płatności
url_ipnstringTakURL do powiadomień IPN
checksumstringTakSuma kontrolna SHA-256
blik_aliasstringTakAlias BLIK OneClick (max 128 znaków)
user_ipstringTakAdres IP klienta
user_agentstringTakNagłówek User-Agent klienta
ostrzeżenie

Nie przekazuj blik_code ani register_blik_alias przy płatności aliasem - pole blik_alias wyklucza się z oboma. Para blik_code + register_blik_alias jest natomiast poprawna i wymagana przy rejestracji aliasu (pierwsza płatność).

Przykład zapytania

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...",
"blik_alias": "a1b2c3d4e5f6...",
"user_ip": "192.168.1.100",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}'

PHP

<?php
$service = getenv('DPAY_SERVICE');
$secretHash = getenv('DPAY_SECRET_HASH');

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

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

// $aliasValue - zapisany wcześniej alias klienta
$payload = json_encode([
'transactionType' => 'transfers',
'service' => $service,
'value' => $value,
'url_success' => $urlSuccess,
'url_fail' => $urlFail,
'url_ipn' => $urlIpn,
'checksum' => $checksum,
'blik_alias' => $aliasValue,
'user_ip' => $_SERVER['REMOTE_ADDR'],
'user_agent' => $_SERVER['HTTP_USER_AGENT'],
]);

$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);
curl_close($ch);

$result = json_decode($response, true);

JavaScript (Node.js / Express)

const crypto = require('crypto');
const axios = require('axios');

async function payWithBlikAlias(req, res) {
const service = process.env.DPAY_SERVICE;
const secretHash = process.env.DPAY_SECRET_HASH;

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}|${secretHash}|${value}|${urlSuccess}|${urlFail}|${urlIpn}`)
.digest('hex');

// aliasValue - zapisany wcześniej alias klienta
const aliasValue = await getUserBlikAlias(req.user.id);

const response = await axios.post(
'https://api-payments.dpay.pl/api/v1_0/payments/register',
{
transactionType: 'transfers',
service,
value,
url_success: urlSuccess,
url_fail: urlFail,
url_ipn: urlIpn,
checksum,
blik_alias: aliasValue,
user_ip: req.ip,
user_agent: req.headers['user-agent'],
}
);

return response.data;
}

Odpowiedź API

{
"error": false,
"msg": "Internal processing",
"status": true,
"transactionId": "abc-def-123-456"
}

Pole status jest wartością logiczną (true/false).

Klient może zostać poproszony o potwierdzenie transakcji w aplikacji bankowej (zależy od ustawień banku). Wynik płatności otrzymasz przez IPN.

Zarządzanie aliasami

Pobieranie aliasów

Sprawdź zarejestrowane aliasy BLIK dla danego klienta.

Endpoint

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

Parametry

PoleTypWymaganeOpis
servicestringTakNazwa serwisu z panelu
alias_valuestringTakWartość aliasu
alias_typestringNieTyp aliasu (domyślnie "UID")
checksumstringTakSuma kontrolna SHA-256

Generowanie checksum

sha256({service}|{secret}|{alias_value})

Przykład zapytania

curl -X POST https://api-payments.dpay.pl/api/v1_0/payments/blik/aliases \
-H "Content-Type: application/json" \
-d '{
"service": "abc123",
"alias_value": "a1b2c3d4e5f6...",
"alias_type": "UID",
"checksum": "f5a3b2c1d0..."
}'

Odpowiedź

Pole data jest pojedynczym obiektem opisującym alias:

{
"status": "success",
"data": {
"alias_value": "a1b2c3d4e5f6...",
"alias_type": "UID",
"status": "ACTIVE",
"expiration_date": "2027-03-22",
"apps": [
{ "key": "app1", "label": "Aplikacja banku" }
]
}
}
PoleTypOpis
alias_valuestring|nullWartość aliasu
alias_typestringZawsze "UID"
statusstring|nullAktualny status aliasu, np. "ACTIVE", "INACTIVE", "UNREGISTERED", "EXPIRED"
expiration_datestring|nullData wygaśnięcia aliasu
appsarrayLista aplikacji bankowych powiązanych z aliasem: { key, label }

Wyrejestrowanie aliasu

Usuń zarejestrowany alias BLIK.

Endpoint

POST https://api-payments.dpay.pl/api/v1_0/payments/blik/aliases/unregister
Content-Type: application/json

Parametry

PoleTypWymaganeOpis
servicestringTakNazwa serwisu z panelu
alias_valuestringTakWartość aliasu do wyrejestrowania
alias_typestringTakTyp aliasu ("UID")
reasonstringNiePowód wyrejestrowania
checksumstringTakSuma kontrolna SHA-256

Generowanie checksum

sha256({service}|{secret}|{alias_value})

Przykład zapytania

curl -X POST https://api-payments.dpay.pl/api/v1_0/payments/blik/aliases/unregister \
-H "Content-Type: application/json" \
-d '{
"service": "abc123",
"alias_value": "a1b2c3d4e5f6...",
"alias_type": "UID",
"reason": "Klient poprosił o usunięcie",
"checksum": "f5a3b2c1d0..."
}'

Odpowiedź

{
"status": "success",
"data": {
"status": "success"
}
}

Powiadomienia o aliasie (IPN)

dpay.pl wysyła powiadomienie IPN typu alias_update na endpoint merchanta przy każdej zmianie statusu aliasu - rejestracji, wyrejestrowaniu lub wygaśnięciu.

Adres powiadomienia

Powiadomienie wysyłane jest na adres alias_ipn_url podany przy rejestracji transakcji. Jeśli nie został podany, używany jest url_ipn.

Schemat powiadomienia

dpay.pl wysyła zapytanie POST z nagłówkiem Content-Type: application/json i następującym ciałem:

{
"id": "abc-def-123-456",
"type": "alias_update",
"change_type": "ALIAS_REGISTER",
"alias_type": "UID",
"alias_status": "ACTIVE",
"alias_key": "a1b2c3d4e5f6...",
"alias_label": "Moja karta",
"alias_expire_at": "2027-01-01T00:00:00+00:00",
"change_reason_category": null,
"change_reason_message": null,
"version": 1,
"signature": "e3b0c44298fc..."
}

Opis pól

PoleTypOpis
idstringIdentyfikator transakcji dpay.pl
typestringTyp powiadomienia - zawsze "alias_update"
change_typestring|nullTyp zmiany: "ALIAS_REGISTER", "ALIAS_UPDATE", "ALIAS_UNREGISTER", "ALIAS_EXPIRED", "ALIAS_DECLINED", "SCA_REJECTED"
alias_typestring|nullTyp aliasu (np. "UID")
alias_statusstring|nullAktualny status aliasu: "ACTIVE", "INACTIVE", "UNREGISTERED", "EXPIRED", "DECLINED", "SCA_REJECTED"
alias_keystring|nullIdentyfikator aliasu - ta sama wartość, której używasz jako alias_value przy kolejnych płatnościach
alias_labelstring|nullEtykieta aliasu (może być pusta, jeśli nie nadano etykiety)
alias_expire_atstring|nullData wygaśnięcia aliasu w formacie ISO 8601 (może być pusta)
change_reason_categorystring|nullKategoria przyczyny zmiany
change_reason_messagestring|nullOpis przyczyny zmiany
versionintegerWersja schematu (aktualnie 1)
signaturestringPodpis cyfrowy do weryfikacji autentyczności
Identyfikacja aliasu

Pole alias_key niesie identyfikator aliasu (równy alias_value używanemu przy płatnościach) - możesz po nim skorelować powiadomienie z zapisanym aliasem. Dodatkowo transakcję inicjującą wskazuje pole id. Aktualny status i datę wygaśnięcia aliasu możesz w każdej chwili pobrać wywołaniem POST /blik/aliases.

Weryfikacja podpisu

Podpis generowany jest algorytmem SHA-256:

sha256({id}{SecretHash}{type}{version})

Bez separatora - wartości są konkatenowane bezpośrednio, identycznie jak w standardowym podpisie IPN.

PHP

<?php
$data = json_decode(file_get_contents('php://input'), true);

if (!$data || $data['type'] !== 'alias_update') {
http_response_code(400);
exit;
}

$secretHash = 'TWOJ_SECRET_HASH';

$expectedSignature = hash('sha256',
$data['id'] . $secretHash . $data['type'] . $data['version']
);

if (!hash_equals($expectedSignature, $data['signature'])) {
http_response_code(403);
echo 'Invalid signature';
exit;
}

// Podpis prawidłowy - obsłuż zmianę aliasu
// Alias skorelujesz po alias_key (= Twój alias_value) lub po transakcji $data['id']
switch ($data['change_type']) {
case 'ALIAS_REGISTER':
// Alias zarejestrowany - oznacz alias klienta jako aktywny
break;
case 'ALIAS_UPDATE':
// Zmiana danych aliasu - odśwież status przez POST /blik/aliases
break;
case 'ALIAS_UNREGISTER':
// Alias wyrejestrowany - usuń z bazy
break;
case 'ALIAS_EXPIRED':
// Alias wygasł - oznacz jako nieaktywny
break;
case 'ALIAS_DECLINED':
case 'SCA_REJECTED':
// Rejestracja odrzucona przez klienta lub bank - usuń alias
break;
}

http_response_code(200);
echo 'OK';

Node.js

const crypto = require('crypto');

app.post('/api/alias-ipn', (req, res) => {
const data = req.body;

if (!data || data.type !== 'alias_update') {
return res.status(400).send('Invalid payload');
}

const secretHash = 'TWOJ_SECRET_HASH';
const expectedSignature = crypto
.createHash('sha256')
.update(`${data.id}${secretHash}${data.type}${data.version}`)
.digest('hex');

if (expectedSignature !== data.signature) {
return res.status(403).send('Invalid signature');
}

// Podpis prawidłowy - obsłuż zmianę aliasu
// Alias skorelujesz po alias_key (= Twój alias_value) lub po transakcji data.id
switch (data.change_type) {
case 'ALIAS_REGISTER':
// Alias zarejestrowany - oznacz alias klienta jako aktywny
break;
case 'ALIAS_UPDATE':
// Zmiana danych aliasu - odśwież status przez POST /blik/aliases
break;
case 'ALIAS_UNREGISTER':
// Alias wyrejestrowany - usuń z bazy
break;
case 'ALIAS_EXPIRED':
// Alias wygasł - oznacz jako nieaktywny
break;
case 'ALIAS_DECLINED':
case 'SCA_REJECTED':
// Rejestracja odrzucona przez klienta lub bank - usuń alias
break;
}

res.status(200).send('OK');
});

Mechanizm ponawiania

Mechanizm jest identyczny jak dla standardowych powiadomień IPN:

PróbaOpóźnienieCzas od pierwszej próby
1natychmiast0 min
22 min2 min
34 min6 min
48 min14 min
516 min30 min
632 min~1 h
764 min~2 h
8128 min~4 h
9256 min~8.5 h
10512 min~17 h

Twój endpoint musi odpowiedzieć kodem HTTP 200 i treścią "OK". W przeciwnym razie dpay.pl ponowi próbę dostarczenia.

Idempotentność

Twój endpoint może otrzymać wiele powiadomień o tym samym aliasie. Upewnij się, że obsługa jest idempotentna - wielokrotne przetworzenie tego samego powiadomienia nie powinno powodować błędów ani duplikatów.

Walidacja i ograniczenia

RegułaOpis
Wykluczanie pólblik_alias nie może wystąpić razem z blik_code ani register_blik_alias. Para blik_code + register_blik_alias jest poprawna (rejestracja aliasu)
register_blik_alias.labelMaksymalnie 50 znaków
register_blik_alias.typeMusi być "UID"
register_blik_alias.valueOpcjonalne, maksymalnie 128 znaków
alias_valueMaksymalnie 128 znaków
blik_codeDokładnie 6 cyfr

Limity zapytań

EndpointLimit
POST /payments/register120 zapytań/min
POST /blik/aliases60 zapytań/min
POST /blik/aliases/unregister30 zapytań/min

Obsługa błędów

Gdy płatność zostanie odrzucona, odpowiedź rejestracji ma postać {"error": true, "msg": "Transaction canceled", "status": false, ...}, a kod błędu znajdziesz w polu additionalInfo.error (z opcjonalnym opisem w additionalInfo.error_description).

W trybie testowym (sandbox) występują następujące kody symulacji:

Kod błęduOpisDziałanie
DECLINETransakcja odrzuconaPoproś o ponowną próbę
EXPIRED_CARDInstrument płatniczy wygasłPoinformuj klienta
INSUFFICIENT_FUNDSBrak wystarczających środkówPoinformuj klienta
USER_DECLINEDKlient odrzucił transakcję w aplikacjiPoproś o ponowną próbę
TIMEOUTPrzekroczono czas oczekiwania na potwierdzeniePoproś o nowy kod
ALIAS_NOT_FOUNDAlias nie został znalezionyZarejestruj nowy alias lub użyj kodu BLIK
SYSTEM_ERRORBłąd systemuPonów próbę później

W produkcji pole additionalInfo.error zawiera surowy kod odmowy systemu BLIK (przekazywany 1:1) lub jeden z kodów:

Kod błęduOpisDziałanie
ALIAS_NOT_FOUNDAlias nie został znalezionyZarejestruj nowy alias lub użyj kodu BLIK
ALIAS_APP_NOT_FOUNDWskazana aplikacja bankowa nie jest powiązana z aliasemPobierz listę aplikacji przez POST /blik/aliases
ALIAS_APP_AMBIGUOUSAlias powiązany z wieloma aplikacjami - wymagany wybórPozwól klientowi wybrać aplikację z listy apps
INTERNAL_ERRORBłąd wewnętrznyPonów próbę później
wskazówka

Jeśli alias wygasł lub został wyrejestrowany przez klienta w aplikacji bankowej, wykonaj ponowną rejestrację aliasu podczas następnej płatności z kodem BLIK.