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>