Przejdź do głównej zawartości

Apple Pay

Integracja Apple Pay pozwala klientom korzystającym z urządzeń Apple (iPhone, iPad, Mac z Touch ID/Face ID) na szybka płatność za pomoca kart zapisanych w Apple Wallet.

Schemat działania

Krok 1: Rejestracja płatności

Zarejestruj transakcję standardowo:

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

Zapisz transactionId z odpowiedzi.

Krok 2: Inicjalizacja sesji Apple Pay

Przed wyświetleniem przycisku Apple Pay musisz zainicjalizowac sesje. Wyślij zapytanie do dpay.pl z parametrem xPayType: APPLE_PAY_INIT:

POST https://api-payments.dpay.pl/api/v1_0/cards/payment/{transactionId}/pay/apple-pay
Content-Type: application/json

Zapytanie inicjalizacji sesji

{
"xPayType": "APPLE_PAY_INIT",
"validationUrl": "https://apple-pay-gateway.apple.com/paymentservices/paymentSession"
}

Odpowiedz

{
"error": false,
"session": {
"epochTimestamp": 1700000000,
"expiresAt": 1700003600,
"merchantSessionIdentifier": "SSH...",
"nonce": "abc123",
"merchantIdentifier": "merchant.pl.dpay",
"domainName": "mojsklep.pl",
"displayName": "dpay.pl",
"signature": "..."
}
}

Krok 3: Konfiguracja przycisku Apple Pay

<!-- Sprawdz dostępnosc Apple Pay -->
<div id="apple-pay-button" style="display: none;"></div>

<style>
#apple-pay-button {
-webkit-appearance: -apple-pay-button;
-apple-pay-button-type: pay;
-apple-pay-button-style: black;
width: 100%;
height: 48px;
cursor: pointer;
}
</style>

JavaScript - pełna integracja

// Sprawdz, czy Apple Pay jest dostępny
if (window.ApplePaySession && ApplePaySession.canMakePayments()) {
document.getElementById('apple-pay-button').style.display = 'block';
}

document.getElementById('apple-pay-button').addEventListener('click', async () => {
const transactionId = '...'; // Z Kroku 1

// Konfiguracja zadania płatności
const paymentRequest = {
countryCode: 'PL',
currencyCode: 'PLN',
supportedNetworks: ['visa', 'masterCard'],
merchantCapabilities: ['supports3DS'],
total: {
label: 'Moj Sklep',
amount: '79.99',
},
};

const session = new ApplePaySession(3, paymentRequest);

// Walidacja sesji - wymagane przez Apple
session.onvalidatemerchant = async (event) => {
try {
// Wyślij validationURL do swójego serwera
const response = await fetch('/api/pay/apple-pay/session', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
transactionId,
validationUrl: event.validationURL,
}),
});

const merchantSession = await response.json();
session.completeMerchantValidation(merchantSession.session);
} catch (error) {
session.abort();
console.error('Błąd walidacji sesji:', error);
}
};

// Obsługa autoryzacji płatności
session.onpaymentauthorized = async (event) => {
try {
const response = await fetch('/api/pay/apple-pay/process', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
transactionId,
paymentToken: event.payment.token,
}),
});

const result = await response.json();

if (!result.error) {
session.completePayment(ApplePaySession.STATUS_SUCCESS);
window.location.href = '/sukces';
} else {
session.completePayment(ApplePaySession.STATUS_FAILURE);
}
} catch (error) {
session.completePayment(ApplePaySession.STATUS_FAILURE);
}
};

session.oncancel = () => {
console.log('Klient anulował płatność Apple Pay');
};

// Rozpocznij sesje
session.begin();
});

Serwer - obsługa endpointow

Inicjalizacja sesji (APPLE_PAY_INIT)

app.post('/api/pay/apple-pay/session', async (req, res) => {
const { transactionId, validationUrl } = req.body;

const response = await axios.post(
`https://api-payments.dpay.pl/api/v1_0/cards/payment/${transactionId}/pay/apple-pay`,
{
xPayType: 'APPLE_PAY_INIT',
validationUrl,
}
);

res.json(response.data);
});

Przetwarzanie płatności (APPLE_PAY)

app.post('/api/pay/apple-pay/process', async (req, res) => {
const { transactionId, paymentToken } = req.body;

const deviceInfo = {
browserJavaEnabled: false,
browserLanguage: 'pl-PL',
browserColorDepth: '24',
browserScreenHeight: '1080',
browserScreenWidth: '1920',
browserTZ: '-60',
browserUserAgent: req.headers['user-agent'],
browserAcceptHeader: req.headers['accept'] || 'text/html',
browserJavascriptEnabled: true,
};

const response = await axios.post(
`https://api-payments.dpay.pl/api/v1_0/cards/payment/${transactionId}/pay/apple-pay`,
{
xPayType: 'APPLE_PAY',
paymentToken,
deviceInfo,
}
);

res.json(response.data);
});

Odpowiedzi API

Sukces

{
"error": false,
"status": "paid",
"transactionId": "abc-def-123-456"
}

3D Secure wymagane

{
"error": false,
"status": "3DS_REQUIRED",
"redirectType": "FORM",
"redirectUrl": "https://acs-bank.example.com/3ds",
"redirectParams": { ... }
}

Wymagania

Konfiguracja Apple Pay
  • Twoja domena musi byc zweryfikowana w Apple - dpay.pl obsługuje walidacje domeny w ramach procesu APPLE_PAY_INIT
  • Strona musi byc dostępna przez HTTPS
  • Apple Pay działa wyłącznie na urządzeniach Apple z Safari (lub Chrome na iOS 16+)
  • Nie jest możliwe testowanie Apple Pay na urządzeniach z systemem Android lub Windows