Sample Code | Google Pay™
Sample code of Google Pay™ Direct Integration
This sample code is a complete example of a payment page that uses the MyFatoorah with Google Pay™.
//1: load google pay js file
<script src="https://pay.google.com/gp/p/js/pay.js">
</script>
//2: add google pay container div
<div id="gp-container"></div>
//3: prepare google pay model
<script>
$(document).ready(function () {
googlePayModel = {
sessionId: "", // Here you add the "SessionId" you receive from InitiateSession Endpoint.
amount: "10", // Add the invoice amount.
currencyCode: "KWD", // Here, add your Currency Code.
countryCode: "KWT", // Here, add your Country Code.
language: 'en', // Here, add your prefered language values[ar|en].
cardViewId: 'gpcontainer', // Here, add your google pay div id.
isProduction: false, // Here, add your the environment 'true' mean production.
merchantId: '12345678901234567890', // Here add the merchantId, for production get value from google pay api console
gatewayMerchantId: '<gatewayMerchantId>', // Here add the recieved from MyFatoorah
merchantName: 'YOUR COMAPNY NAME',
};
startGooglePay(googlePayModel);
function startGooglePay(invModel) {
var gpDiv = invModel.cardViewId;
const buttonLocale = invModel.language == 'ar' ? 'ar' : 'en';
const environment = invModel.isProduction == true ? 'PRODUCTION' : 'TEST';
const allowedCardNetworks = ["AMEX", "MASTERCARD", "VISA"];
const allowedCardAuthMethods = ["PAN_ONLY", "CRYPTOGRAM_3DS"];
const gatewayMerchantId = invModel.gatewayMerchantId;
const merchantId = invModel.merchantId;
const merchantName = invModel.merchantName;
const mainItem = "Pay Invoice ";
const sessionId = invModel.sessionId;
const invoiceValue = Number(parseFloat(invModel.amount.replace(",", "")).toFixed(2)).toString();
let countryCode = invModel.countryCode;
let currencyCode = invModel.currencyCode;
const callbackIntents = ["PAYMENT_AUTHORIZATION"];
const baseRequest = {
apiVersion: 2,
apiVersionMinor: 0,
};
const tokenizationSpecification = {
type: 'PAYMENT_GATEWAY',
parameters: {
'gateway': 'myfatoorah',
'gatewayMerchantId': invModel.gatewayMerchantId
},
};
const merchantInfo = {
merchantId: merchantId,
merchantName: merchantName,
};
const baseCardPaymentMethod = {
type: 'CARD',
parameters: {
allowedAuthMethods: allowedCardAuthMethods,
allowedCardNetworks: allowedCardNetworks
}
};
const cardPaymentMethod = Object.assign(
{},
baseCardPaymentMethod,
{
tokenizationSpecification: tokenizationSpecification
}
);
let paymentsClient = null;
function onGooglePayLoaded() {
const paymentsClient = getGooglePaymentsClient();
const googleIsReadyToPayRequest = Object.assign({}, baseRequest);
googleIsReadyToPayRequest.allowedPaymentMethods = [baseCardPaymentMethod];
paymentsClient.isReadyToPay(googleIsReadyToPayRequest)
.then(function (response) {
if (response.result) {
addGooglePayButton();
prefetchGooglePaymentData();
}
})
.catch(function (err) {
// show error in developer console for debugging
console.error(err);
});
}
function addGooglePayButton() {
const paymentsClient = getGooglePaymentsClient();
const button =
paymentsClient.createButton({
buttonType: "pay",
buttonColor: "black",
buttonLocale: buttonLocale,
buttonSizeMode: 'fill',
onClick: onGooglePaymentButtonClicked,
allowedPaymentMethods: [baseCardPaymentMethod]
});
document.getElementById(gpDiv).appendChild(button);
}
function onGooglePaymentButtonClicked() {
const paymentDataRequest = getGooglePaymentDataRequest();
paymentDataRequest.transactionInfo = getGoogleTransactionInfo();
const paymentsClient = getGooglePaymentsClient();
paymentsClient.loadPaymentData(paymentDataRequest);
}
function getGoogleTransactionInfo() {
return {
displayItems: [
{
label: mainItem,
type: "SUBTOTAL",
price: invoiceValue,
},
],
countryCode: countryCode,
currencyCode: currencyCode,
totalPriceStatus: "FINAL",
totalPrice: invoiceValue,
totalPriceLabel: "Total"
};
}
function prefetchGooglePaymentData() {
const paymentDataRequest = getGooglePaymentDataRequest();
// transactionInfo must be set but does not affect cache
paymentDataRequest.transactionInfo = {
totalPriceStatus: 'NOT_CURRENTLY_KNOWN',
totalPrice: invoiceValue,
currencyCode: currencyCode
};
const paymentsClient = getGooglePaymentsClient();
paymentsClient.prefetchPaymentData(paymentDataRequest);
}
function getGooglePaymentDataRequest() {
const paymentDataRequest = Object.assign({}, baseRequest);
paymentDataRequest.allowedPaymentMethods = [cardPaymentMethod];
paymentDataRequest.transactionInfo = getGoogleTransactionInfo(mainItem, invoiceValue);
paymentDataRequest.merchantInfo = merchantInfo;
paymentDataRequest.callbackIntents = callbackIntents;
return paymentDataRequest;
}
function getGooglePaymentsClient() {
if (paymentsClient === null) {
paymentsClient = new google.payments.api.PaymentsClient({
environment: environment,
paymentDataCallbacks: {
onPaymentAuthorized: onPaymentAuthorized,
}
});
}
return paymentsClient;
}
function processPayment(paymentData) {
var reqData = {
type: 2,
sessionId: sessionId, // Here you add the "SessionId" you receive from InitiateSession Endpoint.
token: paymentData, // Here you add the google pay token
};
//Ajax call to your backend (ProcessPayment or any method name)
//In your backend method you need to do the followings:
//1: Call UpdateSession endpoint
//2: If success then call ExecutePayment endpoint
//3: Return the ExecutePayment result
return $.ajax({
url: YourHostUrl + "/ProcessPayment", //Here you add UpdateSession endpoint
method: "POST",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(reqData)
});
}
function onPaymentAuthorized(paymentData) {
return new Promise(function (resolve, reject) {
// handle the response
processPayment(paymentData)
.then(function (result) {
if (result.IsSuccess) {
resolve({ transactionState: 'SUCCESS' });
//success url
window.location = result.PaymentURL;
} else {
throw {
transactionState: 'FAILED',
error: {
intent: 'PAYMENT_AUTHORIZATION',
message: result.Message,
reason: 'PAYMENT_PROCCESS_FAILED',
url: result.PaymentURL
}
};
}
})
.catch(function (e) {
resolve({
transactionState: e.transactionState,
error: {
intent: e.error.intent,
message: e.error.message,
reason: e.error.reason
}
});
//failur url
window.location = e.url;
});
});
}
onGooglePayLoaded();
}
});
</script>
Updated about 1 year ago