Przejdź do głównej zawartości

Google Pay

Integracja Google Pay umożliwia klientom płatność za pomoca kart zapisanych na ich koncie Google. Płatność odbywa się natywnie w przeglądarce lub aplikacji, bez konieczności wpisywania danych karty.

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": "49.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: Konfiguracja przycisku Google Pay

Dodaj skrypt Google Pay API i skonfiguruj przycisk na swójej stronie:

<script src="https://pay.google.com/gp/p/js/pay.js"></script>
<div id="google-pay-button"></div>

Konfiguracja JavaScript

// Konfiguracja Google Pay
const googlePayConfig = {
apiVersion: 2,
apiVersionMinor: 0,
allowedPaymentMethods: [
{
type: 'CARD',
parameters: {
allowedAuthMethods: ['PAN_ONLY', 'CRYPTOGRAM_3DS'],
allowedCardNetworks: ['VISA', 'MASTERCARD'],
},
tokenizationSpecification: {
type: 'PAYMENT_GATEWAY',
parameters: {
gateway: 'aciworldwide',
gatewayMerchantId: 'YOUR_MERCHANT_ID', // ID wskazane przez BOK dpay
},
},
},
],
};

// Konfiguracja zapytania o płatność
const paymentDataRequest = {
...googlePayConfig,
transactionInfo: {
totalPriceStatus: 'FINAL',
totalPrice: '49.99',
currencyCode: 'PLN',
countryCode: 'PL',
},
merchantInfo: {
merchantName: 'Moj Sklep',
merchantId: 'BCR2DN4T...', // Twoje Google Merchant ID
},
};

Inicjalizacja i wyświetlenie przycisku

let paymentsClient;

async function initGooglePay() {
paymentsClient = new google.payments.api.PaymentsClient({
environment: 'PRODUCTION', // lub 'TEST' dla testow
});

// Sprawdz, czy Google Pay jest dostępny
const isReadyToPay = await paymentsClient.isReadyToPay(googlePayConfig);

if (isReadyToPay.result) {
const button = paymentsClient.createButton({
onClick: onGooglePayClicked,
buttonColor: 'black',
buttonType: 'pay',
buttonLocale: 'pl',
});
document.getElementById('google-pay-button').appendChild(button);
}
}

async function onGooglePayClicked() {
try {
const paymentData = await paymentsClient.loadPaymentData(paymentDataRequest);
await processGooglePayPayment(paymentData);
} catch (error) {
console.error('Google Pay error:', error);
}
}

// Inicjalizuj po zaladowaniu strony
google.payments.api.PaymentsClient && initGooglePay();

Krok 3: Wysłanie tokenu do dpay.pl

Po zatwierdzeniu płatności przez klienta w Google Pay, wyślij otrzymany token do dpay.pl. Wartość paymentMethodData.tokenizationData.token z odpowiedzi Google Pay zakoduj w Base64 i przekaż jako xPayToken.

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

Parametry zapytania

{
"email": "klient@example.com",
"channelId": 31,
"xPayType": "GOOGLE_PAY",
"xPayToken": "<Base64(token z paymentMethodData.tokenizationData.token)>",
"deviceInfo": {
"browserAcceptHeader": "application/json,text/plain,*/*",
"browserJavaEnabled": "false",
"browserLanguage": "pl-PL",
"browserColorDepth": 24,
"browserScreenHeight": 1080,
"browserScreenWidth": 1920,
"browserTZ": -60,
"browserUserAgent": "Mozilla/5.0 ...",
"systemFamily": "Win32",
"deviceID": "device-unique-id",
"applicationName": "Netscape"
}
}

Pola wymagane: channelId, xPayType, xPayToken, deviceInfo. channelId to identyfikator kanału kartowego przekazany przez BOK dpay. Pełna specyfikacja obiektu deviceInfo znajduje się w dokumentacji API.

JavaScript - przetwarzanie płatności

