Google Pay™

Google Pay Integration Guide for CellPoint Velocity API

This page provides a guide to integrating Google Pay with CellPoint Velocity API, which lets a customer use a payment method saved to their Google Pay account.

Onboarding Checklist

The following table shows the onboarding responsibilities belonging to CellPoint Digital, Google, and you the merchant:

OwnerOwner ResponsibilitiesDetails
CellPoint Digital• Client onboarding and configuration
• Merchant onboarding with Google
• Client setup - account and client ID
• API authorization credentials
• Configure redirect URLs for successful and failed transactions
• API version
• Supported country ID list
• Gateway ID: cellpointmobile
Merchant / GoogleProduction validation by Google• Obtain merchant ID from Google
• Merchant to contact Google for validation of the integration
• Follow this link to request production access

Google Pay Requirements

Before you start integration, you must follow the Google Web Integration checklist and brand guidelines as follows:

Workflow

When using Google Pay with CellPoint Velocity API, the workflow is as follows:

  1. The customer navigates to the merchant's payment/checkout page.
  2. While loading the checkout page, the merchant sends an Initialize request.
  3. The API returns an Initialize response with information for Google Pay.
  4. The merchant loads information from the Initialize response into the page’s HTML during page load.
  5. When the customer selects the Google Pay button, Google sends payment data to the merchant.
  6. The merchant uses the received payment data to send an Authorize request.
  7. The API returns a successful Authorize response, which confirms the success of the payment.

Integration

Complete the following steps to use Google Pay with your integration.

1. Initialize a payment

Endpoint: /mpoint/initialize-payment
Method: POST

Once the page has loaded, send a POST request to the /mpoint/initialize-payment endpoint of the CellPoint Digital API. For more information, see our Initialize API reference.

The code below is an example Initialize request body:

<?xml version="1.0" encoding="UTF-8"?>
<root>
	<initialize-payment account="[integer]" client-id="[integer]">
		<transaction order-no="CPM1601976034055" type-id="[integer]" >
			<amount currency-id="[integer]" countryid="[integer]">100</amount>
		</transaction>
		<client-info language="en" app-version="1.43" sdk-version="1.43" version="1.43" platform="HTML5">
			<mobile operator-id="[integer]" country-id="200">[mobile number]</mobile>
			<email>[email]</email>
			<customer-ref>[customer-ref]</customer-ref>
		</client-info>
	</initialize-payment>
</root>

Below is a sample Initialize response when using Google Pay. Note that, in root: wallets: card: name, the text content is set to Google Pay.

<?xml version="1.0" encoding="UTF-8"?>
<root>
	<client-config account="[integer]" auto-capture="false" id="[integer]" mode="[integer]" store-card="[integer]">
		<name>Test</name>
		<callback-url>[merchant URL for callback]</callback-url>
		<accept-url/>
	</client-config>
	<transaction auto-capture="true" eua-id="[integer]" id="[integer]" language="en" mode="1" order-no="" type-id="[integer]">
		<amount country-id="[integer]" currency="DKK" format="{PRICE} {CURRENCY}" symbol="">10025</amount>
		<mobile country-id="[integer]" operator-id="[integer]">30206172</mobile>
		<callback-url>[CALLBACK URL]</callback-url>
		<accept-url/>
	</transaction>
	<session id="6143" total-amount="1" type="1">
		<amount alpha2code="US" alpha3code="USA" code="840" country-id="200" currency="" currency-id="0" format="{CURRENCY}{PRICE}" symbol="$">10025</amount>
	</session>
	<wallets>
		<card cvc-length="-1" cvcmandatory="false" dcc="false" enabled="true" id="41" installment="0" max-length="-1" min-length="-1" payment-type="3" preferred="false" presentment-currency="false" processor-type="3" psp-id="-1" state-id="1" type-id="41">
			<name>Google Pay</name>
			<prefixes>
				<prefix id="200">
					<min>-1</min>
					<max>-1</max>
				</prefix>
				<prefix id="202">
					<min>-1</min>
					<max>-1</max>
				</prefix>
			</prefixes>
			<url method="overlay"/>
			<head>&lt;script&gt;var baseRequest={apiVersion: 2, apiVersionMinor: 0 };var allowedCardAuthMethods=['PAN_ONLY','CRYPTOGRAM_3DS'];var allowedCardNetworks=['MASTERCARD','DISCOVER','VISA','AMEX'];var assuranceDetailsRequired=true;var tokenizationSpecification={type:'PAYMENT_GATEWAY',parameters:{'gateway':'cellpointmobile','gatewayMerchantId':'10106'}};var baseCardPaymentMethod={type:'CARD',parameters:{allowedAuthMethods:allowedCardAuthMethods,allowedCardNetworks:allowedCardNetworks,assuranceDetailsRequired:assuranceDetailsRequired}};var cardPaymentMethod=Object.assign({},baseCardPaymentMethod,{tokenizationSpecification:tokenizationSpecification});let paymentsClient=null;function getGoogleIsReadyToPayRequest(){return Object.assign({},baseRequest,{allowedPaymentMethods:[baseCardPaymentMethod]})} function getGooglePaymentDataRequest(){var paymentDataRequest=Object.assign({},baseRequest);paymentDataRequest.allowedPaymentMethods=[cardPaymentMethod];paymentDataRequest.transactionInfo=getGoogleTransactionInfo();paymentDataRequest.merchantInfo={ merchantName:'Virgin Holidays'};return paymentDataRequest} function getGooglePaymentsClient(){if(paymentsClient===null){return(new google.payments.api.PaymentsClient({environment:'TEST'}));}} function getGoogleTransactionInfo(){return{countryCode:'GB',currencyCode:'GBP',totalPriceStatus:'FINAL',totalPrice:'152.00'}}</head>
			<body>&lt;script async="true" src="https://myurl/js/googlepay.js"&gt;&lt;/script&gt; &lt;script async="true" src="https://pay.google.com/gp/p/js/pay.js"&gt;&lt;/script&gt;</body>
			<auth-token>Auth-Token</auth-token>
		</card>
	</wallets>
</root>
{
    "cvc_length": "-1",
    "cvcmandatory": "false",
    "dcc": "false",
    "enabled": "true",
    "id": "41",
    "installment": "0",
    "max_length": "-1",
    "min_length": "-1",
    "payment_type": "3",
    "preferred": "false",
    "presentment_currency": "false",
    "processor_type": "3",
    "psp_id": "-1",
    "state_id": "1",
    "type_id": "41",
    "name": "Google Pay",
    "prefixes": {
        "prefix": [
            {
                "id": "200",
                "min": "-1",
                "max": "-1"
            },
            {
                "id": "202",
                "min": "-1",
                "max": "-1"
            }
        ]
    },
    "url": {
        "method": "overlay"
    },
    "head": "<script>var baseRequest={apiVersion: 2, apiVersionMinor: 0 };var allowedCardAuthMethods=[\"PAN_ONLY\",\"CRYPTOGRAM_3DS\"];var allowedCardNetworks=[\"MASTERCARD\",\"DISCOVER\",\"AMEX\",\"VISA\"];var assuranceDetailsRequired=true;var tokenizationSpecification={type:\"PAYMENT_GATEWAY\",parameters:{\"gateway\":\"cellpointmobile\",\"gatewayMerchantId\":\"10106\"}};var baseCardPaymentMethod={type:\"CARD\",parameters:{allowedAuthMethods:allowedCardAuthMethods,allowedCardNetworks:allowedCardNetworks,assuranceDetailsRequired:assuranceDetailsRequired}};var cardPaymentMethod=Object.assign({},baseCardPaymentMethod,{tokenizationSpecification:tokenizationSpecification});let paymentsClient=null;function getGoogleIsReadyToPayRequest(){return Object.assign({},baseRequest,{allowedPaymentMethods:[baseCardPaymentMethod]})} function getGooglePaymentDataRequest(){var paymentDataRequest=Object.assign({},baseRequest);paymentDataRequest.allowedPaymentMethods=[cardPaymentMethod];paymentDataRequest.transactionInfo=getGoogleTransactionInfo();paymentDataRequest.merchantInfo={ merchantName:\"Virgin Holidays\"};return paymentDataRequest} function getGooglePaymentsClient(){if(paymentsClient===null){return(new google.payments.api.PaymentsClient({environment:\"TEST\"}));}} function getGoogleTransactionInfo(){return{countryCode:\"GB\",currencyCode:\"USD\",totalPriceStatus:\"FINAL\",totalPrice:\"152.00\"}}",
    "body": "<script async='true' src='https://storage.googleapis.com/bkt-cp-sit-ehpp2/10106/js/googlepay.js'></script> <script async='true' src='https://pay.google.com/gp/p/js/pay.js'></script>",
    "auth_token": "Auth-Token",
    "text": "Google Pay"
}
<?xml version="1.0" encoding="UTF-8"?>
<root>
	<client-config account="[integer]" auto-capture="false" id="[integer]" mode="[integer]" store-card="[integer]">
		<name>Test</name>
		<callback-url>[merchant URL for callback]</callback-url>
		<accept-url/>
	</client-config>
	<transaction auto-capture="true" eua-id="[integer]" id="[integer]" language="en" mode="1" order-no="" type-id="[integer]">
		<amount country-id="[integer]" currency="DKK" format="{PRICE} {CURRENCY}" symbol="">10025</amount>
		<mobile country-id="[integer]" operator-id="[integer]">30206172</mobile>
		<callback-url>[CALLBACK URL]</callback-url>
		<accept-url/>
	</transaction>
	<session id="6143" total-amount="1" type="1">
		<amount alpha2code="US" alpha3code="USA" code="840" country-id="200" currency="" currency-id="0" format="{CURRENCY}{PRICE}" symbol="$">10025</amount>
	</session>
	<wallets>
		<card cvc-length="-1" cvcmandatory="true" dcc="false" enabled="true" id="[Google Pay wallet type Id]" installment="0" max-length="-1" min-length="-1" payment-type="3" preferred="false" processor-type="3" psp-id="[ACQ ID]" state-id="1" type-id="[Google Pay wallet type Id]">
			<name>Google Pay</name>
			<prefixes>
				<prefix>
					<min>-1</min>
					<max>-1</max>
				</prefix>
				<prefix>
					<min>-1</min>
					<max>-1</max>
				</prefix>
			</prefixes>
			<url method="overlay"/>
			<hidden-fields>
				<card-brands>'VISA','MASTERCARD'</card-brands>
				<merchant-request-id>[transaction-id]</merchant-request-id>
				<gatewayMerchantId>[merchant-id]</gatewayMerchantId>
				<gateway>cellpointmobile</gateway>
				<tokenizationType>PAYMENT_GATEWAY</tokenizationType>
				<currency-code>PHP</currency-code>
				<amount>11232.00</amount>
				<environment>TEST</environment>
				<mode>1</mode>
				<payment-methods>'PAN_ONLY'</payment-methods>
				<countryCode>PH</countryCode>
				<merchantName>[Merchant Name]</merchantName>
			</hidden-fields>
			<return-url>[return url]</return-url>
        </card>
	</wallets>
</root>

The following fields in this Initialize response are required to process this response on the web (in step 2 of this guide):

FieldFormatParentsDescription
headStringroot: wallets: cardYou will use the entire contents of the head tag in your payment page.
bodyStringroot: wallets: cardYou will separate the contents of body into these two parts, and you will include each in its own script element:
• a Google Pay script
• A JavaScript snippet
The JS snippet helps to display the Google Pay button and eventually trigger Google Pay payment.

The following fields in this Initialize response are required to call /mpoint/authorize (in step 4 of this guide):

FieldFormatParentsDescription
idPositive Integerroot: transactionA unique transaction ID generated for the Initialize Payment request. This identifies a transaction within CellPoint Digital's systems.
type-idPositive Integerroot: wallets: cardA unique ID that identifies the payment methods configured. type-id = 41 indicates the internal ID defined for Google Pay payment method.

2. Add the initialization information to your page

To process the initialize response on the web, parse the Initialize response and capture the contents of the <head> and <body> elements. Add the scripts to the <head> and <body> elements of your website as shown in the example below:

<!DOCTYPE html>
<html lang="en">
  <head>
    <script>var baseRequest={apiVersion: 2, apiVersionMinor: 0 };var allowedCardAuthMethods=['PAN_ONLY','CRYPTOGRAM_3DS'];var allowedCardNetworks=['MASTERCARD','DISCOVER','AMEX','VISA'];var assuranceDetailsRequired=true;var tokenizationSpecification={type:'PAYMENT_GATEWAY',parameters:{'gateway':'cellpointmobile','gatewayMerchantId':'10106'}};var baseCardPaymentMethod={type:'CARD',parameters:{allowedAuthMethods:allowedCardAuthMethods,allowedCardNetworks:allowedCardNetworks,assuranceDetailsRequired:assuranceDetailsRequired}};var cardPaymentMethod=Object.assign({},baseCardPaymentMethod,{tokenizationSpecification:tokenizationSpecification});let paymentsClient=null;function getGoogleIsReadyToPayRequest(){return Object.assign({},baseRequest,{allowedPaymentMethods:[baseCardPaymentMethod]})} function getGooglePaymentDataRequest(){var paymentDataRequest=Object.assign({},baseRequest);paymentDataRequest.allowedPaymentMethods=[cardPaymentMethod];paymentDataRequest.transactionInfo=getGoogleTransactionInfo();paymentDataRequest.merchantInfo={ merchantName:'Virgin Holidays'};return paymentDataRequest} function getGooglePaymentsClient(){if(paymentsClient===null){return(new google.payments.api.PaymentsClient({environment:'TEST'}));}} function getGoogleTransactionInfo(){return{countryCode:'GB',currencyCode:'USD',totalPriceStatus:'FINAL',totalPrice:'152.00'}}</script>
  </head>
  <body>
    <script async="true" src="https://pay.google.com/gp/p/js/pay.js"></script>
    <script async="true" src="https://storage.googleapis.com/bkt-cp-sit-ehpp2/10106/js/googlepay.js"></script>
  </body>
</html>

The script in the head element sets certain options relevant to your Google Pay configuration. You will call functions from the two scripts in body to send transaction data.

3. Add the Google Pay button to your page

3a. Add a <div> container for the Google Pay button and assign it an id

To display a Google Pay button on your page, add <div id=gpay-container-id /> to the page’s HTML. Assign a value to the id attribute of the <div> element. You will reference the id value in subsequent steps.

3b. Create an addGooglePayButton function

Write a function that configures the Google Pay button. The addGooglePayButton() function must accept the button container ID (gpay-container-id) and the name of your paymentCallback function as parameters, as shown in the example below:

