Товарищи, представляю готовый модуль JavaScript для осуществления платежей с помощью Google Pay. Модуль предполагает использование в современной среде разработки npm с экспортами-импортами, однако, те, кто хочет чистого ES5, думаю, без труда смогут его переделать.
Ссылка на модуль. В коде есть нужная документация и комментарии. Здесь дам некоторые пояснения.
Надо сказать, что гугловская документация именно по платёжной кнопке оказалось не самая простая, список ошибок, возвращаемых Google Pay API, тоже не самый полный. Поэтому, в отличие от работы с ApplePay, с Google Pay пришлось чуть-чуть почертыхаться, прежде чем модуль действительно заработал.
Работа состоит из двух этапов: сначала мы должны принять решение, показывать или нет кнопку (не все браузеры поддерживают Google Pay), а потом выполнить сам платёжный процессинг.
1. Показ кнопки
export function showGooglePayButton(options, callbacks) {
// проверка параметров
const check = checkParams("showGooglePayButton", options, callbacks);
if (!check) {
return false;
} else {
options = check.options;
}
const paymentsClient = new google.payments.api.PaymentsClient({environment: options.environment});
// в приложении запоминаем экземпляр платёжного клиента, который создало API
callbacks.setPaymentClient(paymentsClient);
const request = {
apiVersion: 2,
apiVersionMinor: 0,
allowedPaymentMethods: [options.googleBaseCardPaymentMethod]
};
paymentsClient.isReadyToPay(request)
.then(function(response) {
if (response.result) {
callbacks.success();
return true;
} else {
console.log("Запрос на показ кнопки Google Pay закончился неудачно");
callbacks.fail();
}
})
.catch(function(err) {
console.log("showGooglePayButton ERROR");
callbacks.fail();
});
}
const setGoogleBaseCardPaymentMethod = () => {
return {
type: "CARD",
parameters: {
allowedAuthMethods: ["PAN_ONLY", "CRYPTOGRAM_3DS"],
allowedCardNetworks: ["AMEX", "DISCOVER", "JCB", "MASTERCARD", "VISA"]
}
}
};
const getGooglePaymentDataRequest = () => {
const cardPaymentMethod = Object.assign(
{},
baseMethod,
{
tokenizationSpecification: token
}
);
const paymentDataRequest = {
apiVersion: 2,
apiVersionMinor: 0,
allowedPaymentMethods : [cardPaymentMethod],
/* for demo (enviroment TEST):
merchantInfo : {
merchantId: '12345678901234567890',
merchantName: 'JOHN SMITH'
},
*/
/* for prod (enviroment PRODUCTION):
merchantInfo : {
merchantId: options.merc_id,
merchantName: options.merc_name
},
*/
merchantInfo : {
merchantId: options.merc_id,
merchantName: options.merc_name
},
transactionInfo : {
currencyCode: options.currency,
totalPriceStatus: 'FINAL',
totalPrice: "" + options.sum
}
};
return paymentDataRequest;
};
const token = {
/* for demo (enviroment TEST):
parameters: {
"protocolVersion": "ECv1",
"publicKey": yourTestPublicKey
}
*/
/* for prod (enviroment PRODUCTION):
parameters: {
"protocolVersion": "ECv1",
"publicKey": params.googlePayPublicKey
}
*/
type: 'DIRECT',
parameters: {
"protocolVersion": "ECv1",
"publicKey": options.googlePayPublicKey
}
};
paymentsClient.loadPaymentData(paymentDataRequest)
.then(function(paymentData) {
const googleToken = JSON.parse(paymentData.paymentMethodData.tokenizationData.token);
// your own client-back ajax request here
}
К сожалению, не доступен сервер mySQL