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.
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:
| Token | Scenariusz |
|---|---|
TEST_SUCCESS | Płatność zakończona sukcesem |
TEST_SUCCESS_DELAYED | Sukces po dłuższym oczekiwaniu |
TEST_DECLINE | Transakcja odrzucona |
TEST_INSUFFICIENT | Brak środków |
TEST_TIMEOUT | Timeout |
TEST_ERROR | Błą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.
- 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