function addGooglePayButton (gpay-container-id, paymentCallback) {
	const paymentsClient = getGooglePaymentsClient();
	const button =
		paymentsClient.createButton({
		buttonColor: 'default',
		buttonType: 'buy',
		onClick: () => onGooglePaymentButtonClicked(paymentCallback) });
	container.appendChild(button);
}

The addGooglePayButton() function should perform the following actions:

  • Call the getGooglePaymentsClient() function.
  • Set the values of these createButton properties: buttonColor and buttonType.
  • Use the onClick() event to call the the onGooglePaymentButtonClicked() function with the name of your paymentCallback function as a parameter. The onGooglePaymentButtonClicked() function is part of the CellPoint Digital Google Pay Javascript library, which you included in step 2.

The paymentCallback function accepts four parameters: paymentToken, paymentNetwork, preauthenticated, and billingAddress. CellPoint Digital will call the paymentCallback function to send you transaction details that CellPoint Digital receives from Google. See step 4 for details.

3c. Call the addGooglePayButton function

On the onLoad event, call the addGooglePayButton() function with gpay-container-id and the name of your callback function as parameter, as shown in the sample code below:

<body>
  <div id={gpay-container-id} /}>
    <script>
    	function onLoad{window.addGooglePayButton(gpay-container-id, paymentCallback )}
    </script>
</body>

Calling addGooglePayButton() adds a functioning Google Pay button to your page as shown below:

4. Send an Authorize request to the CellPoint Digital API

Endpoint: /mpoint/authorize-payment
Method: POST

When the customer clicks the Google Pay button, the application calls the function onGooglePaymentButtonClicked(), and CellPoint Digital returns Google Pay data to the paymentCallback() function that you specified previously.

Write a paymentCallback() function that sends a POST request to the /mpoint/authorize-payment endpoint of the CellPoint Digital API with the paymentToken, paymentNetwork, preauthenticated, and billingAddress data in the body of the request. Below is an example of what this might look like:

function paymentCallback(paymentToken, paymentNetwork, preauthenticated, billingAddress) {
    const url = "https://your-api.com/authorize"; 

    const data = {
        cardtypeid: "GPAY_WALLET",
        token: paymentToken,
        network: paymentNetwork.toLowerCase(),
        preauthenticated: String(preauthenticated).toLowerCase(),
        billingInfo: billingAddress || ""
    };

    fetch(url, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify(data)
    })
    .then(response => response.json())
    .then(data => {
        console.log('Payment Authorization Successful:', data);
    })
    .catch(error => {
        console.error('Error:', error);
    });
}

The example below shows a sample body of an Authorize request. It should include the transaction: id and card: type-id data from the Initialize response:

<?xml version="1.0" encoding="UTF-8"?>
<root>
	<authorize-payment account="[integer]" client-id="[integer]">
		<transaction type-id="[integer]" id="[integer]" store-card="false"  >
			<card  type-id="41" network="visa">
				<amount country-id="[integer]" currency-id="[integer]" >100</amount>
				<token>eyJzaWduYXR1cmUiOiJNRVlDSVFEK1BndVJMeWYrZTRsOGp3UW9DWUwza1pyN0NNZ3dnaDZYdmRHQmtWYnNMd0loQUt6ZkdrZm1kc3NmaVY3b1BuSzU4Rk94c0JBNTVNQVRVbDB2ODZqcDR3QnYiLCJwcm90b2NvbFZlcnNpb24iOiJFQ3YxIiwic2lnbmVkTWVzc2FnZSI6IntcImVuY3J5cHRlZE1lc3NhZ2VcIjpcImdaalpLZzdwdjcxOTM5V3htZEZDRmpPRDU3QlVuZWV5TGJJdUFvOTQxcXBFNFE4SEZoQTNyNzF4RUpyQnFvU2hQUS9KcUlFdW9KSThUU2ExWGF2RE1TK3dpSURTcTg4cG9QcjlFVDBqSWQ2Ukl5b0xYQlVzMTZNYkM5cmljdU9rdGY3NGRTNDJpd2YyZHY3QkhTQmZhUDdkK1laU2V0Y0F1Y2FicmY5RWliam8wUVN4YndKVHdodjlNK0dUK3lXUlZpdFNlbE80L1JZYUkvUWxkUGtINGZISmUzalorSEpnS0RMQ0NOSmtZaXR0SHNUak5mSy9LdThHeCtEM3pTT1ZuUmF3YVd5SFVkdkFHVW90aFJWUG1VSlhpWHZFZVYveTZZaUNzZzJKVlF4b1dzOWNYWitGNTFnUGpUSGY4WFhib3FpMmNnSXBMM3ZVRW1DTjU5TFV4Uzh0MVMzQThzRHhVUU5nQUttUzNWUmlVZnVmQXNHYW5GZnlQcnNtK0w0cVV4eTF0ajdXZjBoc0ZlcHF2NWNMbkpMNEZhSmpxNzFsMkpBNTZwRXhPcFdmR2MyMkFRc2hldk9YOHNrcDM3RmxcIixcImVwaGVtZXJhbFB1YmxpY0tleVwiOlwiQkw0amJqallWalRSdHNySnpLRWR0TUwvajNEalNiZm9JUGhxOGdGRGdkY05HclUzcHViMUg3YXVkZURMV0g2TVJJUFgrT2lybzJ0eUZiMkRwWWpyZ3FjXFx1MDAzZFwiLFwidGFnXCI6XCJocFVyaXN0TkpsTkhITDJxUkdVRm5kQmFsaVdzMVpKemc5RitiMFpEbW8wXFx1MDAzZFwifSJ9</token>
				<pre_authenticated>false</pre_authenticated>
			</card>
			<hmac>ab600de0561ffb023c94e17a7758d4bf3e936fc0104d27c13c31ccf2bba85a78202df3bd5b1160adb3b7bdfd2a2e0b2fad602a8a3272dbb8417d506ac8e82739</hmac>
		</transaction>
		<auth-token>success</auth-token>
		<client-info language="en" sdk-version="1.43" version="1.43" platform="HTML5" profileid="[profile-id]" >
			<mobile operator-id="[integer]" country-id="[integer]">[mobile-number]</mobile>
			<email>[email]</email>
			<customer-ref>[customer-ref]</customer-ref>
			<ip>223.233.86.236</ip>
		</client-info>
	</authorize-payment>
</root>

See our Authorize API reference for more information about this request.

5. Confirm success

For Google Pay, you may receive one of two types of response. This depends on the data from the Google Pay wallet.

Response: Case 1

The CellPoint Velocity server sends the response informing if the transaction authorization was a success or a failure. The example below shows a sample Authorize success response:

<?xml version="1.0" encoding="UTF-8"?>
<root>
	<status code="2000" sub-code="2000101">Payment authorized</status>
</root>

See our Authorize API reference for more information about this response.

Response: Case 2

In some cases, you may receive the parse challenge from the provider, where the user must complete the parsed challenge to complete the transaction.


Google Pay is a trademark of Google LLC.


