1. Introducción
Qué compilarás
Cuando completes este codelab, tendrás un sitio web mínimo viable con una integración de Google Pay que funcione. Este proyecto recupera un token de pago que se puede enviar a un proveedor de servicios de pagos para su procesamiento.
Qué aprenderás
- Cómo cargar y configurar la API de Google Pay
- Cómo mostrar el botón de Google Pay y controlar los clics
- Cómo solicitar un token de pago de Google Pay
Requisitos
- Un editor de texto de tu elección para editar archivos HTML y JavaScript
- El navegador web Google Chrome o alguna otra forma de probar un sitio web local
- Para producción, necesitarás un
merchantId
de Google Pay. El registro en la Consola de Google Pay y la Billetera solo demora un minuto, así que te recomendamos que lo hagas ahora.
Sigue el proceso con Project IDX
2. Crea la página HTML
Cómo crear archivos de proyecto
- Crea una carpeta en tu computadora llamada
gpay-web-101
y, dentro de ella, crea dos archivos de texto vacíos llamadosindex.html
ymain.js
.La estructura de directorios debería verse así:gpay-web-101/ index.html main.js
- Abre
index.html
en el IDE que prefieras y agrega el siguiente código:<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Google Pay API for Web 101</title> </head> <body> <div id="gpay-container"></div> <p>Transaction info and errors will be logged to the console.</p> <script type="text/javascript" src="main.js"></script> <script async src="https://pay.google.com/gp/p/js/pay.js" onload="onGooglePayLoaded()"> </script> </body> </html>
Explicación del código
- Se agrega un DIV vacío a la página con el ID
gpay-container
. Este elemento DOM será el elemento superior en el que se agregará el botón de Google Pay. Puedes colocar este elemento en el diseño de tu sitio web cuando corresponda. - La etiqueta de secuencia de comandos
main.js
se coloca en el DOM después del elementogpay-container
. Esto es necesario para garantizar que el DIV del contenedor esté presente en el DOM antes de quemain.js
lo consulte. Además, la secuencia de comandos es síncrona para garantizar que se cargue antes de que se carguepay.js
, ya que el métodoonGooglePayLoaded()
debe existir antes de que se complete la carga. Existen otras formas de lograr el mismo efecto, pero no se analizarán aquí. - Por último,
pay.js
se carga de forma asíncrona y configuraonGooglePayLoaded()
como su controladoronload
. Este método se definirá enmain.js
.
3. Configura Google Pay
Una solicitud de pago de Google Pay requiere un objeto de solicitud. El objeto definido aquí como baseGooglePayRequest
contiene la configuración común mínima para todas las solicitudes. Se agregará la configuración adicional según la solicitud que realicemos, que revisaremos en este codelab.
Agrega las constantes de configuración de Google Pay al archivo main.js
vacío:
//=============================================================================
// Configuration
//=============================================================================
// The DOM element that the Google Pay button will be rendered into
const GPAY_BUTTON_CONTAINER_ID = 'gpay-container';
// Update the `merchantId` and `merchantName` properties with your own values.
// Your real info is required when the environment is `PRODUCTION`.
const merchantInfo = {
merchantId: '12345678901234567890',
merchantName: 'Example Merchant'
};
// This is the base configuration for all Google Pay payment data requests.
const baseGooglePayRequest = {
apiVersion: 2,
apiVersionMinor: 0,
allowedPaymentMethods: [
{
type: 'CARD',
parameters: {
allowedAuthMethods: [
"PAN_ONLY", "CRYPTOGRAM_3DS"
],
allowedCardNetworks: [
"AMEX", "DISCOVER", "INTERAC", "JCB", "MASTERCARD", "VISA"
]
},
tokenizationSpecification: {
type: 'PAYMENT_GATEWAY',
parameters: {
gateway: 'example',
gatewayMerchantId: 'exampleGatewayMerchantId'
}
}
}
],
merchantInfo
};
// Prevent accidental edits to the base configuration. Mutations will be
// handled by cloning the config using deepCopy() and modifying the copy.
Object.freeze(baseGooglePayRequest);
Explicación del código
- Establece la variable constante
GPAY_BUTTON_CONTAINER_ID
en el ID del elemento DOM que se usa en la página HTML como contenedor principal del botón de Google Pay. - Crea el objeto de configuración
baseGooglePayRequest
con la configuración relevante para tu aplicación. Puedes encontrar cada una de las propiedades y los valores en la documentación de referencia. Los valores que se muestran en este ejemplo pueden o no coincidir perfectamente con tus necesidades, así que revísalos con cuidado. - Actualiza las propiedades
merchantId
ymerchantName
con tus propios valores. Estos campos son opcionales cuando el entorno esTEST
.
Recursos
- Entrada de blog: ¿Quieres que la confirmación de la compra con Google Pay sea más sencilla? Configura tus opciones de pago.
- Referencia de la API: Documentación de los objetos de solicitud de la API de Google Pay
- Referencia de la API: Consulta
PaymentMethod
para obtener más información sobre los métodos de autorización permitidos, las redes de tarjetas permitidas y las especificaciones de tokenización, incluido el valor correcto de la puerta de enlace.
4. Agrega un cliente de pagos
Se usa un cliente de pagos para realizar solicitudes de pago y registrar devoluciones de llamada. En este codelab, solo realizaremos solicitudes de pago. Además, puedes configurar PaymentDataCallbacks
para controlar cuándo cambian los datos de pago o la autorización. Sin embargo, estos temas avanzados no se abordan en este codelab.
Agrega este código de cliente a la parte inferior de main.js
:
//=============================================================================
// Google Payments client singleton
//=============================================================================
let paymentsClient = null;
function getGooglePaymentsClient() {
if (paymentsClient === null) {
paymentsClient = new google.payments.api.PaymentsClient({
environment: 'TEST',
merchantInfo,
// todo: paymentDataCallbacks (codelab pay-web-201)
});
}
return paymentsClient;
}
Explicación del código
- La variable
paymentsClient
retendrá la instancia para el cliente una vez que se cree. Nuestro código no accede directamente a la variable, sino que siempre lo hace el métodogetGooglePaymentsClient()
. - El método
getGooglePaymentsClient()
verifica si ya se creó una instancia de un cliente y muestra esa instancia. Si no se creó una instancia anteriormente, se crea una, se guarda y se muestra. Este método garantiza que se cree y use una sola instancia durante la vida útil de esta secuencia de comandos. - Para crear una instancia de un cliente, se invoca el método
PaymentsClient()
. En este ejemplo, le indicamos al cliente que estamos en un entornoTEST
. La alternativa esPRODUCTION
. Sin embargo,TEST
es el valor predeterminado y se puede omitir.
5. Cómo agregar ayudantes
Las siguientes funciones auxiliares se usan más adelante en la secuencia de comandos y se agregaron con el único propósito de mejorar la legibilidad y el mantenimiento del código.
Agrega las funciones auxiliares a la parte inferior de main.js
:
//=============================================================================
// Helpers
//=============================================================================
const deepCopy = (obj) => JSON.parse(JSON.stringify(obj));
function renderGooglePayButton() {
const button = getGooglePaymentsClient().createButton({
onClick: onGooglePaymentButtonClicked
});
document.getElementById(GPAY_BUTTON_CONTAINER_ID).appendChild(button);
}
Explicación del código
deepCopy()
es una utilidad que usa la serialización y deserialización de JSON para crear una copia profunda del objeto proporcionado. Es una forma conveniente de clonar objetos sin preocuparse por las referencias compartidas.renderGooglePayButton()
es una utilidad que invoca el método de la bibliotecacreateButton()
para mostrar el botón de Google Pay. El argumento pasado es un conjunto de opciones que definen cómo debe comportarse el botón, como registrar la funciónonGooglePaymentButtonClicked()
para controlar los clics del botón.
6. Cómo agregar controladores de eventos
En esta secuencia de comandos, configuraremos dos controladores de eventos. Se llama al primero cuando termina de cargarse la biblioteca pay.js
y al segundo cuando se hace clic en el botón de Google Pay.
Agrega los controladores de eventos a la parte inferior de main.js
:
//=============================================================================
// Event Handlers
//=============================================================================
function onGooglePayLoaded() {
const req = deepCopy(baseGooglePayRequest);
getGooglePaymentsClient()
.isReadyToPay(req)
.then(function(res) {
if (res.result) {
renderGooglePayButton();
} else {
console.log("Google Pay is not ready for this user.");
}
})
.catch(console.error);
}
function onGooglePaymentButtonClicked() {
// Create a new request data object for this request
const req = {
...deepCopy(baseGooglePayRequest),
transactionInfo: {
countryCode: 'US',
currencyCode: 'USD',
totalPriceStatus: 'FINAL',
totalPrice: (Math.random() * 999 + 1).toFixed(2),
},
// todo: callbackIntents (codelab gpay-web-201)
};
// Write request object to console for debugging
console.log(req);
getGooglePaymentsClient()
.loadPaymentData(req)
.then(function (res) {
// Write response object to console for debugging
console.log(res);
// @todo pass payment token to your gateway to process payment
// @note DO NOT save the payment credentials for future transactions
paymentToken = res.paymentMethodData.tokenizationData.token;
})
.catch(console.error);
}
Explicación del código
- Se invoca
onGooglePayLoaded()
cuando se completa la carga de la secuencia de comandospay.js
, como se define en el archivo HTML. Se invoca el métodoisReadyToPay()
para determinar si se muestra o no el botón de Google Pay. Si el consumidor está listo para pagar (es decir, agregó una forma de pago a su Billetera de Google), se renderiza el botón de Google Pay. onGooglePaymentButtonClicked()
se invoca cuando se hace clic en el botón de Google Pay. Este método invoca el método de la bibliotecaloadPaymentData()
, que se usa para recuperar un token de pago. Una vez que tengas el token de pago, lo enviarás a tu puerta de enlace de pagos para que procese la transacción.transactionInfo
describe la transacción que se debe procesar con este clic en el botón.
7. Conclusión
¡Felicitaciones por completar este codelab! Aprendiste a integrar la API de Google Pay en un sitio web.
Cómo ejecutar el proyecto
Prueba con Google Chrome
En el navegador web Google Chrome, abre index.html
con File > Open File… en el menú principal de Chrome. Chrome ejecutará main.js
cuando se abra el proyecto de esta manera. Es posible que otros navegadores web no permitan la ejecución de JavaScript.
– o –
Cómo realizar pruebas con un servidor web local
Si tienes instalado Python, ejecuta python3 -m http.server
desde un mensaje de la terminal en la carpeta raíz pay-web-101
.
$ cd /your/path/to/pay-web-101
$ python3 -m http.server
Serving HTTP on :: port 8000 (http://[::]:8000/) ...
Luego, visita tu sitio en http://localhost:8000
.
Lo que vendrá
- Google for Web 201: Avanzado
- Cómo personalizar el botón de Google Pay
- Revisa la lista de tareas de integración
Recursos adicionales
- Únete a la conversación en el canal#payments de Discord
- Sigue a @GooglePayDevs en X.
- Mirar videos relacionados con Google Pay en YouTube