Multibanco (Portugalia)
Akceptacja tego kanału płatności wymaga dodatkowej umowy z agentem rozliczeniowym wskazanym przez dpay.pl.
Multibanco to popularna w Portugalii metoda płatności referencją. Po rejestracji płatności dpay.pl wystawia dane do zapłaty: numer podmiotu (Entidade), numer referencji (Referência) i kwotę. Płatnik płaci nimi w bankomacie Multibanco albo w bankowości internetowej lub mobilnej swojego banku (opcja płatności za usługi i zakupy - Pagamentos de Serviços/Compras).
Wynik płatności jest asynchroniczny. Płatnik może zapłacić od razu, ale też po kilku godzinach lub dniach - aż do upływu terminu ważności referencji. O opłaceniu albo wygaśnięciu referencji dowiesz się z powiadomień, a nie z odpowiedzi na rejestrację.
Schemat działania
- Twój serwer rejestruje płatność z kanałem Multibanco w walucie EUR.
- dpay.pl zwraca dane referencji (obiekt
multibanco) i adres bramki w polumsg. - Przekierowujesz płatnika na bramkę - widzi tam dane do zapłaty, termin ważności i instrukcję.
- Płatnik płaci referencją w bankomacie albo w bankowości.
- dpay.pl potwierdza opłacenie IPN-em i webhookiem
payment.succeeded. Gdy referencja wygaśnie bez zapłaty, wysyła webhookpayment.failedz kodemexpired.
/api/v1_0/payments/registerPełny kontrakt rejestracji płatności: parametry, checksum i kody błędów.Pełny kontrakt w API Reference
Endpoint
POST https://api-payments.dpay.pl/api/v1_0/payments/register
Content-Type: application/json
Endpoint rejestracji płatności obsługuje do 120 zapytań na minutę.
Parametry zapytania
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
transactionType | string | Tak | "transfers" |
service | string | Tak | Nazwa serwisu z panelu |
value | string | Tak | Kwota w EUR (z kropką dziesiętną, np. "10.00") |
currency_code | string | Tak | "EUR" |
channel | string | Tak | "390" - kanał Multibanco |
email | string | Tak (przy channel) | Adres e-mail klienta |
client_name | string | Tak (przy channel) | Imię klienta |
client_surname | string | Tak (przy channel) | Nazwisko klienta |
accept_tos | boolean | Tak (przy channel) | Potwierdzenie akceptacji regulaminu przez klienta |
url_success | string | Tak | URL, na który bramka przekieruje płatnika po opłaceniu |
url_fail | string | Tak | URL, na który bramka przekieruje płatnika po wygaśnięciu referencji |
url_ipn | string | Nie | URL do powiadomień IPN (wysyłanych tylko po opłaceniu) |
checksum | string | Tak | Suma kontrolna SHA-256 |
Podanie pola channel wymaga jednoczesnego przekazania pól email, client_name, client_surname oraz accept_tos. Ich brak spowoduje błąd walidacji (HTTP 422).
Multibanco przyjmuje wyłącznie EUR - inna waluta kończy się błędem rejestracji. Usługa musi mieć włączoną walutę EUR. Jeśli jej nie ma, rejestracja zwraca błąd Currency code "EUR" does not match the service currency code "PLN". - wtedy skontaktuj się ze swoim opiekunem w dpay.pl.
Suma kontrolna jest liczona tak samo jak przy każdej rejestracji płatności (szczegóły: Checksum):
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": "10.00",
"currency_code": "EUR",
"channel": "390",
"email": "klient@example.com",
"client_name": "Joao",
"client_surname": "Silva",
"accept_tos": true,
"url_success": "https://mojsklep.pl/sukces",
"url_fail": "https://mojsklep.pl/blad",
"url_ipn": "https://mojsklep.pl/api/ipn",
"checksum": "e3b0c44298fc1c149afb..."
}'
PHP
<?php
$service = getenv('DPAY_SERVICE');
$secretHash = getenv('DPAY_SECRET_HASH');
$value = '10.00';
$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,
'currency_code' => 'EUR',
'channel' => '390', // Multibanco
'email' => $_POST['email'],
'client_name' => $_POST['client_name'],
'client_surname' => $_POST['client_surname'],
'accept_tos' => true,
'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,
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
if ($result['status'] === true && !$result['error']) {
// Zapisz dane referencji przy zamówieniu - przydadzą się np. w e-mailu do płatnika
saveMultibancoReference(
$result['transactionId'],
$result['multibanco']['entity'],
$result['multibanco']['reference'],
$result['multibanco']['expires_at'],
);
header('Location: ' . $result['msg']);
exit;
}
Odpowiedź API
Sukces
{
"error": false,
"msg": "https://gateway.dpay.pl/pt/pay/42191111-A7AE-392E-8C09-7965C1DC6B0B",
"status": true,
"transactionId": "42191111-A7AE-392E-8C09-7965C1DC6B0B",
"multibanco": {
"entity": "99999",
"reference": "123456789",
"amount": "10.00",
"currency": "EUR",
"expires_at": "2026-10-18T12:00:00+00:00"
}
}
Pole status jest wartością logiczną (true/false), a msg zawiera adres bramki, na którą przekierowujesz płatnika. Traktuj go jako gotowy adres - nie składaj go samodzielnie. Pole transactionId identyfikuje płatność w powiadomieniach, w zapytaniach o status i w symulacji.
Obiekt multibanco:
| Pole | Typ | Opis |
|---|---|---|
entity | string | Numer podmiotu (Entidade) - 5 cyfr |
reference | string | Numer referencji (Referência) - 9 cyfr bez spacji. Płatnikowi pokazuj go w grupach po trzy cyfry, np. 123 456 789 |
amount | string | Kwota do zapłaty, z kropką dziesiętną |
currency | string | Zawsze EUR |
expires_at | string | Termin ważności referencji (ISO 8601). Po nim referencji nie da się opłacić |
Płatnik płaci poza Twoją stroną, często później. Dane referencji możesz pokazać także u siebie, np. na stronie podziękowania albo w e-mailu z potwierdzeniem zamówienia.
Błąd rejestracji (HTTP 400)
Błędy wykryte przy rejestracji zwracane są w formacie:
{
"status": "failed",
"message": "Multibanco supports only currency_code \"EUR\".",
"errors": []
}
Przekierowanie płatnika na bramkę
Na bramce płatnik widzi:
- numer podmiotu (Entidade) i numer referencji (Referência) z przyciskami kopiowania,
- kwotę (Montante) i termin ważności (Válido até),
- krótką instrukcję zapłaty w bankomacie Multibanco albo w bankowości internetowej.
Bramka sama sprawdza stan płatności. Po opłaceniu przekierowuje płatnika na url_success, a po wygaśnięciu referencji - na url_fail. Płatnik nie musi czekać na bramce: może ją zamknąć i zapłacić później, więc powrót na Twoją stronę nie jest potwierdzeniem płatności.
Statusy i powiadomienia
| Zdarzenie | Status transakcji | IPN | Webhook |
|---|---|---|---|
| Rejestracja - referencja czeka na zapłatę | created | Nie | - |
| Płatnik opłacił referencję | paid | Tak | payment.succeeded |
| Referencja wygasła bez zapłaty | expired | Nie | payment.failed z kodem expired |
Transakcja Multibanco nie przechodzi przez stan processing - czeka w created do opłacenia albo wygaśnięcia referencji (opis stanów: Statusy transakcji).
IPN nie zawiera statusu i jest wysyłany tylko po opłaceniu. O wygaśnięciu referencji dowiesz się z webhooka payment.failed (kod expired) albo odpytując o status transakcji. Przy Multibanco zalecamy więc webhooki.
W webhookach metoda płatności zawiera dane referencji:
"payment_method": {
"type": "multibanco",
"multibanco": { "entity": "99999", "reference": "123456789" }
}
Termin ważności referencji
Referencja jest ważna 72 godziny od rejestracji. Dokładny termin zwraca pole multibanco.expires_at - opieraj się na nim, a nie na stałej wartości. Najpóźniej kilka minut po tym terminie dpay.pl unieważnia referencję, anuluje transakcję i wysyła webhook payment.failed z kodem expired.
Nie anuluj zamówienia przed expires_at tylko dlatego, że płatnik nie zapłacił od razu. Jeśli rezerwujesz towar, trzymaj rezerwację do terminu ważności referencji.
Testowanie
W trybie testowym referencja jest symulowana. Wynik płatności wywołujesz sam - endpointem symulacji albo przyciskami na bramce. Bez tego transakcja czeka na zapłatę, a po upływie terminu ważności wygasa tak jak na produkcji.
Endpoint symulacji
POST https://api-payments.dpay.pl/api/v1_0/payments/transaction/{transactionId}/multibanco/simulate
Content-Type: application/json
Accept: application/json
W miejsce {transactionId} wstaw transactionId z odpowiedzi rejestracji. Endpoint nie wymaga sumy kontrolnej i działa wyłącznie dla usług w trybie testowym.
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
action | string | Tak | "pay" - symuluje opłacenie referencji, "expire" - symuluje jej wygaśnięcie |
| Akcja | Efekt |
|---|---|
pay | Transakcja zostaje opłacona: IPN na url_ipn i webhook payment.succeeded |
expire | Transakcja zostaje anulowana: webhook payment.failed z kodem expired, bez IPN |
Przykład: opłacenie referencji
curl -X POST https://api-payments.dpay.pl/api/v1_0/payments/transaction/42191111-A7AE-392E-8C09-7965C1DC6B0B/multibanco/simulate \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"action": "pay"}'
Przykład: wygaśnięcie referencji
curl -X POST https://api-payments.dpay.pl/api/v1_0/payments/transaction/42191111-A7AE-392E-8C09-7965C1DC6B0B/multibanco/simulate \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"action": "expire"}'
Odpowiedź (HTTP 200)
{
"success": true,
"changed": true,
"status": "paid",
"transactionStatus": 1
}
| Pole | Opis |
|---|---|
success | true - akcja została przyjęta |
changed | true, gdy wywołanie zmieniło stan referencji; false, gdy referencja była już opłacona albo wygasła |
status | Stan referencji: pending, paid albo expired |
transactionStatus | Status transakcji jako liczba: 0 - oczekuje na zapłatę, 1 - opłacona, -1 - anulowana |
Endpoint jest idempotentny. Ponowne wywołanie dla referencji, która jest już opłacona albo wygasła, nic nie zmienia i zwraca changed: false z bieżącym stanem - np. expire po pay zwróci "status": "paid".
Kody odpowiedzi
| HTTP | Kiedy |
|---|---|
200 | Akcja przyjęta - także wtedy, gdy nic nie zmieniła (patrz changed) |
404 | Transakcja nie jest płatnością Multibanco albo usługa nie jest w trybie testowym |
422 | Nieznana wartość action - dozwolone są pay i expire |
Przyciski symulacji na bramce
W trybie testowym bramka pokazuje baner trybu testowego i dwa przyciski: opłacenia i wygaśnięcia referencji. Działają tak samo jak endpoint symulacji, a bramka od razu odświeża stan i przekierowuje płatnika na url_success albo url_fail. To wygodny sposób, żeby ręcznie przejść całą ścieżkę płatnika.
Co sprawdzić przed produkcją
- Rejestracja zwraca obiekt
multibanco, a Twoja aplikacja przekierowuje płatnika na adres zmsg. - Po akcji
payzamówienie zmienia się na opłacone na podstawie IPN albo webhookapayment.succeeded- nie na podstawie powrotu naurl_success. - Po akcji
expirezamówienie zostaje anulowane na podstawie webhookapayment.failedz kodemexpired(IPN nie przychodzi). - Ponowne powiadomienie o tej samej płatności nie zmienia stanu zamówienia drugi raz.
Najczęstsze błędy
| Komunikat | Gdzie występuje | Przyczyna | Rozwiązanie |
|---|---|---|---|
Multibanco is not enabled for this service. | message (HTTP 400) | Kanał Multibanco nie jest aktywny dla usługi | Poproś opiekuna w dpay.pl o aktywację kanału Multibanco dla usługi |
Multibanco supports only currency_code "EUR". | message (HTTP 400) | Brak currency_code albo waluta inna niż EUR | Przekaż currency_code: "EUR" |
Multibanco requires transactionType "transfers". | message (HTTP 400) | Kanał Multibanco podany przy innym typie transakcji | Użyj transactionType: "transfers" |
Currency code "EUR" does not match the service currency code "PLN". | message (HTTP 400) | Usługa nie ma włączonej waluty EUR | Poproś opiekuna w dpay.pl o włączenie EUR dla usługi |
| Błąd walidacji pól | HTTP 422 | Brak email, client_name, client_surname lub accept_tos przy podanym channel | Uzupełnij brakujące pola |
Odpowiedź 404 | Endpoint symulacji | Płatność nie jest płatnością Multibanco albo usługa nie jest w trybie testowym | Sprawdź transactionId i tryb testowy usługi |
Referencję Multibanco opłaci płatnik z kontem w banku działającym w Portugalii - w bankomacie Multibanco albo w bankowości internetowej lub mobilnej.