\",\n \"auth_token\": \"Auth-Token\",\n \"text\": \"Google Pay\"\n}\n```\n```xml XML response for a Native APP channel\n\n\n\t\n\t\tTest\n\t\t[merchant URL for callback]\n\t\t\n\t\n\t\n\t\t10025\n\t\t30206172\n\t\t[CALLBACK URL]\n\t\t\n\t\n\t\n\t\t10025\n\t\n\t\n\t\t\n\t\t\tGoogle Pay\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t-1\n\t\t\t\t\t-1\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t-1\n\t\t\t\t\t-1\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t'VISA','MASTERCARD'\n\t\t\t\t[transaction-id]\n\t\t\t\t[merchant-id]\n\t\t\t\tcellpointmobile\n\t\t\t\tPAYMENT_GATEWAY\n\t\t\t\tPHP\n\t\t\t\t11232.00\n\t\t\t\tTEST\n\t\t\t\t1\n\t\t\t\t'PAN_ONLY'\n\t\t\t\tPH\n\t\t\t\t[Merchant Name]\n\t\t\t\n\t\t\t[return url]\n \n\t\n\n```\n\nThe following fields in this Initialize response are required to process this response on the web (in step 2 of this guide):\n\n[block:parameters]\n{\n \"data\": {\n \"h-0\": \"Field\",\n \"h-1\": \"Format\",\n \"h-2\": \"Parents\",\n \"h-3\": \"Description\",\n \"0-0\": \"`head`\",\n \"0-1\": \"String\",\n \"0-2\": \"`root: wallets: card`\",\n \"0-3\": \"You will use the entire contents of the `head` tag in your payment page.\",\n \"1-0\": \"`body`\",\n \"1-1\": \"String\",\n \"1-2\": \"`root: wallets: card`\",\n \"1-3\": \"You will separate the contents of `body` into these two parts, and you will include each in its own `script` element:
• a Google Pay script
• A JavaScript snippet
The JS snippet helps to display the Google Pay button and eventually trigger Google Pay payment.\"\n },\n \"cols\": 4,\n \"rows\": 2,\n \"align\": [\n \"left\",\n \"left\",\n \"left\",\n null\n ]\n}\n[/block]\n\n\nThe following fields in this Initialize response are required to call `/mpoint/authorize` (in step 4 of this guide):\n\n| Field | Format | Parents | Description |\n| :-------- | :--------------- | :-------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |\n| `id` | Positive Integer | `root: transaction` | A unique transaction ID generated for the Initialize Payment request. This identifies a transaction within CellPoint Digital's systems. |\n| `type-id` | Positive Integer | `root: wallets: card` | A unique ID that identifies the payment methods configured. `type-id = 41` indicates the internal ID defined for Google Pay payment method. |\n\n## 2. Add the initialization information to your page\n\nTo process the initialize response on the web, parse the Initialize response and capture the contents of the `` and `` elements. Add the scripts to the `` and `` elements of your website as shown in the example below:\n\n```html\n\n\n \n \n \n \n \n \n \n\n```\n\nThe script in the `head` element sets certain options relevant to your Google Pay configuration. You will call functions from the two scripts in `body` to send transaction data.\n\n## 3. Add the Google Pay button to your page\n\n### 3a. Add a `
` container for the Google Pay button and assign it an `id`\n\nTo display a Google Pay button on your page, add `
` to the page’s HTML. Assign a value to the `id` attribute of the `
` element. You will reference the `id` value in subsequent steps.\n\n### 3b. Create an `addGooglePayButton` function\n\nWrite a function that configures the Google Pay button. The `addGooglePayButton()` function must accept the button container ID (`gpay-container-id`) and the name of your `paymentCallback` function as parameters, as shown in the example below:\n\n```javascript\nfunction addGooglePayButton (gpay-container-id, paymentCallback) {\n\tconst paymentsClient = getGooglePaymentsClient();\n\tconst button =\n\t\tpaymentsClient.createButton({\n\t\tbuttonColor: 'default',\n\t\tbuttonType: 'buy',\n\t\tonClick: () => onGooglePaymentButtonClicked(paymentCallback) });\n\tcontainer.appendChild(button);\n}\n```\n\nThe `addGooglePayButton()` function should perform the following actions:\n\n- Call the `getGooglePaymentsClient()` function.\n- Set the values of these `createButton` properties: `buttonColor` and `buttonType`.\n- Use the `onClick()` event to call the the `onGooglePaymentButtonClicked()` function with the name of your `paymentCallback` function as a parameter. The `onGooglePaymentButtonClicked()` function is part of the CellPoint Digital Google Pay Javascript library, which you included in step 2.\n\nThe `paymentCallback` function accepts four parameters: `paymentToken`, `paymentNetwork`, `preauthenticated`, and `billingAddress`. CellPoint Digital will call the `paymentCallback` function to send you transaction details that CellPoint Digital receives from Google. See step 4 for details.\n\n### 3c. Call the `addGooglePayButton` function\n\nOn the `onLoad` event, call the `addGooglePayButton()` function with `gpay-container-id` and the name of your callback function as parameter, as shown in the sample code below:\n\n```html\n\n
\n \n\n```\n\nCalling `addGooglePayButton()` adds a functioning Google Pay button to your page as shown below:\n\n[block:image]\n{\n \"images\": [\n {\n \"image\": [\n \"https://files.readme.io/3eb7ced791f5e77ea4a1b195213f968253cc55d5ee59f89d526a8303b9c22761-google-pay-button.jpg\",\n null,\n \"\"\n ],\n \"align\": \"center\",\n \"sizing\": \"600px\"\n }\n ]\n}\n[/block]\n\n\n## 4. Send an Authorize request to the CellPoint Digital API\n\n**Endpoint:** `/mpoint/authorize-payment` \n**Method:** `POST`\n\nWhen the customer clicks the Google Pay button, the application calls the function `onGooglePaymentButtonClicked()`, and CellPoint Digital returns Google Pay data to the `paymentCallback()` function that you specified previously.\n\nWrite a `paymentCallback()` function that sends a POST request to the `/mpoint/authorize-payment` endpoint of the CellPoint Digital API with the `paymentToken`, `paymentNetwork`, `preauthenticated`, and `billingAddress` data in the body of the request. Below is an example of what this might look like:\n\n```javascript\nfunction paymentCallback(paymentToken, paymentNetwork, preauthenticated, billingAddress) {\n const url = \"https://your-api.com/authorize\"; \n\n const data = {\n cardtypeid: \"GPAY_WALLET\",\n token: paymentToken,\n network: paymentNetwork.toLowerCase(),\n preauthenticated: String(preauthenticated).toLowerCase(),\n billingInfo: billingAddress || \"\"\n };\n\n fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(data)\n })\n .then(response => response.json())\n .then(data => {\n console.log('Payment Authorization Successful:', data);\n })\n .catch(error => {\n console.error('Error:', error);\n });\n}\n```\n\nThe example below shows a sample body of an Authorize request. It should include the `transaction: id` and `card: type-id` data from the Initialize response:\n\n```xml\n\n\n\t\n\t\t\n\t\t\t\n\t\t\t\t100\n\t\t\t\teyJzaWduYXR1cmUiOiJNRVlDSVFEK1BndVJMeWYrZTRsOGp3UW9DWUwza1pyN0NNZ3dnaDZYdmRHQmtWYnNMd0loQUt6ZkdrZm1kc3NmaVY3b1BuSzU4Rk94c0JBNTVNQVRVbDB2ODZqcDR3QnYiLCJwcm90b2NvbFZlcnNpb24iOiJFQ3YxIiwic2lnbmVkTWVzc2FnZSI6IntcImVuY3J5cHRlZE1lc3NhZ2VcIjpcImdaalpLZzdwdjcxOTM5V3htZEZDRmpPRDU3QlVuZWV5TGJJdUFvOTQxcXBFNFE4SEZoQTNyNzF4RUpyQnFvU2hQUS9KcUlFdW9KSThUU2ExWGF2RE1TK3dpSURTcTg4cG9QcjlFVDBqSWQ2Ukl5b0xYQlVzMTZNYkM5cmljdU9rdGY3NGRTNDJpd2YyZHY3QkhTQmZhUDdkK1laU2V0Y0F1Y2FicmY5RWliam8wUVN4YndKVHdodjlNK0dUK3lXUlZpdFNlbE80L1JZYUkvUWxkUGtINGZISmUzalorSEpnS0RMQ0NOSmtZaXR0SHNUak5mSy9LdThHeCtEM3pTT1ZuUmF3YVd5SFVkdkFHVW90aFJWUG1VSlhpWHZFZVYveTZZaUNzZzJKVlF4b1dzOWNYWitGNTFnUGpUSGY4WFhib3FpMmNnSXBMM3ZVRW1DTjU5TFV4Uzh0MVMzQThzRHhVUU5nQUttUzNWUmlVZnVmQXNHYW5GZnlQcnNtK0w0cVV4eTF0ajdXZjBoc0ZlcHF2NWNMbkpMNEZhSmpxNzFsMkpBNTZwRXhPcFdmR2MyMkFRc2hldk9YOHNrcDM3RmxcIixcImVwaGVtZXJhbFB1YmxpY0tleVwiOlwiQkw0amJqallWalRSdHNySnpLRWR0TUwvajNEalNiZm9JUGhxOGdGRGdkY05HclUzcHViMUg3YXVkZURMV0g2TVJJUFgrT2lybzJ0eUZiMkRwWWpyZ3FjXFx1MDAzZFwiLFwidGFnXCI6XCJocFVyaXN0TkpsTkhITDJxUkdVRm5kQmFsaVdzMVpKemc5RitiMFpEbW8wXFx1MDAzZFwifSJ9\n\t\t\t\tfalse\n\t\t\t\n\t\t\tab600de0561ffb023c94e17a7758d4bf3e936fc0104d27c13c31ccf2bba85a78202df3bd5b1160adb3b7bdfd2a2e0b2fad602a8a3272dbb8417d506ac8e82739\n\t\t\n\t\tsuccess\n\t\t\n\t\t\t[mobile-number]\n\t\t\t[email]\n\t\t\t[customer-ref]\n\t\t\t223.233.86.236\n\t\t\n\t\n\n```\n\nSee our [Authorize](doc:authorization) API reference for more information about this request.\n\n## 5. Confirm success\n\nFor Google Pay, you may receive one of two types of response. This depends on the data from the Google Pay wallet.\n\n### Response: Case 1\n\nThe CellPoint Velocity server sends the response informing if the transaction authorization was a success or a failure. The example below shows a sample Authorize success response:\n\n```xml\n\n\n\tPayment authorized\n\n```\n\nSee our [Authorize](doc:authorization) API reference for more information about this response.\n\n### Response: Case 2\n\nIn some cases, you may receive the parse challenge from the provider, where the user must complete the parsed challenge to complete the transaction.\n\n
\n\nGoogle Pay is a trademark of Google LLC.","dehydrated":{"toc":"","body":"

This page provides a guide to integrating Google Pay with CellPoint Velocity API, which lets a customer use a payment method saved to their Google Pay account.

\n

Onboarding Checklist

\n

The following table shows the onboarding responsibilities belonging to CellPoint Digital, Google, and you the merchant:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
OwnerOwner ResponsibilitiesDetails
CellPoint Digital• Client onboarding and configuration
• Merchant onboarding with Google
• Client setup - account and client ID
• API authorization credentials
• Configure redirect URLs for successful and failed transactions
• API version
• Supported country ID list
• Gateway ID: cellpointmobile
Merchant / GoogleProduction validation by Google• Obtain merchant ID from Google
• Merchant to contact Google for validation of the integration
• Follow this link to request production access
\n

Google Pay Requirements

\n

Before you start integration, you must follow the Google Web Integration checklist and brand guidelines as follows:

\n\n

Workflow

\n

When using Google Pay with CellPoint Velocity API, the workflow is as follows:

\n
    \n
  1. The customer navigates to the merchant's payment/checkout page.
  2. \n
  3. While loading the checkout page, the merchant sends an Initialize request.
  4. \n
  5. The API returns an Initialize response with information for Google Pay.
  6. \n
  7. The merchant loads information from the Initialize response into the page’s HTML during page load.
  8. \n
  9. When the customer selects the Google Pay button, Google sends payment data to the merchant.
  10. \n
  11. The merchant uses the received payment data to send an Authorize request.
  12. \n
  13. The API returns a successful Authorize response, which confirms the success of the payment.
  14. \n
\n

Integration

\n

Complete the following steps to use Google Pay with your integration.

\n

1. Initialize a payment

\n

Endpoint: /mpoint/initialize-payment
\nMethod: POST

\n

Once the page has loaded, send a POST request to the /mpoint/initialize-payment endpoint of the CellPoint Digital API. For more information, see our Initialize API reference.

\n

The code below is an example Initialize request body:

\n
<?xml version="1.0" encoding="UTF-8"?>\n<root>\n\t<initialize-payment account="[integer]" client-id="[integer]">\n\t\t<transaction order-no="CPM1601976034055" type-id="[integer]" >\n\t\t\t<amount currency-id="[integer]" countryid="[integer]">100</amount>\n\t\t</transaction>\n\t\t<client-info language="en" app-version="1.43" sdk-version="1.43" version="1.43" platform="HTML5">\n\t\t\t<mobile operator-id="[integer]" country-id="200">[mobile number]</mobile>\n\t\t\t<email>[email]</email>\n\t\t\t<customer-ref>[customer-ref]</customer-ref>\n\t\t</client-info>\n\t</initialize-payment>\n</root>\n
\n

Below is a sample Initialize response when using Google Pay. Note that, in root: wallets: card: name, the text content is set to Google Pay.

\n
<?xml version="1.0" encoding="UTF-8"?>\n<root>\n\t<client-config account="[integer]" auto-capture="false" id="[integer]" mode="[integer]" store-card="[integer]">\n\t\t<name>Test</name>\n\t\t<callback-url>[merchant URL for callback]</callback-url>\n\t\t<accept-url/>\n\t</client-config>\n\t<transaction auto-capture="true" eua-id="[integer]" id="[integer]" language="en" mode="1" order-no="" type-id="[integer]">\n\t\t<amount country-id="[integer]" currency="DKK" format="{PRICE} {CURRENCY}" symbol="">10025</amount>\n\t\t<mobile country-id="[integer]" operator-id="[integer]">30206172</mobile>\n\t\t<callback-url>[CALLBACK URL]</callback-url>\n\t\t<accept-url/>\n\t</transaction>\n\t<session id="6143" total-amount="1" type="1">\n\t\t<amount alpha2code="US" alpha3code="USA" code="840" country-id="200" currency="" currency-id="0" format="{CURRENCY}{PRICE}" symbol="$">10025</amount>\n\t</session>\n\t<wallets>\n\t\t<card cvc-length="-1" cvcmandatory="false" dcc="false" enabled="true" id="41" installment="0" max-length="-1" min-length="-1" payment-type="3" preferred="false" presentment-currency="false" processor-type="3" psp-id="-1" state-id="1" type-id="41">\n\t\t\t<name>Google Pay</name>\n\t\t\t<prefixes>\n\t\t\t\t<prefix id="200">\n\t\t\t\t\t<min>-1</min>\n\t\t\t\t\t<max>-1</max>\n\t\t\t\t</prefix>\n\t\t\t\t<prefix id="202">\n\t\t\t\t\t<min>-1</min>\n\t\t\t\t\t<max>-1</max>\n\t\t\t\t</prefix>\n\t\t\t</prefixes>\n\t\t\t<url method="overlay"/>\n\t\t\t<head>&lt;script&gt;var baseRequest={apiVersion: 2, apiVersionMinor: 0 };var allowedCardAuthMethods=['PAN_ONLY','CRYPTOGRAM_3DS'];var allowedCardNetworks=['MASTERCARD','DISCOVER','VISA','AMEX'];var assuranceDetailsRequired=true;var tokenizationSpecification={type:'PAYMENT_GATEWAY',parameters:{'gateway':'cellpointmobile','gatewayMerchantId':'10106'}};var baseCardPaymentMethod={type:'CARD',parameters:{allowedAuthMethods:allowedCardAuthMethods,allowedCardNetworks:allowedCardNetworks,assuranceDetailsRequired:assuranceDetailsRequired}};var cardPaymentMethod=Object.assign({},baseCardPaymentMethod,{tokenizationSpecification:tokenizationSpecification});let paymentsClient=null;function getGoogleIsReadyToPayRequest(){return Object.assign({},baseRequest,{allowedPaymentMethods:[baseCardPaymentMethod]})} function getGooglePaymentDataRequest(){var paymentDataRequest=Object.assign({},baseRequest);paymentDataRequest.allowedPaymentMethods=[cardPaymentMethod];paymentDataRequest.transactionInfo=getGoogleTransactionInfo();paymentDataRequest.merchantInfo={ merchantName:'Virgin Holidays'};return paymentDataRequest} function getGooglePaymentsClient(){if(paymentsClient===null){return(new google.payments.api.PaymentsClient({environment:'TEST'}));}} function getGoogleTransactionInfo(){return{countryCode:'GB',currencyCode:'GBP',totalPriceStatus:'FINAL',totalPrice:'152.00'}}</head>\n\t\t\t<body>&lt;script async="true" src="https://myurl/js/googlepay.js"&gt;&lt;/script&gt; &lt;script async="true" src="https://pay.google.com/gp/p/js/pay.js"&gt;&lt;/script&gt;</body>\n\t\t\t<auth-token>Auth-Token</auth-token>\n\t\t</card>\n\t</wallets>\n</root>\n
{\n    "cvc_length": "-1",\n    "cvcmandatory": "false",\n    "dcc": "false",\n    "enabled": "true",\n    "id": "41",\n    "installment": "0",\n    "max_length": "-1",\n    "min_length": "-1",\n    "payment_type": "3",\n    "preferred": "false",\n    "presentment_currency": "false",\n    "processor_type": "3",\n    "psp_id": "-1",\n    "state_id": "1",\n    "type_id": "41",\n    "name": "Google Pay",\n    "prefixes": {\n        "prefix": [\n            {\n                "id": "200",\n                "min": "-1",\n                "max": "-1"\n            },\n            {\n                "id": "202",\n                "min": "-1",\n                "max": "-1"\n            }\n        ]\n    },\n    "url": {\n        "method": "overlay"\n    },\n    "head": "<script>var baseRequest={apiVersion: 2, apiVersionMinor: 0 };var allowedCardAuthMethods=[\\"PAN_ONLY\\",\\"CRYPTOGRAM_3DS\\"];var allowedCardNetworks=[\\"MASTERCARD\\",\\"DISCOVER\\",\\"AMEX\\",\\"VISA\\"];var assuranceDetailsRequired=true;var tokenizationSpecification={type:\\"PAYMENT_GATEWAY\\",parameters:{\\"gateway\\":\\"cellpointmobile\\",\\"gatewayMerchantId\\":\\"10106\\"}};var baseCardPaymentMethod={type:\\"CARD\\",parameters:{allowedAuthMethods:allowedCardAuthMethods,allowedCardNetworks:allowedCardNetworks,assuranceDetailsRequired:assuranceDetailsRequired}};var cardPaymentMethod=Object.assign({},baseCardPaymentMethod,{tokenizationSpecification:tokenizationSpecification});let paymentsClient=null;function getGoogleIsReadyToPayRequest(){return Object.assign({},baseRequest,{allowedPaymentMethods:[baseCardPaymentMethod]})} function getGooglePaymentDataRequest(){var paymentDataRequest=Object.assign({},baseRequest);paymentDataRequest.allowedPaymentMethods=[cardPaymentMethod];paymentDataRequest.transactionInfo=getGoogleTransactionInfo();paymentDataRequest.merchantInfo={ merchantName:\\"Virgin Holidays\\"};return paymentDataRequest} function getGooglePaymentsClient(){if(paymentsClient===null){return(new google.payments.api.PaymentsClient({environment:\\"TEST\\"}));}} function getGoogleTransactionInfo(){return{countryCode:\\"GB\\",currencyCode:\\"USD\\",totalPriceStatus:\\"FINAL\\",totalPrice:\\"152.00\\"}}",\n    "body": "<script async='true' src='https://storage.googleapis.com/bkt-cp-sit-ehpp2/10106/js/googlepay.js'></script> <script async='true' src='https://pay.google.com/gp/p/js/pay.js'></script>",\n    "auth_token": "Auth-Token",\n    "text": "Google Pay"\n}\n
<?xml version="1.0" encoding="UTF-8"?>\n<root>\n\t<client-config account="[integer]" auto-capture="false" id="[integer]" mode="[integer]" store-card="[integer]">\n\t\t<name>Test</name>\n\t\t<callback-url>[merchant URL for callback]</callback-url>\n\t\t<accept-url/>\n\t</client-config>\n\t<transaction auto-capture="true" eua-id="[integer]" id="[integer]" language="en" mode="1" order-no="" type-id="[integer]">\n\t\t<amount country-id="[integer]" currency="DKK" format="{PRICE} {CURRENCY}" symbol="">10025</amount>\n\t\t<mobile country-id="[integer]" operator-id="[integer]">30206172</mobile>\n\t\t<callback-url>[CALLBACK URL]</callback-url>\n\t\t<accept-url/>\n\t</transaction>\n\t<session id="6143" total-amount="1" type="1">\n\t\t<amount alpha2code="US" alpha3code="USA" code="840" country-id="200" currency="" currency-id="0" format="{CURRENCY}{PRICE}" symbol="$">10025</amount>\n\t</session>\n\t<wallets>\n\t\t<card cvc-length="-1" cvcmandatory="true" dcc="false" enabled="true" id="[Google Pay wallet type Id]" installment="0" max-length="-1" min-length="-1" payment-type="3" preferred="false" processor-type="3" psp-id="[ACQ ID]" state-id="1" type-id="[Google Pay wallet type Id]">\n\t\t\t<name>Google Pay</name>\n\t\t\t<prefixes>\n\t\t\t\t<prefix>\n\t\t\t\t\t<min>-1</min>\n\t\t\t\t\t<max>-1</max>\n\t\t\t\t</prefix>\n\t\t\t\t<prefix>\n\t\t\t\t\t<min>-1</min>\n\t\t\t\t\t<max>-1</max>\n\t\t\t\t</prefix>\n\t\t\t</prefixes>\n\t\t\t<url method="overlay"/>\n\t\t\t<hidden-fields>\n\t\t\t\t<card-brands>'VISA','MASTERCARD'</card-brands>\n\t\t\t\t<merchant-request-id>[transaction-id]</merchant-request-id>\n\t\t\t\t<gatewayMerchantId>[merchant-id]</gatewayMerchantId>\n\t\t\t\t<gateway>cellpointmobile</gateway>\n\t\t\t\t<tokenizationType>PAYMENT_GATEWAY</tokenizationType>\n\t\t\t\t<currency-code>PHP</currency-code>\n\t\t\t\t<amount>11232.00</amount>\n\t\t\t\t<environment>TEST</environment>\n\t\t\t\t<mode>1</mode>\n\t\t\t\t<payment-methods>'PAN_ONLY'</payment-methods>\n\t\t\t\t<countryCode>PH</countryCode>\n\t\t\t\t<merchantName>[Merchant Name]</merchantName>\n\t\t\t</hidden-fields>\n\t\t\t<return-url>[return url]</return-url>\n        </card>\n\t</wallets>\n</root>\n
\n

The following fields in this Initialize response are required to process this response on the web (in step 2 of this guide):

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FieldFormatParentsDescription
headStringroot: wallets: cardYou will use the entire contents of the head tag in your payment page.
bodyStringroot: wallets: cardYou will separate the contents of body into these two parts, and you will include each in its own script element:
• a Google Pay script
• A JavaScript snippet
The JS snippet helps to display the Google Pay button and eventually trigger Google Pay payment.
\n

The following fields in this Initialize response are required to call /mpoint/authorize (in step 4 of this guide):

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FieldFormatParentsDescription
idPositive Integerroot: transactionA unique transaction ID generated for the Initialize Payment request. This identifies a transaction within CellPoint Digital's systems.
type-idPositive Integerroot: wallets: cardA unique ID that identifies the payment methods configured. type-id = 41 indicates the internal ID defined for Google Pay payment method.
\n

2. Add the initialization information to your page

\n

To process the initialize response on the web, parse the Initialize response and capture the contents of the <head> and <body> elements. Add the scripts to the <head> and <body> elements of your website as shown in the example below:

\n
<!DOCTYPE html>\n<html lang="en">\n  <head>\n    <script>var baseRequest={apiVersion: 2, apiVersionMinor: 0 };var allowedCardAuthMethods=['PAN_ONLY','CRYPTOGRAM_3DS'];var allowedCardNetworks=['MASTERCARD','DISCOVER','AMEX','VISA'];var assuranceDetailsRequired=true;var tokenizationSpecification={type:'PAYMENT_GATEWAY',parameters:{'gateway':'cellpointmobile','gatewayMerchantId':'10106'}};var baseCardPaymentMethod={type:'CARD',parameters:{allowedAuthMethods:allowedCardAuthMethods,allowedCardNetworks:allowedCardNetworks,assuranceDetailsRequired:assuranceDetailsRequired}};var cardPaymentMethod=Object.assign({},baseCardPaymentMethod,{tokenizationSpecification:tokenizationSpecification});let paymentsClient=null;function getGoogleIsReadyToPayRequest(){return Object.assign({},baseRequest,{allowedPaymentMethods:[baseCardPaymentMethod]})} function getGooglePaymentDataRequest(){var paymentDataRequest=Object.assign({},baseRequest);paymentDataRequest.allowedPaymentMethods=[cardPaymentMethod];paymentDataRequest.transactionInfo=getGoogleTransactionInfo();paymentDataRequest.merchantInfo={ merchantName:'Virgin Holidays'};return paymentDataRequest} function getGooglePaymentsClient(){if(paymentsClient===null){return(new google.payments.api.PaymentsClient({environment:'TEST'}));}} function getGoogleTransactionInfo(){return{countryCode:'GB',currencyCode:'USD',totalPriceStatus:'FINAL',totalPrice:'152.00'}}</script>\n  </head>\n  <body>\n    <script async="true" src="https://pay.google.com/gp/p/js/pay.js"></script>\n    <script async="true" src="https://storage.googleapis.com/bkt-cp-sit-ehpp2/10106/js/googlepay.js"></script>\n  </body>\n</html>\n
\n

The script in the head element sets certain options relevant to your Google Pay configuration. You will call functions from the two scripts in body to send transaction data.

\n

3. Add the Google Pay button to your page

\n

3a. Add a <div> container for the Google Pay button and assign it an id

\n

To display a Google Pay button on your page, add <div id=gpay-container-id /> to the page’s HTML. Assign a value to the id attribute of the <div> element. You will reference the id value in subsequent steps.

\n

3b. Create an addGooglePayButton function

\n

Write a function that configures the Google Pay button. The addGooglePayButton() function must accept the button container ID (gpay-container-id) and the name of your paymentCallback function as parameters, as shown in the example below:

\n
function addGooglePayButton (gpay-container-id, paymentCallback) {\n\tconst paymentsClient = getGooglePaymentsClient();\n\tconst button =\n\t\tpaymentsClient.createButton({\n\t\tbuttonColor: 'default',\n\t\tbuttonType: 'buy',\n\t\tonClick: () => onGooglePaymentButtonClicked(paymentCallback) });\n\tcontainer.appendChild(button);\n}\n
\n

The addGooglePayButton() function should perform the following actions:

\n
    \n
  • Call the getGooglePaymentsClient() function.
  • \n
  • Set the values of these createButton properties: buttonColor and buttonType.
  • \n
  • Use the onClick() event to call the the onGooglePaymentButtonClicked() function with the name of your paymentCallback function as a parameter. The onGooglePaymentButtonClicked() function is part of the CellPoint Digital Google Pay Javascript library, which you included in step 2.
  • \n
\n

The paymentCallback function accepts four parameters: paymentToken, paymentNetwork, preauthenticated, and billingAddress. CellPoint Digital will call the paymentCallback function to send you transaction details that CellPoint Digital receives from Google. See step 4 for details.

\n

3c. Call the addGooglePayButton function

\n

On the onLoad event, call the addGooglePayButton() function with gpay-container-id and the name of your callback function as parameter, as shown in the sample code below:

\n
<body>\n  <div id={gpay-container-id} /}>\n    <script>\n    \tfunction onLoad{window.addGooglePayButton(gpay-container-id, paymentCallback )}\n    </script>\n</body>\n
\n

