Przejdź do głównej zawartości

BLIK Level 0

BLIK Level 0 to bezpośrednia integracja, w której klient wpisuje 6-cyfrowy kod BLIK bezpośrednio na Twojej stronie, bez przekierowania do zewnętrznej bramki płatności. Zapewnia to płynniejsze doświadczenie użytkownika.

Jak działa BLIK Level 0?

W przeciwieństwie do standardowej integracji (Simple Gateway), klient nie jest przekierowywany - cały proces odbywa się na Twojej stronie.

Wymagania

  • Aktywny Punkt Płatności z włączoną obsługą BLIK
  • Formularz na stronie do wprowadzenia kodu BLIK
  • 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

Parametry zapytania

Zapytanie jest analogiczne do standardowej rejestracji płatności, z dodatkowymi polami specyficznymi dla BLIK:

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

Generowanie checksum

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

sha256({service}|{SecretHash}|{value}|{url_success}|{url_fail}|{url_ipn})

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"
}'

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'], // Kod z formularza
'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 processBlikPayment(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'],
}
);

return response.data;
}

Odpowiedź API

Sukces - płatność oczekuje na potwierdzenie

{
"error": false,
"msg": "Waiting for BLIK confirmation",
"status": "PENDING",
"transactionId": "abc-def-123-456"
}

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

Sprawdzanie statusu transakcji

Oprócz oczekiwania na powiadomienie IPN, możesz aktywnie odpytywać API dpay o aktualny status transakcji (polling). Jest to przydatne np. gdy chcesz na bieżąco aktualizować interfejs użytkownika.

Endpoint

POST https://panel.dpay.pl/api/v1/pbl/details
Content-Type: application/json

Parametry

PoleTypOpis
servicestringNazwa serwisu z panelu
transaction_idstringID transakcji otrzymane przy rejestracji
checksumstringSuma kontrolna SHA-256

Generowanie checksum

sha256({service}|{transaction_id}|{SecretHash})

Przykład odpowiedzi

{
"transaction": {
"id": "abc-def-123-456",
"status": "paid",
"value": "29.99",
"created_at": "2026-03-15T12:00:00Z"
}
}

Możliwe statusy

StatusOpis
createdTransakcja utworzona, oczekuje na potwierdzenie
processingTransakcja w trakcie przetwarzania
paidPłatność zakończona sukcesem
canceledTransakcja anulowana
wskazówka

Zalecamy odpytywanie co 2-3 sekundy, maksymalnie przez 2 minuty. Po tym czasie kod BLIK wygasa.

Pełna dokumentacja endpointu dostępna jest w API Reference - Transaction Details.

Błąd - nieprawidłowy kod BLIK

{
"error": true,
"msg": "Transaction canceled",
"status": false,
"transactionId": "42191111-A7AE-392E-8C09-7965C1DC6B0B",
"additionalInfo": {
"error": "ER_WRONG_TICKET",
"error_description": null
}
}

Obsługa błędów

Kod błęduOpisDziałanie
ER_WRONG_TICKETNieprawidłowy lub wygasły kod BLIKPoproś klienta o nowy kod
ER_USER_DECLINEDKlient odrzucił transakcję w aplikacjiPoproś o ponowną próbę
ER_TIMEOUTPrzekroczono czas oczekiwania na potwierdzeniePoproś o nowy kod
ER_INSUFFICIENT_FUNDSBrak wystarczających środkówPoinformuj klienta

Przykład formularza BLIK (frontend)

<form id="blik-form">
<label for="blik-code">Kod BLIK</label>
<input
type="text"
id="blik-code"
name="blik_code"
maxlength="6"
pattern="[0-9]{6}"
inputmode="numeric"
placeholder="______"
required
/>
<button type="submit">Zapłać</button>
</form>

<div id="blik-status" style="display: none;">
<p>Potwierdź płatność w aplikacji bankowej...</p>
</div>

<script>
document.getElementById('blik-form').addEventListener('submit', async (e) => {
e.preventDefault();

const blikCode = document.getElementById('blik-code').value;

// Pokaż komunikat o oczekiwaniu
document.getElementById('blik-form').style.display = 'none';
document.getElementById('blik-status').style.display = 'block';

const response = await fetch('/api/pay/blik', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ blik_code: blikCode }),
});

const result = await response.json();

if (result.error) {
alert('Błąd: ' + result.msg);
document.getElementById('blik-form').style.display = 'block';
document.getElementById('blik-status').style.display = 'none';
}
// Czekaj na IPN - status płatności zmieni się po potwierdzeniu
});
</script>

Walidacja kodu BLIK

Kod BLIK to zawsze dokładnie 6 cyfr. Waliduj go po stronie klienta i serwera:

// Walidacja po stronie serwera
if (!preg_match('/^\d{6}$/', $blikCode)) {
http_response_code(400);
echo json_encode(['error' => 'Kod BLIK musi składać się z 6 cyfr']);
exit;
}
Ważność kodu BLIK

Kod BLIK jest ważny przez 2 minuty od momentu wygenerowania w aplikacji bankowej. Upewnij się, że formularz na Twojej stronie informuje klienta o konieczności szybkiego wpisania kodu.