async function processGooglePayPayment(paymentData) {
const transactionId = '...'; // Z Kroku 1

const deviceInfo = {
browserAcceptHeader: 'application/json,text/plain,*/*',
browserJavaEnabled: navigator.javaEnabled?.() ? 'true' : 'false',
browserLanguage: navigator.language || 'pl-PL',
browserColorDepth: screen.colorDepth,
browserScreenHeight: screen.height,
browserScreenWidth: screen.width,
browserTZ: new Date().getTimezoneOffset(),
browserUserAgent: navigator.userAgent,
systemFamily: navigator.platform || 'Unknown',
deviceID: 'device-unique-id',
applicationName: navigator.appName || 'Netscape',
};

// Token z Google Pay musi byc zakodowany w Base64
const xPayToken = btoa(paymentData.paymentMethodData.tokenizationData.token);

const response = await fetch(`/api/pay/google-pay`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
transactionId,
email: paymentData.email,
xPayToken,
deviceInfo,
}),
});

const result = await response.json();

if (!result.success) {
alert('Błąd płatności: ' + result.message);
return;
}

// Dla Google Pay odpowiedz zawsze ma redirectType: 'SUCCESS' lub płatność jest odrzucona.
// Autoryzacja (w tym 3DS) odbywa się w portfelu Google Pay po stronie klienta.
window.location.href = '/sukces';
}

Serwer (Node.js) - proxy do dpay.pl

app.post('/api/pay/google-pay', async (req, res) => {
const { transactionId, email, xPayToken, deviceInfo } = req.body;

const response = await axios.post(
`https://api-payments.dpay.pl/api/v1_0/cards/payment/${transactionId}/pay/google-pay`,
{
email,
channelId: process.env.DPAY_CARD_CHANNEL_ID,
xPayType: 'GOOGLE_PAY',
xPayToken,
deviceInfo,
}
);

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

Odpowiedz API

Odpowiedz zawsze ma pola success, status i message. Pole message dla sukcesu to obiekt {redirectText, redirectType}, a dla błędu - komunikat tekstowy.

3D Secure

W Google Pay autoryzacja (w tym ewentualny 3DS) odbywa się w portfelu Google po stronie klienta, zanim token zostanie wysłany do dpay. Endpoint dpay zwraca zawsze redirectType: "SUCCESS" dla udanej transakcji albo błąd - nigdy nie zwraca FORM ani dodatkowego wyzwania 3DS.

Sukces - płatność sfinalizowana

{
"success": true,
"status": "success",
"message": {
"redirectText": "",
"redirectType": "SUCCESS"
}
}

Błąd

{
"success": false,
"status": "error",
"message": "Error during payment creation"
}

Testowanie w trybie sandbox

W trybie testowym dpay.pl nie musisz konfigurować Google Pay sheet. Zamiast tokena z portfela przekaż specjalną wartość testową w polu xPayToken:

TokenScenariusz
TEST_SUCCESSPłatność zakończona sukcesem
TEST_SUCCESS_DELAYEDSukces po dłuższym oczekiwaniu
TEST_DECLINETransakcja odrzucona
TEST_INSUFFICIENTBrak środków
TEST_TIMEOUTTimeout
TEST_ERRORBłąd systemu

Przykład testowego zapytania:

curl -X POST https://api-payments.dpay.pl/api/v1_0/cards/payment/{transactionId}/pay/google-pay \
-H "Content-Type: application/json" \
-d '{
"channelId": 31,
"xPayType": "GOOGLE_PAY",
"xPayToken": "TEST_SUCCESS",
"deviceInfo": {
"browserAcceptHeader": "application/json",
"browserJavaEnabled": "false",
"browserLanguage": "pl-PL",
"browserColorDepth": 24,
"browserScreenHeight": 1080,
"browserScreenWidth": 1920,
"browserTZ": 0,
"browserUserAgent": "Mozilla/5.0",
"systemFamily": "Win32",
"deviceID": "test-device",
"applicationName": "Netscape"
}
}'

Pełna lista tokenów testowych na stronie Środowisko testowe.

Wymagania
  • Twoja strona musi byc dostępna przez HTTPS
  • Musisz posiadać zweryfikowane Google Merchant ID (dla produkcji)
  • Domena musi byc zarejestrowana w Google Pay & Wallet Console