Calling addGooglePayButton() adds a functioning Google Pay button to your page as shown below:

\n\"\"\n

4. Send an Authorize request to the CellPoint Digital API

\n

Endpoint: /mpoint/authorize-payment
\nMethod: POST

\n

When the customer clicks the Google Pay button, the application calls the function onGooglePaymentButtonClicked(), and CellPoint Digital returns Google Pay data to the paymentCallback() function that you specified previously.

\n

Write a paymentCallback() function that sends a POST request to the /mpoint/authorize-payment endpoint of the CellPoint Digital API with the paymentToken, paymentNetwork, preauthenticated, and billingAddress data in the body of the request. Below is an example of what this might look like:

\n
function paymentCallback(paymentToken, paymentNetwork, preauthenticated, billingAddress) {\n    const url = "https://your-api.com/authorize"; \n\n    const data = {\n        cardtypeid: "GPAY_WALLET",\n        token: paymentToken,\n        network: paymentNetwork.toLowerCase(),\n        preauthenticated: String(preauthenticated).toLowerCase(),\n        billingInfo: billingAddress || ""\n    };\n\n    fetch(url, {\n        method: 'POST',\n        headers: {\n            'Content-Type': 'application/json',\n        },\n        body: JSON.stringify(data)\n    })\n    .then(response => response.json())\n    .then(data => {\n        console.log('Payment Authorization Successful:', data);\n    })\n    .catch(error => {\n        console.error('Error:', error);\n    });\n}\n
\n

The example below shows a sample body of an Authorize request. It should include the transaction: id and card: type-id data from the Initialize response:

\n
<?xml version="1.0" encoding="UTF-8"?>\n<root>\n\t<authorize-payment account="[integer]" client-id="[integer]">\n\t\t<transaction type-id="[integer]" id="[integer]" store-card="false"  >\n\t\t\t<card  type-id="41" network="visa">\n\t\t\t\t<amount country-id="[integer]" currency-id="[integer]" >100</amount>\n\t\t\t\t<token>eyJzaWduYXR1cmUiOiJNRVlDSVFEK1BndVJMeWYrZTRsOGp3UW9DWUwza1pyN0NNZ3dnaDZYdmRHQmtWYnNMd0loQUt6ZkdrZm1kc3NmaVY3b1BuSzU4Rk94c0JBNTVNQVRVbDB2ODZqcDR3QnYiLCJwcm90b2NvbFZlcnNpb24iOiJFQ3YxIiwic2lnbmVkTWVzc2FnZSI6IntcImVuY3J5cHRlZE1lc3NhZ2VcIjpcImdaalpLZzdwdjcxOTM5V3htZEZDRmpPRDU3QlVuZWV5TGJJdUFvOTQxcXBFNFE4SEZoQTNyNzF4RUpyQnFvU2hQUS9KcUlFdW9KSThUU2ExWGF2RE1TK3dpSURTcTg4cG9QcjlFVDBqSWQ2Ukl5b0xYQlVzMTZNYkM5cmljdU9rdGY3NGRTNDJpd2YyZHY3QkhTQmZhUDdkK1laU2V0Y0F1Y2FicmY5RWliam8wUVN4YndKVHdodjlNK0dUK3lXUlZpdFNlbE80L1JZYUkvUWxkUGtINGZISmUzalorSEpnS0RMQ0NOSmtZaXR0SHNUak5mSy9LdThHeCtEM3pTT1ZuUmF3YVd5SFVkdkFHVW90aFJWUG1VSlhpWHZFZVYveTZZaUNzZzJKVlF4b1dzOWNYWitGNTFnUGpUSGY4WFhib3FpMmNnSXBMM3ZVRW1DTjU5TFV4Uzh0MVMzQThzRHhVUU5nQUttUzNWUmlVZnVmQXNHYW5GZnlQcnNtK0w0cVV4eTF0ajdXZjBoc0ZlcHF2NWNMbkpMNEZhSmpxNzFsMkpBNTZwRXhPcFdmR2MyMkFRc2hldk9YOHNrcDM3RmxcIixcImVwaGVtZXJhbFB1YmxpY0tleVwiOlwiQkw0amJqallWalRSdHNySnpLRWR0TUwvajNEalNiZm9JUGhxOGdGRGdkY05HclUzcHViMUg3YXVkZURMV0g2TVJJUFgrT2lybzJ0eUZiMkRwWWpyZ3FjXFx1MDAzZFwiLFwidGFnXCI6XCJocFVyaXN0TkpsTkhITDJxUkdVRm5kQmFsaVdzMVpKemc5RitiMFpEbW8wXFx1MDAzZFwifSJ9</token>\n\t\t\t\t<pre_authenticated>false</pre_authenticated>\n\t\t\t</card>\n\t\t\t<hmac>ab600de0561ffb023c94e17a7758d4bf3e936fc0104d27c13c31ccf2bba85a78202df3bd5b1160adb3b7bdfd2a2e0b2fad602a8a3272dbb8417d506ac8e82739</hmac>\n\t\t</transaction>\n\t\t<auth-token>success</auth-token>\n\t\t<client-info language="en" sdk-version="1.43" version="1.43" platform="HTML5" profileid="[profile-id]" >\n\t\t\t<mobile operator-id="[integer]" country-id="[integer]">[mobile-number]</mobile>\n\t\t\t<email>[email]</email>\n\t\t\t<customer-ref>[customer-ref]</customer-ref>\n\t\t\t<ip>223.233.86.236</ip>\n\t\t</client-info>\n\t</authorize-payment>\n</root>\n
\n

See our Authorize API reference for more information about this request.

\n

5. Confirm success

\n

For Google Pay, you may receive one of two types of response. This depends on the data from the Google Pay wallet.

\n

Response: Case 1

\n

The CellPoint Velocity server sends the response informing if the transaction authorization was a success or a failure. The example below shows a sample Authorize success response:

\n
<?xml version="1.0" encoding="UTF-8"?>\n<root>\n\t<status code="2000" sub-code="2000101">Payment authorized</status>\n</root>\n
\n

See our Authorize API reference for more information about this response.

\n

Response: Case 2

\n

In some cases, you may receive the parse challenge from the provider, where the user must complete the parsed challenge to complete the transaction.

\n
\n

Google Pay is a trademark of Google LLC.

"},"mdx":false,"opts":{"alwaysThrow":false,"compatibilityMode":false,"copyButtons":true,"correctnewlines":false,"markdownOptions":{"fences":true,"commonmark":true,"gfm":true,"ruleSpaces":false,"listItemIndent":"1","spacedTable":true,"paddedTable":true},"normalize":true,"lazyImages":true,"reusableContent":{"tags":{}},"safeMode":false,"settings":{"position":true},"theme":"light","customBlocks":{},"resourceID":"683f3826ef2131005dc4aa74","resourceType":"page","baseUrl":"/","terms":[{"_id":"65df740c7c4f340018cb407a","term":"HPP","definition":"Hosted Payment Pages"},{"_id":"65df74177c4f340018cb429f","term":"PSP","definition":"Payment Service Provider"},{"_id":"65df74258dd4bf0ee8d44494","term":"ACQ","definition":"Acquirer"}],"variables":{"user":{},"defaults":[{"source":"security","type":"oauth2","_id":"685aab9a0e9689004bb02198","name":"cpdIssuedJWT","apiSetting":"685aab990e9689004bb02194"},{"source":"security","type":"http","_id":"685aab9a0e9689004bb02197","name":"merchantIssuedJWT","scheme":"bearer","apiSetting":"685aab990e9689004bb02194"}]}},"terms":[{"_id":"65df740c7c4f340018cb407a","term":"HPP","definition":"Hosted Payment Pages"},{"_id":"65df74177c4f340018cb429f","term":"PSP","definition":"Payment Service Provider"},{"_id":"65df74258dd4bf0ee8d44494","term":"ACQ","definition":"Acquirer"}],"variables":{"user":{},"defaults":[{"source":"security","type":"oauth2","_id":"685aab9a0e9689004bb02198","name":"cpdIssuedJWT","apiSetting":"685aab990e9689004bb02194"},{"source":"security","type":"http","_id":"685aab9a0e9689004bb02197","name":"merchantIssuedJWT","scheme":"bearer","apiSetting":"685aab990e9689004bb02194"}]}},"doc":{"metadata":{"image":[],"title":"","description":"","keywords":"","robots":"index"},"mdx":{"altBody":"","status":"rdmd"},"api":{"method":"get","url":"","auth":"required","params":[]},"next":{"description":"","pages":[]},"algolia":{"publishPending":false,"recordCount":15,"updatedAt":"2025-07-14T20:37:24.295Z","translationFailure":false},"_id":"683f3826ef2131005dc4aa74","title":"Google Pay™","icon":"","updates":[],"type":"basic","slug":"google-pay-digital-wallet","excerpt":"Google Pay Integration Guide for CellPoint Velocity API","body":"This page provides a guide to integrating Google Pay with CellPoint Velocity API, which lets a customer use a payment method saved to their Google Pay account.\n\n# Onboarding Checklist\n\nThe following table shows the onboarding responsibilities belonging to CellPoint Digital, Google, and you the merchant:\n\n[block:parameters]\n{\n \"data\": {\n \"h-0\": \"Owner\",\n \"h-1\": \"Owner Responsibilities\",\n \"h-2\": \"Details\",\n \"0-0\": \"CellPoint Digital\",\n \"0-1\": \"• Client onboarding and configuration
• Merchant onboarding with Google\",\n \"0-2\": \"• Client setup - account and client ID
• API authorization credentials
• Configure redirect URLs for successful and failed transactions
• API version
• Supported country ID list
• Gateway ID: `cellpointmobile`\",\n \"1-0\": \"Merchant / Google\",\n \"1-1\": \"Production validation by Google\",\n \"1-2\": \"• Obtain merchant ID from Google
• Merchant to contact Google for validation of the integration
• Follow this link to [request production access](https://developers.google.com/pay/api/android/guides/test-and-deploy/request-prod-access)\"\n },\n \"cols\": 3,\n \"rows\": 2,\n \"align\": [\n null,\n null,\n null\n ]\n}\n[/block]\n\n\n# Google Pay Requirements\n\nBefore you start integration, you must follow the Google Web Integration checklist and brand guidelines as follows:\n\n- [Overview](https://developers.google.com/pay/api/web/overview)\n- [Integration checklist](https://developers.google.com/pay/api/web/guides/test-and-deploy/integration-checklist)\n- [Brand guidelines](https://developers.google.com/pay/api/web/guides/brand-guidelines)\n\n# Workflow\n\nWhen using Google Pay with CellPoint Velocity API, the workflow is as follows:\n\n1. The customer navigates to the merchant's payment/checkout page.\n2. While loading the checkout page, the merchant sends an Initialize request.\n3. The API returns an Initialize response with information for Google Pay. \n4. The merchant loads information from the Initialize response into the page’s HTML during page load.\n5. When the customer selects the Google Pay button, Google sends payment data to the merchant.\n6. The merchant uses the received payment data to send an Authorize request.\n7. The API returns a successful Authorize response, which confirms the success of the payment. \n\n# Integration\n\nComplete the following steps to use Google Pay with your integration.\n\n## 1. Initialize a payment\n\n**Endpoint:** `/mpoint/initialize-payment` \n**Method:** `POST`\n\nOnce the page has loaded, send a POST request to the `/mpoint/initialize-payment` endpoint of the CellPoint Digital API. For more information, see our [Initialize](doc:initialize) API reference. \n\nThe code below is an example Initialize request body:\n\n```xml\n\n\n\t\n\t\t\n\t\t\t100\n\t\t\n\t\t\n\t\t\t[mobile number]\n\t\t\t[email]\n\t\t\t[customer-ref]\n\t\t\n\t\n\n```\n\nBelow is a sample Initialize response when using Google Pay. Note that, in `root: wallets: card: name`, the text content is set to `Google Pay`.\n\n```xml XML response for a WEB channel\n\n\n\t\n\t\tTest\n\t\t[merchant URL for callback]\n\t\t\n\t\n\t\n\t\t10025\n\t\t30206172\n\t\t[CALLBACK URL]\n\t\t\n\t\n\t\n\t\t10025\n\t\n\t\n\t\t\n\t\t\tGoogle Pay\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t-1\n\t\t\t\t\t-1\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t-1\n\t\t\t\t\t-1\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t<script>var baseRequest={apiVersion: 2, apiVersionMinor: 0 };var allowedCardAuthMethods=['PAN_ONLY','CRYPTOGRAM_3DS'];var allowedCardNetworks=['MASTERCARD','DISCOVER','VISA','AMEX'];var assuranceDetailsRequired=true;var tokenizationSpecification={type:'PAYMENT_GATEWAY',parameters:{'gateway':'cellpointmobile','gatewayMerchantId':'10106'}};var baseCardPaymentMethod={type:'CARD',parameters:{allowedAuthMethods:allowedCardAuthMethods,allowedCardNetworks:allowedCardNetworks,assuranceDetailsRequired:assuranceDetailsRequired}};var cardPaymentMethod=Object.assign({},baseCardPaymentMethod,{tokenizationSpecification:tokenizationSpecification});let paymentsClient=null;function getGoogleIsReadyToPayRequest(){return Object.assign({},baseRequest,{allowedPaymentMethods:[baseCardPaymentMethod]})} function getGooglePaymentDataRequest(){var paymentDataRequest=Object.assign({},baseRequest);paymentDataRequest.allowedPaymentMethods=[cardPaymentMethod];paymentDataRequest.transactionInfo=getGoogleTransactionInfo();paymentDataRequest.merchantInfo={ merchantName:'Virgin Holidays'};return paymentDataRequest} function getGooglePaymentsClient(){if(paymentsClient===null){return(new google.payments.api.PaymentsClient({environment:'TEST'}));}} function getGoogleTransactionInfo(){return{countryCode:'GB',currencyCode:'GBP',totalPriceStatus:'FINAL',totalPrice:'152.00'}}\n\t\t\t<script async=\"true\" src=\"https://myurl/js/googlepay.js\"></script> <script async=\"true\" src=\"https://pay.google.com/gp/p/js/pay.js\"></script>\n\t\t\tAuth-Token\n\t\t\n\t\n\n```\n```json JSON response for a WEB channel\n{\n \"cvc_length\": \"-1\",\n \"cvcmandatory\": \"false\",\n \"dcc\": \"false\",\n \"enabled\": \"true\",\n \"id\": \"41\",\n \"installment\": \"0\",\n \"max_length\": \"-1\",\n \"min_length\": \"-1\",\n \"payment_type\": \"3\",\n \"preferred\": \"false\",\n \"presentment_currency\": \"false\",\n \"processor_type\": \"3\",\n \"psp_id\": \"-1\",\n \"state_id\": \"1\",\n \"type_id\": \"41\",\n \"name\": \"Google Pay\",\n \"prefixes\": {\n \"prefix\": [\n {\n \"id\": \"200\",\n \"min\": \"-1\",\n \"max\": \"-1\"\n },\n {\n \"id\": \"202\",\n \"min\": \"-1\",\n \"max\": \"-1\"\n }\n ]\n },\n \"url\": {\n \"method\": \"overlay\"\n },\n \"head\": \" \",\n \"auth_token\": \"Auth-Token\",\n \"text\": \"Google Pay\"\n}\n```\n```xml XML response for a Native APP channel\n\n\n\t\n\t\tTest\n\t\t[merchant URL for callback]\n\t\t\n\t\n\t\n\t\t10025\n\t\t30206172\n\t\t[CALLBACK URL]\n\t\t\n\t\n\t\n\t\t10025\n\t\n\t\n\t\t\n\t\t\tGoogle Pay\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t-1\n\t\t\t\t\t-1\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t-1\n\t\t\t\t\t-1\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t'VISA','MASTERCARD'\n\t\t\t\t[transaction-id]\n\t\t\t\t[merchant-id]\n\t\t\t\tcellpointmobile\n\t\t\t\tPAYMENT_GATEWAY\n\t\t\t\tPHP\n\t\t\t\t11232.00\n\t\t\t\tTEST\n\t\t\t\t1\n\t\t\t\t'PAN_ONLY'\n\t\t\t\tPH\n\t\t\t\t[Merchant Name]\n\t\t\t\n\t\t\t[return url]\n \n\t\n\n```\n\nThe following fields in this Initialize response are required to process this response on the web (in step 2 of this guide):\n\n[block:parameters]\n{\n \"data\": {\n \"h-0\": \"Field\",\n \"h-1\": \"Format\",\n \"h-2\": \"Parents\",\n \"h-3\": \"Description\",\n \"0-0\": \"`head`\",\n \"0-1\": \"String\",\n \"0-2\": \"`root: wallets: card`\",\n \"0-3\": \"You will use the entire contents of the `head` tag in your payment page.\",\n \"1-0\": \"`body`\",\n \"1-1\": \"String\",\n \"1-2\": \"`root: wallets: card`\",\n \"1-3\": \"You will separate the contents of `body` into these two parts, and you will include each in its own `script` element:
• a Google Pay script
• A JavaScript snippet
The JS snippet helps to display the Google Pay button and eventually trigger Google Pay payment.\"\n },\n \"cols\": 4,\n \"rows\": 2,\n \"align\": [\n \"left\",\n \"left\",\n \"left\",\n null\n ]\n}\n[/block]\n\n\nThe following fields in this Initialize response are required to call `/mpoint/authorize` (in step 4 of this guide):\n\n| Field | Format | Parents | Description |\n| :-------- | :--------------- | :-------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |\n| `id` | Positive Integer | `root: transaction` | A unique transaction ID generated for the Initialize Payment request. This identifies a transaction within CellPoint Digital's systems. |\n| `type-id` | Positive Integer | `root: wallets: card` | A unique ID that identifies the payment methods configured. `type-id = 41` indicates the internal ID defined for Google Pay payment method. |\n\n## 2. Add the initialization information to your page\n\nTo process the initialize response on the web, parse the Initialize response and capture the contents of the `` and `` elements. Add the scripts to the `` and `` elements of your website as shown in the example below:\n\n```html\n\n\n \n \n \n \n \n \n \n\n```\n\nThe script in the `head` element sets certain options relevant to your Google Pay configuration. You will call functions from the two scripts in `body` to send transaction data.\n\n## 3. Add the Google Pay button to your page\n\n### 3a. Add a `
` container for the Google Pay button and assign it an `id`\n\nTo display a Google Pay button on your page, add `
` to the page’s HTML. Assign a value to the `id` attribute of the `
` element. You will reference the `id` value in subsequent steps.\n\n### 3b. Create an `addGooglePayButton` function\n\nWrite a function that configures the Google Pay button. The `addGooglePayButton()` function must accept the button container ID (`gpay-container-id`) and the name of your `paymentCallback` function as parameters, as shown in the example below:\n\n```javascript\nfunction addGooglePayButton (gpay-container-id, paymentCallback) {\n\tconst paymentsClient = getGooglePaymentsClient();\n\tconst button =\n\t\tpaymentsClient.createButton({\n\t\tbuttonColor: 'default',\n\t\tbuttonType: 'buy',\n\t\tonClick: () => onGooglePaymentButtonClicked(paymentCallback) });\n\tcontainer.appendChild(button);\n}\n```\n\nThe `addGooglePayButton()` function should perform the following actions:\n\n- Call the `getGooglePaymentsClient()` function.\n- Set the values of these `createButton` properties: `buttonColor` and `buttonType`.\n- Use the `onClick()` event to call the the `onGooglePaymentButtonClicked()` function with the name of your `paymentCallback` function as a parameter. The `onGooglePaymentButtonClicked()` function is part of the CellPoint Digital Google Pay Javascript library, which you included in step 2.\n\nThe `paymentCallback` function accepts four parameters: `paymentToken`, `paymentNetwork`, `preauthenticated`, and `billingAddress`. CellPoint Digital will call the `paymentCallback` function to send you transaction details that CellPoint Digital receives from Google. See step 4 for details.\n\n### 3c. Call the `addGooglePayButton` function\n\nOn the `onLoad` event, call the `addGooglePayButton()` function with `gpay-container-id` and the name of your callback function as parameter, as shown in the sample code below:\n\n```html\n\n
\n \n\n```\n\nCalling `addGooglePayButton()` adds a functioning Google Pay button to your page as shown below:\n\n[block:image]\n{\n \"images\": [\n {\n \"image\": [\n \"https://files.readme.io/3eb7ced791f5e77ea4a1b195213f968253cc55d5ee59f89d526a8303b9c22761-google-pay-button.jpg\",\n null,\n \"\"\n ],\n \"align\": \"center\",\n \"sizing\": \"600px\"\n }\n ]\n}\n[/block]\n\n\n## 4. Send an Authorize request to the CellPoint Digital API\n\n**Endpoint:** `/mpoint/authorize-payment` \n**Method:** `POST`\n\nWhen the customer clicks the Google Pay button, the application calls the function `onGooglePaymentButtonClicked()`, and CellPoint Digital returns Google Pay data to the `paymentCallback()` function that you specified previously.\n\nWrite a `paymentCallback()` function that sends a POST request to the `/mpoint/authorize-payment` endpoint of the CellPoint Digital API with the `paymentToken`, `paymentNetwork`, `preauthenticated`, and `billingAddress` data in the body of the request. Below is an example of what this might look like:\n\n```javascript\nfunction paymentCallback(paymentToken, paymentNetwork, preauthenticated, billingAddress) {\n const url = \"https://your-api.com/authorize\"; \n\n const data = {\n cardtypeid: \"GPAY_WALLET\",\n token: paymentToken,\n network: paymentNetwork.toLowerCase(),\n preauthenticated: String(preauthenticated).toLowerCase(),\n billingInfo: billingAddress || \"\"\n };\n\n fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(data)\n })\n .then(response => response.json())\n .then(data => {\n console.log('Payment Authorization Successful:', data);\n })\n .catch(error => {\n console.error('Error:', error);\n });\n}\n```\n\nThe example below shows a sample body of an Authorize request. It should include the `transaction: id` and `card: type-id` data from the Initialize response:\n\n```xml\n\n\n\t\n\t\t\n\t\t\t\n\t\t\t\t100\n\t\t\t\teyJzaWduYXR1cmUiOiJNRVlDSVFEK1BndVJMeWYrZTRsOGp3UW9DWUwza1pyN0NNZ3dnaDZYdmRHQmtWYnNMd0loQUt6ZkdrZm1kc3NmaVY3b1BuSzU4Rk94c0JBNTVNQVRVbDB2ODZqcDR3QnYiLCJwcm90b2NvbFZlcnNpb24iOiJFQ3YxIiwic2lnbmVkTWVzc2FnZSI6IntcImVuY3J5cHRlZE1lc3NhZ2VcIjpcImdaalpLZzdwdjcxOTM5V3htZEZDRmpPRDU3QlVuZWV5TGJJdUFvOTQxcXBFNFE4SEZoQTNyNzF4RUpyQnFvU2hQUS9KcUlFdW9KSThUU2ExWGF2RE1TK3dpSURTcTg4cG9QcjlFVDBqSWQ2Ukl5b0xYQlVzMTZNYkM5cmljdU9rdGY3NGRTNDJpd2YyZHY3QkhTQmZhUDdkK1laU2V0Y0F1Y2FicmY5RWliam8wUVN4YndKVHdodjlNK0dUK3lXUlZpdFNlbE80L1JZYUkvUWxkUGtINGZISmUzalorSEpnS0RMQ0NOSmtZaXR0SHNUak5mSy9LdThHeCtEM3pTT1ZuUmF3YVd5SFVkdkFHVW90aFJWUG1VSlhpWHZFZVYveTZZaUNzZzJKVlF4b1dzOWNYWitGNTFnUGpUSGY4WFhib3FpMmNnSXBMM3ZVRW1DTjU5TFV4Uzh0MVMzQThzRHhVUU5nQUttUzNWUmlVZnVmQXNHYW5GZnlQcnNtK0w0cVV4eTF0ajdXZjBoc0ZlcHF2NWNMbkpMNEZhSmpxNzFsMkpBNTZwRXhPcFdmR2MyMkFRc2hldk9YOHNrcDM3RmxcIixcImVwaGVtZXJhbFB1YmxpY0tleVwiOlwiQkw0amJqallWalRSdHNySnpLRWR0TUwvajNEalNiZm9JUGhxOGdGRGdkY05HclUzcHViMUg3YXVkZURMV0g2TVJJUFgrT2lybzJ0eUZiMkRwWWpyZ3FjXFx1MDAzZFwiLFwidGFnXCI6XCJocFVyaXN0TkpsTkhITDJxUkdVRm5kQmFsaVdzMVpKemc5RitiMFpEbW8wXFx1MDAzZFwifSJ9\n\t\t\t\tfalse\n\t\t\t\n\t\t\tab600de0561ffb023c94e17a7758d4bf3e936fc0104d27c13c31ccf2bba85a78202df3bd5b1160adb3b7bdfd2a2e0b2fad602a8a3272dbb8417d506ac8e82739\n\t\t\n\t\tsuccess\n\t\t\n\t\t\t[mobile-number]\n\t\t\t[email]\n\t\t\t[customer-ref]\n\t\t\t223.233.86.236\n\t\t\n\t\n\n```\n\nSee our [Authorize](doc:authorization) API reference for more information about this request.\n\n## 5. Confirm success\n\nFor Google Pay, you may receive one of two types of response. This depends on the data from the Google Pay wallet.\n\n### Response: Case 1\n\nThe CellPoint Velocity server sends the response informing if the transaction authorization was a success or a failure. The example below shows a sample Authorize success response:\n\n```xml\n\n\n\tPayment authorized\n\n```\n\nSee our [Authorize](doc:authorization) API reference for more information about this response.\n\n### Response: Case 2\n\nIn some cases, you may receive the parse challenge from the provider, where the user must complete the parsed challenge to complete the transaction.\n\n
\n\nGoogle Pay is a trademark of Google LLC.","order":1,"isReference":false,"deprecated":false,"hidden":false,"sync_unique":"","link_url":"","link_external":false,"reusableContent":[],"previousSlug":"","slugUpdatedAt":"2024-10-15T15:46:03.559Z","revision":41,"user":"62991f19b6f06d0085f6b293","project":"637d11f8234e9b0099697a18","category":{"_id":"683f3826ef2131005dc4aa3b","title":"Alternate Payment Methods","slug":"methods-of-payment","order":3,"reference":false,"project":"637d11f8234e9b0099697a18","version":"683f3826ef2131005dc4aaa4","createdAt":"2024-10-15T15:53:28.623Z","__v":0,"type":"guide","id":"683f3826ef2131005dc4aa3b"},"createdAt":"2024-10-15T15:54:56.159Z","updatedAt":"2025-07-14T20:37:24.301Z","version":{"_id":"683f3826ef2131005dc4aaa4","version":"2.2.1","version_clean":"2.2.1","codename":"published 6/2025","is_stable":true,"is_beta":false,"is_hidden":false,"is_deprecated":false,"categories":["65df665dc0373e0012b2671f","65df665dc0373e0012b2671f","637d11f9234e9b0099697a21","63f9089917a2c3000bb745ec","63f908a35c346f005ec48f8f","63f908a936e4890026cac28c","63f908b7104d73003b29a9dd","63f908c5488146003e11bc4a","63f908d190690f0018740987","63f908e45c346f005ec49118","63f908f2b46e8e0018c64334","63f9090188b25e0075bfb6fd","640233f1779f9600650a94fd","64089ed25ba213087efa7e2e","65df5c9d2f41d000111baa93","65df665ec0373e0012b26788","663a80d460cde700677088fb","65ea0e104ca63e004a1d8f12","683f3826ef2131005dc4aa36","683f3826ef2131005dc4aa37","67192ae574588c0045a0b9cd","66674781e10aad001eda7959","6669fd16bcf40100183d7130","6669fd1a47cf690019d619c6","67192ae574588c0045a0b9ce","683f3826ef2131005dc4aa38","683f3826ef2131005dc4aa39","683f3826ef2131005dc4aa3a","683f3826ef2131005dc4aa3b","67192ae574588c0045a0b9d3"],"pdfStatus":"complete","source":"readme","project":"637d11f8234e9b0099697a18","releaseDate":"2022-11-22T18:16:25.273Z","createdAt":"2025-06-03T18:00:06.642Z","__v":1,"updatedAt":"2025-06-09T15:29:41.078Z","forked_from":"67192ae574588c0045a0ba54","apiRegistries":[]},"lastUpdatedHash":"7c52fbf16f4c42e11315746a6da3a4461d8f16b4","__v":0,"parentDoc":null,"isApi":false,"tutorials":[],"id":"683f3826ef2131005dc4aa74"},"hideTOC":false,"meta":{"_id":"683f3826ef2131005dc4aa74","description":"Google Pay Integration Guide for CellPoint Velocity API","hidden":false,"image":[],"keywords":"","metaTitle":"Google Pay™","parent":null,"robots":"index","slug":"google-pay-digital-wallet","title":"Google Pay™","type":"docs"},"slugUrl":"/docs/google-pay-digital-wallet","config":{"algoliaIndex":"readme_search_v2","amplitude":{"apiKey":"dc8065a65ef83d6ad23e37aaf014fc84","enabled":true},"asset_url":"https://cdn.readme.io","domain":"readme.io","domainFull":"https://dash.readme.com","encryptedLocalStorageKey":"ekfls-2025-03-27","fullstory":{"enabled":true,"orgId":"FSV9A"},"liveblocks":{"copilotId":"co_11Q0l0JJlkcBhhAYUFh8s"},"metrics":{"billingCronEnabled":"true","dashUrl":"https://m.readme.io","defaultUrl":"https://m.readme.io","exportMaxRetries":12,"wsUrl":"wss://m.readme.io"},"proxyUrl":"https://try.readme.io","readmeRecaptchaSiteKey":"6LesVBYpAAAAAESOCHOyo2kF9SZXPVb54Nwf3i2x","releaseVersion":"5.420.0","sentry":{"dsn":"https://3bbe57a973254129bcb93e47dc0cc46f@o343074.ingest.sentry.io/2052166","enabled":true},"shMigration":{"promoVideo":"","forceWaitlist":false,"migrationPreview":false},"sslBaseDomain":"readmessl.com","sslGenerationService":"ssl.readmessl.com","stripePk":"pk_live_5103PML2qXbDukVh7GDAkQoR4NSuLqy8idd5xtdm9407XdPR6o3bo663C1ruEGhXJjpnb2YCpj8EU1UvQYanuCjtr00t1DRCf2a","superHub":{"newProjectsEnabled":true},"wootric":{"accountToken":"NPS-122b75a4","enabled":true}},"context":{"labs":{},"user":{},"terms":[{"_id":"65df740c7c4f340018cb407a","term":"HPP","definition":"Hosted Payment Pages"},{"_id":"65df74177c4f340018cb429f","term":"PSP","definition":"Payment Service Provider"},{"_id":"65df74258dd4bf0ee8d44494","term":"ACQ","definition":"Acquirer"}],"variables":{"user":{},"defaults":[{"source":"security","type":"oauth2","_id":"685aab9a0e9689004bb02198","name":"cpdIssuedJWT","apiSetting":"685aab990e9689004bb02194"},{"source":"security","type":"http","_id":"685aab9a0e9689004bb02197","name":"merchantIssuedJWT","scheme":"bearer","apiSetting":"685aab990e9689004bb02194"}]},"project":{"_id":"637d11f8234e9b0099697a18","appearance":{"rdmd":{"callouts":{"useIconFont":false},"theme":{"background":"","border":"","markdownEdge":"","markdownFont":"","markdownFontSize":"","markdownLineHeight":"","markdownRadius":"","markdownText":"","markdownTitle":"","markdownTitleFont":"","mdCodeBackground":"","mdCodeFont":"","mdCodeRadius":"","mdCodeTabs":"","mdCodeText":"","tableEdges":"","tableHead":"","tableHeadText":"","tableRow":"","tableStripe":"","tableText":"","text":"","title":""}},"main_body":{"type":"links"},"colors":{"highlight":"","main":"#000000","main_alt":"","header_text":"","body_highlight":"#8f45e6","custom_login_link_color":""},"typography":{"headline":"Open+Sans:400:sans-serif","body":"Open+Sans:400:sans-serif","typekit":false,"tk_key":"","tk_headline":"","tk_body":""},"header":{"style":"solid","img":[],"img_size":"auto","img_pos":"tl","linkStyle":"buttons"},"body":{"style":"none"},"global_landing_page":{"html":"","redirect":""},"referenceSimpleMode":true,"referenceLayout":"row","link_logo_to_url":true,"theme":"line","colorScheme":"light","overlay":"triangles","landing":true,"sticky":false,"hide_logo":true,"childrenAsPills":false,"subheaderStyle":"links","splitReferenceDocs":false,"showMetricsInReference":true,"logo":["https://files.readme.io/d20d0d2-small-CPD_C-Logo_RGB_low.png","CPD_C-Logo_RGB_low.png",80,80,"#000000","https://files.readme.io/945d379-CPD_C-Logo_RGB_low.png"],"loginLogo":[],"logo_white":["https://files.readme.io/9f504ea-small-CPD_C-Logo_RGB_low.png","CPD_C-Logo_RGB_low.png",80,80,"#000000","https://files.readme.io/37519c1-CPD_C-Logo_RGB_low.png"],"logo_white_use":false,"logo_large":true,"favicon":["https://files.readme.io/5f4c175-small-cpd_favicon.png","cpd_favicon.png",32,32,"#000000","https://files.readme.io/43707bd-cpd_favicon.png"],"stylesheet":"","stylesheet_hub2":".markdown-body { \n font-family: \"Open Sans\",\"Helvetica Neue\",\"Helvetica\",\"Arial\",sans-serif !important;\n}\n\nh1, h2, h3, h4, h5, h6 {font-family: \"Open Sans\",\"Helvetica Neue\",\"Helvetica\",\"Arial\",sans-serif !important;}\n\n.heading-1 {\n padding-top: .4em;\n\tpadding-bottom: .5em; \n}\n\n.heading-2 {\n padding-top: .4em;\n\tpadding-bottom: .4em;\n}\n\n.heading-3, .heading-4 {\n padding-top: .5em;\n\tpadding-bottom: .3em;\n}\n\n\n.main-table tr .sub-heading{\n \n text-align : left;\n}\n\n.round-dots{\nlist-style-type: circle;\n\n}\n.col-txt{\n vertical-align: top;\n}\n.text-block{\n display : block; \n}\n\n.bullet-list{\n margin: 0 40px;\n list-style: circle !important;\n}\n\n.bullet-list.less-spacing{\n margin: 0 50px;\n padding: 0 !important;\n}\n\n.nested-table-wrapper{\n padding-bottom: 280px;\n position: relative;\n}\n\n.nested-table{\n\tposition: absolute;\n margin-top: -145px;\n}\n\n@media only screen and (max-width: 1300px){\n.nested-table{\n\tposition: static;\n margin-top: 0;\n}\n .nested-table-wrapper{\n \tpadding-bottom: 0;\n }\n}\n\n/**Helpers***/\n.left{\ntext-align: left;\n}\n.underline-text {\ntext-decoration: underline;\n display: inline;\n}\n.style-circle li {\n list-style: circle !important;\n}\n.style-alpha li {\n\t\tlist-style: lower-alpha;\n}\n/**Helpers-End***/","stylesheet_hub3":"","javascript":"","javascript_hub2":"","html_promo":"","html_body":"","html_footer":"","html_head":"\n\n","html_footer_meta":"","html_hidelinks":false,"showVersion":false,"hideTableOfContents":false,"nextStepsLabel":"","promos":[{"extras":{"type":"search","buttonPrimary":"get-started","buttonSecondary":""},"title":"CellPoint Digital: Developer Documentation","text":"Unlock the power of seamless payment orchestration with CellPoint Digital's comprehensive suite of integration solutions.","_id":"637d11f8234e9b0099697a1a"}],"changelog":{"layoutExpanded":false,"showAuthor":true,"showExactDate":false},"allowApiExplorerJsonEditor":false,"ai_dropdown":"disabled","ai_options":{"chatgpt":"enabled","claude":"enabled","clipboard":"enabled","view_as_markdown":"enabled","copilot":"enabled"},"showPageIcons":true,"layout":{"full_width":false,"style":"classic"}},"custom_domain":"documentation.cellpointdigital.com","childrenProjects":[],"derivedPlan":"business2018","description":"","isExternalSnippetActive":false,"error404":"","experiments":[],"first_page":"landing","flags":{"allowApiExplorerJsonEditor":false,"allowDarkMode":true,"alwaysShowDocPublishStatus":false,"allowXFrame":false,"correctnewlines":false,"dashReact":false,"disablePasswordlessLogin":false,"directGoogleToStableVersion":false,"disableAnonForum":false,"enterprise":false,"graphql":false,"migrationRun":false,"migrationSwaggerRun":false,"myDevelopers":false,"newEditor":true,"newEditorDash":true,"newMarkdownBetaProgram":true,"newSearch":true,"oauth":false,"oldMarkdown":false,"rdmdCompatibilityMode":false,"reviewWorkflow":true,"singleProjectEnterprise":false,"speedyRender":false,"staging":false,"star":false,"swagger":false,"translation":false,"useReactApp":true,"useReactGLP":false,"superHub":false,"developerDashboard":false,"allowReusableOTPs":false,"allowUnsafeCustomHtmlSuggestionsFromNonAdmins":false,"apiV2":false,"customBlocks":false,"disableAutoTranslate":false,"disableSAMLScoping":false,"git":{"read":false,"write":false},"owlbotAi":false,"superHubBeta":false,"apiAccessRevoked":false,"passwordlessLogin":"default","disableSignups":false,"billingRedesignEnabled":true,"developerPortal":false,"mdx":false,"superHubDevelopment":false,"annualBillingEnabled":true,"devDashBillingRedesignEnabled":false,"enableOidc":false,"customComponents":false,"disableDiscussionSpamRecaptchaBypass":false,"developerViewUsersData":false,"changelogRssAlwaysPublic":false,"bidiSync":false,"superHubMigrationSelfServeFlow":true,"apiDesigner":false,"hideEnforceSSO":false,"localLLM":false,"superHubManageVersions":false,"gitSidebar":false,"superHubGlobalCustomBlocks":false,"childManagedBidi":false,"superHubBranches":false,"externalSdkSnippets":false,"requiresJQuery":false,"migrationPreview":false,"superHubPreview":false,"superHubBranchReviews":false,"superHubMergePermissions":false},"fullBaseUrl":"https://documentation.cellpointdigital.com/","git":{"migration":{"createRepository":{},"transformation":{},"migratingPages":{},"enableSuperhub":{}},"sync":{"linked_repository":{},"installationRequest":{},"connections":[],"providers":[]}},"glossaryTerms":[{"_id":"65df740c7c4f340018cb407a","term":"HPP","definition":"Hosted Payment Pages"},{"_id":"65df74177c4f340018cb429f","term":"PSP","definition":"Payment Service Provider"},{"_id":"65df74258dd4bf0ee8d44494","term":"ACQ","definition":"Acquirer"}],"graphqlSchema":"","gracePeriod":{"enabled":false,"endsAt":null},"shouldGateDash":false,"healthCheck":{"provider":"","settings":{}},"intercom_secure_emailonly":false,"intercom":"","is_active":true,"integrations":{"login":{}},"internal":"","jwtExpirationTime":0,"landing_bottom":[{"type":"text","alignment":"left","text":"CellPoint Digital's comprehensive suite of integration solutions offers payment solutions for high-volume merchants with complex requirements, merchants looking for a hands-off Hosted Payment Page (HPP) option, or merchants seeking bespoke payment experiences:"},{"type":"three","alignment":"left","pageType":"Reference","group0":{"title":"[API Integration](doc:orchestration-overview#api-integration)","text":"For high-volume merchants who prioritize full control over their online channel's user interface and experience."},"group1":{"title":"[HPP](doc:orchestration-overview#hosted-payment-page-hpp)","text":"A hassle-free payment integration for merchants seeking a hands-off approach to payment acceptance."},"group2":{"title":"[Custom HPP](doc:orchestration-overview#custom-hosted-payment-page-hpp)","text":"Provide your customers a customized payment experience while offloading payment management to a trusted partner."}},{"type":"text","alignment":"left","text":"
"},{"type":"docs","alignment":"left","pageType":"Documentation"},{"type":"docs","alignment":"left","pageType":"Reference"}],"mdxMigrationStatus":"rdmd","metrics":{"monthlyLimit":0,"planLimit":5000000,"thumbsEnabled":true,"monthlyPurchaseLimit":0,"meteredBilling":{}},"modules":{"landing":true,"docs":true,"examples":true,"reference":false,"graphql":false,"changelog":false,"discuss":false,"suggested_edits":true,"logs":false,"custompages":true,"tutorials":false},"name":"CellPoint Documentation","nav_names":{"docs":"","reference":"","changelog":"","discuss":"","tutorials":"","recipes":""},"oauth_url":"","onboardingCompleted":{"documentation":true,"appearance":true,"jwt":false,"api":true,"logs":false,"domain":false,"metricsSDK":false},"owlbot":{"enabled":false,"isPaying":false,"customization":{"answerLength":"long","customTone":"","defaultAnswer":"","forbiddenWords":"","tone":"neutral"},"copilot":{"enabled":false,"hasBeenUsed":false,"installedCustomPage":""}},"owner":{"id":null,"email":null,"name":null},"plan":"business2018","planOverride":"","planSchedule":{"stripeScheduleId":null,"changeDate":null,"nextPlan":null},"planStatus":"active","planTrial":"business2018","readmeScore":{"components":{"newDesign":{"enabled":true,"points":25},"reference":{"enabled":false,"points":50},"tryItNow":{"enabled":false,"points":35},"syncingOAS":{"enabled":false,"points":10},"customLogin":{"enabled":false,"points":25},"metrics":{"enabled":false,"points":40},"recipes":{"enabled":false,"points":15},"pageVoting":{"enabled":true,"points":1},"suggestedEdits":{"enabled":true,"points":10},"support":{"enabled":false,"points":5},"htmlLanding":{"enabled":false,"points":5},"guides":{"enabled":true,"points":10},"changelog":{"enabled":false,"points":5},"glossary":{"enabled":true,"points":1},"variables":{"enabled":false,"points":1},"integrations":{"enabled":true,"points":2}},"totalScore":49},"reCaptchaSiteKey":"","reference":{"alwaysUseDefaults":true,"defaultExpandResponseExample":false,"defaultExpandResponseSchema":false,"enableOAuthFlows":false},"seo":{"overwrite_title_tag":false},"stable":{"_id":"683f3826ef2131005dc4aaa4","version":"2.2.1","version_clean":"2.2.1","codename":"published 6/2025","is_stable":true,"is_beta":false,"is_hidden":false,"is_deprecated":false,"categories":["65df665dc0373e0012b2671f","65df665dc0373e0012b2671f","637d11f9234e9b0099697a21","63f9089917a2c3000bb745ec","63f908a35c346f005ec48f8f","63f908a936e4890026cac28c","63f908b7104d73003b29a9dd","63f908c5488146003e11bc4a","63f908d190690f0018740987","63f908e45c346f005ec49118","63f908f2b46e8e0018c64334","63f9090188b25e0075bfb6fd","640233f1779f9600650a94fd","64089ed25ba213087efa7e2e","65df5c9d2f41d000111baa93","65df665ec0373e0012b26788","663a80d460cde700677088fb","65ea0e104ca63e004a1d8f12","683f3826ef2131005dc4aa36","683f3826ef2131005dc4aa37","67192ae574588c0045a0b9cd","66674781e10aad001eda7959","6669fd16bcf40100183d7130","6669fd1a47cf690019d619c6","67192ae574588c0045a0b9ce","683f3826ef2131005dc4aa38","683f3826ef2131005dc4aa39","683f3826ef2131005dc4aa3a","683f3826ef2131005dc4aa3b","67192ae574588c0045a0b9d3"],"pdfStatus":"complete","source":"readme","project":"637d11f8234e9b0099697a18","releaseDate":"2022-11-22T18:16:25.273Z","createdAt":"2025-06-03T18:00:06.642Z","__v":1,"updatedAt":"2025-06-09T15:29:41.078Z","forked_from":"67192ae574588c0045a0ba54","apiRegistries":[]},"subdomain":"cellpoint-documentation","subpath":"","superHubWaitlist":false,"topnav":{"left":[],"right":[{"type":"user","text":"User","url":"/login?redirect_uri=/docs/google-pay-digital-wallet"}],"bottom":[],"edited":false},"trial":{"trialDeadlineEnabled":true,"trialEndsAt":"2022-12-06T18:16:24.937Z"},"translate":{"provider":"transifex","show_widget":false,"key_public":"","org_name":"","project_name":"","languages":[]},"url":"https://cellpointdigital.com","versions":[{"_id":"65b283ae7a6d4a000fdf71ea","version":"0.0","version_clean":"0.0.0","codename":"test","is_stable":false,"is_beta":false,"is_hidden":true,"is_deprecated":true,"categories":["65b283ae7a6d4a000fdf7183","65b283ae7a6d4a000fdf7183","637d11f9234e9b0099697a21","63f9089917a2c3000bb745ec","63f908a35c346f005ec48f8f","63f908a936e4890026cac28c","63f908b7104d73003b29a9dd","63f908c5488146003e11bc4a","63f908d190690f0018740987","63f908e45c346f005ec49118","63f908f2b46e8e0018c64334","63f9090188b25e0075bfb6fd","640233f1779f9600650a94fd","64089ed25ba213087efa7e2e","65b283af7a6d4a000fdf71ec"],"project":"637d11f8234e9b0099697a18","releaseDate":"2022-11-22T18:16:25.273Z","createdAt":"2024-01-25T15:52:14.865Z","__v":0,"forked_from":"637d11f9234e9b0099697a1d","updatedAt":"2024-02-28T16:59:25.329Z"},{"_id":"637d11f9234e9b0099697a1d","version":"1.0","version_clean":"1.0.0","codename":"Amsterdam","is_stable":false,"is_beta":false,"is_hidden":true,"is_deprecated":true,"categories":["637d11f9234e9b0099697a1f","637d11f9234e9b0099697a1f","637d11f9234e9b0099697a21","63f9089917a2c3000bb745ec","63f908a35c346f005ec48f8f","63f908a936e4890026cac28c","63f908b7104d73003b29a9dd","63f908c5488146003e11bc4a","63f908d190690f0018740987","63f908e45c346f005ec49118","63f908f2b46e8e0018c64334","63f9090188b25e0075bfb6fd","640233f1779f9600650a94fd","64089ed25ba213087efa7e2e","65df5c9d2f41d000111baa93"],"project":"637d11f8234e9b0099697a18","releaseDate":"2022-11-22T18:16:25.273Z","createdAt":"2022-11-22T18:16:25.273Z","__v":1,"updatedAt":"2024-07-08T18:41:39.309Z"},{"_id":"63fd68df5d1cbe0011aa89e6","version":"1.1","version_clean":"1.1.0","codename":"","is_stable":false,"is_beta":false,"is_hidden":true,"is_deprecated":true,"categories":["63fd68df5d1cbe0011aa89da","63fd68df5d1cbe0011aa89da","637d11f9234e9b0099697a21","63f9089917a2c3000bb745ec","63f908a35c346f005ec48f8f","63f908a936e4890026cac28c","63f908b7104d73003b29a9dd","63f908c5488146003e11bc4a","63f908d190690f0018740987","63f908e45c346f005ec49118","63f908f2b46e8e0018c64334","63f9090188b25e0075bfb6fd","63fd68df5d1cbe0011aa89e8"],"project":"637d11f8234e9b0099697a18","releaseDate":"2022-11-22T18:16:25.273Z","createdAt":"2022-11-22T18:16:25.273Z","__v":1,"forked_from":"637d11f9234e9b0099697a1d","updatedAt":"2024-02-28T16:59:27.097Z"},{"_id":"6435ab5ef8d79800298c8f79","version":"1.2","version_clean":"1.2.0","codename":"API update","is_stable":false,"is_beta":false,"is_hidden":true,"is_deprecated":true,"categories":["6435ab5ef8d79800298c8f14","6435ab5ef8d79800298c8f14","637d11f9234e9b0099697a21","63f9089917a2c3000bb745ec","63f908a35c346f005ec48f8f","63f908a936e4890026cac28c","63f908b7104d73003b29a9dd","63f908c5488146003e11bc4a","63f908d190690f0018740987","63f908e45c346f005ec49118","63f908f2b46e8e0018c64334","63f9090188b25e0075bfb6fd","640233f1779f9600650a94fd","64089ed25ba213087efa7e2e","6435ab5ff8d79800298c8f7b"],"project":"637d11f8234e9b0099697a18","releaseDate":"2022-11-22T18:16:25.273Z","createdAt":"2022-11-22T18:16:25.273Z","__v":0,"forked_from":"637d11f9234e9b0099697a1d","updatedAt":"2024-02-28T16:59:30.557Z"},{"_id":"65df665dc0373e0012b26786","version":"2.0","version_clean":"2.0.0","codename":"","is_stable":false,"is_beta":false,"is_hidden":true,"is_deprecated":true,"categories":["65df665dc0373e0012b2671f","65df665dc0373e0012b2671f","637d11f9234e9b0099697a21","63f9089917a2c3000bb745ec","63f908a35c346f005ec48f8f","63f908a936e4890026cac28c","63f908b7104d73003b29a9dd","63f908c5488146003e11bc4a","63f908d190690f0018740987","63f908e45c346f005ec49118","63f908f2b46e8e0018c64334","63f9090188b25e0075bfb6fd","640233f1779f9600650a94fd","64089ed25ba213087efa7e2e","65df5c9d2f41d000111baa93","65df665ec0373e0012b26788","65df673f4fef960011de01a6","65ea0e104ca63e004a1d8f12","685aab990e9689004bb02196"],"project":"637d11f8234e9b0099697a18","releaseDate":"2022-11-22T18:16:25.273Z","createdAt":"2024-02-28T16:59:09.739Z","__v":0,"updatedAt":"2025-06-24T13:43:53.372Z","forked_from":"637d11f9234e9b0099697a1d","pdfStatus":""},{"_id":"663a80d460cde70067708aa8","version":"2.1","version_clean":"2.1.0","codename":"consolidated, published til 6/2025","is_stable":false,"is_beta":false,"is_hidden":true,"is_deprecated":true,"categories":["65df665dc0373e0012b2671f","65df665dc0373e0012b2671f","637d11f9234e9b0099697a21","63f9089917a2c3000bb745ec","63f908a35c346f005ec48f8f","63f908a936e4890026cac28c","63f908b7104d73003b29a9dd","63f908c5488146003e11bc4a","63f908d190690f0018740987","63f908e45c346f005ec49118","63f908f2b46e8e0018c64334","63f9090188b25e0075bfb6fd","640233f1779f9600650a94fd","64089ed25ba213087efa7e2e","65df5c9d2f41d000111baa93","65df665ec0373e0012b26788","663a80d460cde700677088fb","65ea0e104ca63e004a1d8f12","663a80d460cde70067708aaa","663d0ee0650a360011f3a208","663d0ef859318f004e1ec2cb","66674781e10aad001eda7959","6669fd16bcf40100183d7130","6669fd1a47cf690019d619c6","6669feadd423ef0019cfdb71","6669feccffcc2a00110fcd26","666ae70996d0670027097975","670e8de65acfcd0011b138f2","670e8ff8d3021400114cabae","670e91c1e468070019583aa7"],"project":"637d11f8234e9b0099697a18","releaseDate":"2022-11-22T18:16:25.273Z","createdAt":"2024-05-07T19:28:20.054Z","__v":2,"updatedAt":"2025-06-09T15:29:24.614Z","forked_from":"65df665dc0373e0012b26786","pdfStatus":"complete","apiRegistries":[],"source":"readme"},{"_id":"67192ae574588c0045a0ba54","version":"2.2","version_clean":"2.2.0","codename":"reorganize, to-do list","is_stable":false,"is_beta":true,"is_hidden":true,"is_deprecated":false,"categories":["65df665dc0373e0012b2671f","65df665dc0373e0012b2671f","637d11f9234e9b0099697a21","63f9089917a2c3000bb745ec","63f908a35c346f005ec48f8f","63f908a936e4890026cac28c","63f908b7104d73003b29a9dd","63f908c5488146003e11bc4a","63f908d190690f0018740987","63f908e45c346f005ec49118","63f908f2b46e8e0018c64334","63f9090188b25e0075bfb6fd","640233f1779f9600650a94fd","64089ed25ba213087efa7e2e","65df5c9d2f41d000111baa93","65df665ec0373e0012b26788","663a80d460cde700677088fb","65ea0e104ca63e004a1d8f12","67192ae574588c0045a0b9cb","67192ae574588c0045a0b9cc","67192ae574588c0045a0b9cd","66674781e10aad001eda7959","6669fd16bcf40100183d7130","6669fd1a47cf690019d619c6","67192ae574588c0045a0b9ce","67192ae574588c0045a0b9cf","67192ae574588c0045a0b9d0","67192ae574588c0045a0b9d1","67192ae574588c0045a0b9d2","67192ae574588c0045a0b9d3"],"pdfStatus":"complete","project":"637d11f8234e9b0099697a18","releaseDate":"2022-11-22T18:16:25.273Z","createdAt":"2024-10-23T16:57:09.294Z","__v":2,"updatedAt":"2025-06-03T17:53:46.693Z","forked_from":"663a80d460cde70067708aa8","apiRegistries":[],"source":"readme"},{"_id":"683f3826ef2131005dc4aaa4","version":"2.2.1","version_clean":"2.2.1","codename":"published 6/2025","is_stable":true,"is_beta":false,"is_hidden":false,"is_deprecated":false,"categories":["65df665dc0373e0012b2671f","65df665dc0373e0012b2671f","637d11f9234e9b0099697a21","63f9089917a2c3000bb745ec","63f908a35c346f005ec48f8f","63f908a936e4890026cac28c","63f908b7104d73003b29a9dd","63f908c5488146003e11bc4a","63f908d190690f0018740987","63f908e45c346f005ec49118","63f908f2b46e8e0018c64334","63f9090188b25e0075bfb6fd","640233f1779f9600650a94fd","64089ed25ba213087efa7e2e","65df5c9d2f41d000111baa93","65df665ec0373e0012b26788","663a80d460cde700677088fb","65ea0e104ca63e004a1d8f12","683f3826ef2131005dc4aa36","683f3826ef2131005dc4aa37","67192ae574588c0045a0b9cd","66674781e10aad001eda7959","6669fd16bcf40100183d7130","6669fd1a47cf690019d619c6","67192ae574588c0045a0b9ce","683f3826ef2131005dc4aa38","683f3826ef2131005dc4aa39","683f3826ef2131005dc4aa3a","683f3826ef2131005dc4aa3b","67192ae574588c0045a0b9d3"],"pdfStatus":"complete","source":"readme","project":"637d11f8234e9b0099697a18","releaseDate":"2022-11-22T18:16:25.273Z","createdAt":"2025-06-03T18:00:06.642Z","__v":1,"updatedAt":"2025-06-09T15:29:41.078Z","forked_from":"67192ae574588c0045a0ba54","apiRegistries":[]}],"variableDefaults":[{"source":"security","type":"oauth2","_id":"685aab9a0e9689004bb02198","name":"cpdIssuedJWT","apiSetting":"685aab990e9689004bb02194"},{"source":"security","type":"http","_id":"685aab9a0e9689004bb02197","name":"merchantIssuedJWT","scheme":"bearer","apiSetting":"685aab990e9689004bb02194"}],"webhookEnabled":false,"isHubEditable":true},"projectStore":{"data":{"allow_crawlers":"disabled","canonical_url":null,"default_version":{"name":"2.2.1"},"description":null,"glossary":[{"_id":"65df740c7c4f340018cb407a","term":"HPP","definition":"Hosted Payment Pages"},{"_id":"65df74177c4f340018cb429f","term":"PSP","definition":"Payment Service Provider"},{"_id":"65df74258dd4bf0ee8d44494","term":"ACQ","definition":"Acquirer"}],"homepage_url":"https://cellpointdigital.com","id":"637d11f8234e9b0099697a18","name":"CellPoint Documentation","parent":null,"redirects":[],"sitemap":"disabled","llms_txt":"disabled","subdomain":"cellpoint-documentation","suggested_edits":"enabled","uri":"/projects/me","variable_defaults":[{"name":"cpdIssuedJWT","source":"security","type":"oauth2","id":"685aab9a0e9689004bb02198"},{"name":"merchantIssuedJWT","scheme":"bearer","source":"security","type":"http","id":"685aab9a0e9689004bb02197"}],"webhooks":[],"api_designer":{"allow_editing":"enabled"},"custom_login":{"login_url":null,"logout_url":null},"features":{"mdx":"disabled"},"mcp":{},"onboarding_completed":{"api":true,"appearance":true,"documentation":true,"domain":false,"jwt":false,"logs":false,"metricsSDK":false},"pages":{"not_found":null},"privacy":{"openapi":"admin","password":null,"view":"public"},"refactored":{"status":"disabled","migrated":"unknown"},"seo":{"overwrite_title_tag":"disabled"},"plan":{"type":"business2018","grace_period":{"enabled":false,"end_date":null},"trial":{"expired":false,"end_date":"2022-12-06T18:16:24.937Z"}},"reference":{"api_sdk_snippets":"enabled","defaults":"always_use","json_editor":"disabled","oauth_flows":"disabled","request_history":"enabled","response_examples":"collapsed","response_schemas":"collapsed","sdk_snippets":{"external":"disabled"}},"health_check":{"provider":"none","settings":{"manual":{"status":"down","url":null},"statuspage":{"id":null}}},"integrations":{"aws":{"readme_webhook_login":{"region":null,"external_id":null,"role_arn":null,"usage_plan_id":null}},"bing":{"verify":null},"google":{"analytics":null,"site_verification":null},"heap":{"id":null},"koala":{"key":null},"localize":{"key":null},"postman":{"key":null,"client_id":null,"client_secret":null},"recaptcha":{"site_key":null,"secret_key":null},"segment":{"key":null,"domain":null},"speakeasy":{"key":null,"spec_url":null},"stainless":{"key":null,"name":null},"typekit":{"key":null},"zendesk":{"subdomain":null},"intercom":{"app_id":null,"secure_mode":{"key":null,"email_only":false}}},"permissions":{"appearance":{"private_label":"enabled","custom_code":{"css":"enabled","html":"enabled","js":"disabled"}},"branches":{"merge":{"admin":true}}},"appearance":{"brand":{"primary_color":null,"link_color":"#8f45e6","theme":"light"},"changelog":{"layout":"collapsed","show_author":true,"show_exact_date":false},"layout":{"full_width":"disabled","style":"classic"},"markdown":{"callouts":{"icon_font":"emojis"}},"table_of_contents":"enabled","whats_next_label":null,"footer":{"readme_logo":"hide"},"logo":{"size":"large","dark_mode":{"uri":null,"url":"https://files.readme.io/9f504ea-small-CPD_C-Logo_RGB_low.png","name":"CPD_C-Logo_RGB_low.png","width":80,"height":80,"color":"#000000","links":{"original_url":"https://files.readme.io/37519c1-CPD_C-Logo_RGB_low.png"}},"main":{"uri":null,"url":"https://files.readme.io/d20d0d2-small-CPD_C-Logo_RGB_low.png","name":"CPD_C-Logo_RGB_low.png","width":80,"height":80,"color":"#000000","links":{"original_url":"https://files.readme.io/945d379-CPD_C-Logo_RGB_low.png"}},"favicon":{"uri":null,"url":"https://files.readme.io/5f4c175-small-cpd_favicon.png","name":"cpd_favicon.png","width":32,"height":32,"color":"#000000","links":{"original_url":"https://files.readme.io/43707bd-cpd_favicon.png"}}},"custom_code":{"css":".markdown-body { \n font-family: \"Open Sans\",\"Helvetica Neue\",\"Helvetica\",\"Arial\",sans-serif !important;\n}\n\nh1, h2, h3, h4, h5, h6 {font-family: \"Open Sans\",\"Helvetica Neue\",\"Helvetica\",\"Arial\",sans-serif !important;}\n\n.heading-1 {\n padding-top: .4em;\n\tpadding-bottom: .5em; \n}\n\n.heading-2 {\n padding-top: .4em;\n\tpadding-bottom: .4em;\n}\n\n.heading-3, .heading-4 {\n padding-top: .5em;\n\tpadding-bottom: .3em;\n}\n\n\n.main-table tr .sub-heading{\n \n text-align : left;\n}\n\n.round-dots{\nlist-style-type: circle;\n\n}\n.col-txt{\n vertical-align: top;\n}\n.text-block{\n display : block; \n}\n\n.bullet-list{\n margin: 0 40px;\n list-style: circle !important;\n}\n\n.bullet-list.less-spacing{\n margin: 0 50px;\n padding: 0 !important;\n}\n\n.nested-table-wrapper{\n padding-bottom: 280px;\n position: relative;\n}\n\n.nested-table{\n\tposition: absolute;\n margin-top: -145px;\n}\n\n@media only screen and (max-width: 1300px){\n.nested-table{\n\tposition: static;\n margin-top: 0;\n}\n .nested-table-wrapper{\n \tpadding-bottom: 0;\n }\n}\n\n/**Helpers***/\n.left{\ntext-align: left;\n}\n.underline-text {\ntext-decoration: underline;\n display: inline;\n}\n.style-circle li {\n list-style: circle !important;\n}\n.style-alpha li {\n\t\tlist-style: lower-alpha;\n}\n/**Helpers-End***/","js":null,"html":{"header":"\n\n","home_footer":null,"page_footer":null}},"header":{"type":"line","gradient_color":null,"link_style":"buttons","overlay":{"fill":"auto","type":"triangles","position":"top-left","image":{"uri":null,"url":null,"name":null,"width":null,"height":null,"color":null,"links":{"original_url":null}}}},"ai":{"dropdown":"disabled","options":{"chatgpt":"enabled","claude":"enabled","clipboard":"enabled","copilot":"enabled","view_as_markdown":"enabled"}},"navigation":{"first_page":"landing_page","left":[],"logo_link":"homepage","page_icons":"enabled","right":[{"type":"user_controls","title":null,"url":null,"custom_page":null}],"sub_nav":[],"subheader_layout":"links","version":"disabled","links":{"home":{"label":"Home","visibility":"enabled"},"graphql":{"label":"GraphQL","visibility":"disabled"},"guides":{"label":"Guides","alias":null,"visibility":"enabled"},"reference":{"label":"API Reference","alias":null,"visibility":"disabled"},"recipes":{"label":"Recipes","alias":null,"visibility":"disabled"},"changelog":{"label":"Changelog","alias":null,"visibility":"disabled"},"discussions":{"label":"Discussions","alias":null,"visibility":"disabled"}}}},"git":{"connection":{"repository":{},"organization":null,"status":"inactive"}}}},"version":{"_id":"683f3826ef2131005dc4aaa4","version":"2.2.1","version_clean":"2.2.1","codename":"published 6/2025","is_stable":true,"is_beta":false,"is_hidden":false,"is_deprecated":false,"categories":["65df665dc0373e0012b2671f","65df665dc0373e0012b2671f","637d11f9234e9b0099697a21","63f9089917a2c3000bb745ec","63f908a35c346f005ec48f8f","63f908a936e4890026cac28c","63f908b7104d73003b29a9dd","63f908c5488146003e11bc4a","63f908d190690f0018740987","63f908e45c346f005ec49118","63f908f2b46e8e0018c64334","63f9090188b25e0075bfb6fd","640233f1779f9600650a94fd","64089ed25ba213087efa7e2e","65df5c9d2f41d000111baa93","65df665ec0373e0012b26788","663a80d460cde700677088fb","65ea0e104ca63e004a1d8f12","683f3826ef2131005dc4aa36","683f3826ef2131005dc4aa37","67192ae574588c0045a0b9cd","66674781e10aad001eda7959","6669fd16bcf40100183d7130","6669fd1a47cf690019d619c6","67192ae574588c0045a0b9ce","683f3826ef2131005dc4aa38","683f3826ef2131005dc4aa39","683f3826ef2131005dc4aa3a","683f3826ef2131005dc4aa3b","67192ae574588c0045a0b9d3"],"pdfStatus":"complete","source":"readme","project":"637d11f8234e9b0099697a18","releaseDate":"2022-11-22T18:16:25.273Z","createdAt":"2025-06-03T18:00:06.642Z","__v":1,"updatedAt":"2025-06-09T15:29:41.078Z","forked_from":"67192ae574588c0045a0ba54","apiRegistries":[]}},"is404":false,"isDetachedProductionSite":false,"lang":"en","langFull":"Default","reqUrl":"/docs/google-pay-digital-wallet","version":{"_id":"683f3826ef2131005dc4aaa4","version":"2.2.1","version_clean":"2.2.1","codename":"published 6/2025","is_stable":true,"is_beta":false,"is_hidden":false,"is_deprecated":false,"categories":["65df665dc0373e0012b2671f","65df665dc0373e0012b2671f","637d11f9234e9b0099697a21","63f9089917a2c3000bb745ec","63f908a35c346f005ec48f8f","63f908a936e4890026cac28c","63f908b7104d73003b29a9dd","63f908c5488146003e11bc4a","63f908d190690f0018740987","63f908e45c346f005ec49118","63f908f2b46e8e0018c64334","63f9090188b25e0075bfb6fd","640233f1779f9600650a94fd","64089ed25ba213087efa7e2e","65df5c9d2f41d000111baa93","65df665ec0373e0012b26788","663a80d460cde700677088fb","65ea0e104ca63e004a1d8f12","683f3826ef2131005dc4aa36","683f3826ef2131005dc4aa37","67192ae574588c0045a0b9cd","66674781e10aad001eda7959","6669fd16bcf40100183d7130","6669fd1a47cf690019d619c6","67192ae574588c0045a0b9ce","683f3826ef2131005dc4aa38","683f3826ef2131005dc4aa39","683f3826ef2131005dc4aa3a","683f3826ef2131005dc4aa3b","67192ae574588c0045a0b9d3"],"pdfStatus":"complete","source":"readme","project":"637d11f8234e9b0099697a18","releaseDate":"2022-11-22T18:16:25.273Z","createdAt":"2025-06-03T18:00:06.642Z","__v":1,"updatedAt":"2025-06-09T15:29:41.078Z","forked_from":"67192ae574588c0045a0ba54","apiRegistries":[]}}">