Google Pay via widget
Nesta página
Este guia orienta você na integração Google Pay usando os SKDs DEUNA. Abrange os dois caminhos de integração que o SDK expõe:
| Widget de pagamento | Cofre de Pagamentos | |
|---|---|---|
| O que isso faz** | Lida com o checkout completo: UI, processamento de pagamento e confirmação | Tokeniza apenas o cartão – retorna um card_id para você usar |
| Quem processa a compra | DEUNA (internamente) | Você (por meio da API de compra do seu back-end) |
| Botão Google Pay | Renderizado dentro do iframe da DEUNA | Renderizado por você, em sua própria UI |
| Método SDK | initPaymentWidget | initElements({ types: ['GOOGLE_PAY'] }) |
| Usar quando | Você quer uma experiência de checkout imediato | Você precisa de controle sobre o fluxo de pagamento ou deseja guardar o cartão para mais tarde |
1. Pré-requisitos#
Antes de começar, certifique-se de que o seguinte esteja em vigor:
| Requisito | Notas |
|---|---|
| Conta DEUNA | Conta de comerciante ativa no DEUNA Dashboard. |
publicApiKey | Chave API pública emitida pela DEUNA. Obrigatório para DeunaSDK.initialize. |
orderToken | Gerado em seu backend por meio da API DEUNA Orders. Necessário para iniciar um pagamento. |
userToken (opcional) | Necessário apenas quando você deseja tokenizar o cartão contra um usuário DEUNA conhecido. |
| Requisitos de compatibilidade | Consulte o oficial Guia de dispositivos compatíveis com Google Pay. O Google Pay é compatível com Chrome, Firefox, Safari, Edge, Opera e navegador UC. Para integrações do Android WebView, aplicam-se requisitos adicionais — consulte o Guia do Android WebView |
2. O que precisa ser pré-configurado para o Google Pay#
A configuração tem duas partes: credenciais e, para produção, registro de domínio dentro do Google Pay Business Console.
2.1 Credenciais (administradas pela DEUNA)
DEUNA resolve as credenciais do Google Pay na configuração do seu comerciante. Os campos envolvidos são:
| Campo | Significado | De onde vem |
|---|---|---|
merchantId | Seu ID de comerciante do Google Pay (por exemplo, 12345678901234567890). | Google Pay Business Console, armazenado no DEUNA Dashboard. |
merchantName | Etiqueta mostrada na planilha do Google Pay. | Painel DEUNA. |
gateway | Identificador do gateway de pagamento (por exemplo, "deuna"). Usado com PAYMENT_GATEWAY tokenization. | Painel DEUNA. |
gatewayMerchantId | Identificador do comerciante dentro do gateway. | Painel DEUNA. |
tokenizationType | "PAYMENT_GATEWAY" (padrão) ou "DIRECT". | Escolha do comerciante. |
publicKey (somente DIRETO) | Chave pública codificada em Base64 usada para tokenização DIRECT. | Painel DEUNA. |
protocolVersion (somente DIRETO) | O padrão é "ECv2". | Painel DEUNA. |
allowedCardNetworks | Subconjunto de VISA, MASTERCARD, AMEX, DISCOVER, INTERAC, JCB. | Opcional — padrões fornecidos. |
allowedCardAuthMethods | PAN_ONLY, CRYPTOGRAM_3DS. | Opcional — padrões fornecidos. |
A maioria das integrações usará PAYMENT_GATEWAY tokenização com DEUNA como gateway. DIRECT é reservado para comerciantes que descriptografam o token do Google Pay.
O que você precisa fornecer/confirmar no Dashboard DEUNA:
- Credencial do Google Pay habilitado para seu comerciante.
- Merchant ID e nome do comerciante.
- Portal e gateway merchant ID (para PAYMENT_GATEWAY).
- Redes permitidas e métodos de autenticação (opcional).
2.2 Registro de domínio (somente produção)
O Google Pay exige que todos produção domínio seja registrado no Console Empresarial do Google Pay antes de poder receber pagamentos em tempo real:
- Acessar Google Pay e Wallet Console → Integração → Informações comerciais.
- Registre o(s) domínio(s) que carregarão o Web‑SDK (por exemplo,
checkout.mystore.com). - Envie sua integração para aprovação (são necessárias capturas de tela do fluxo de checkout).
Nenhum arquivo precisa ser hospedado em seu domínio. Os ambientes de teste/sandbox funcionam imediatamente – apenas a produção requer o registro do console.
O SDK muda automaticamente o Google Pay para
TESTmodo para qualquerenvalém de"production", para que você possa desenvolver e fazer controle de qualidade sem registro no console.
3. Integrações#
Certifique-se de seguir o guia de primeiros passos para nossos SDKs, dependendo da sua integração específica:
3.1 Widget de Pagamento
Use este caminho quando quiser que a DEUNA administre toda a experiência de checkout (IU, processamento de pagamento e confirmação).
Quando você precisa de getWalletsAvailable no widget de pagamento?
Se você abrir o widget com todos os métodos de pagamento habilitados, não será necessário chamar esse método — DEUNA renderiza o seletor de método de pagamento (incluindo botões de carteira) e resolve a disponibilidade internamente.
Você só precisa getWalletsAvailable quando você renderiza seu próprio botão Apple Pay fora do seletor e usa o widget de pagamento no modo autônomo para ir diretamente para esse método de pagamento. Nesse caso, ligue com antecedência para decidir se deseja mostrar seu botão.
SDK Web
Nenhuma configuração extra necessária: você não precisa incluir manualmente os scripts do Google. O SDK da Web carrega dinamicamente o SDK JavaScript do Google Pay (pay.js) no momento em que initPaymentWidget é chamado.
// 1) Initialize the SDK
await DeunaSDK.initialize({
env: 'sandbox',
publicApiKey: '<YOUR_PUBLIC_API_KEY>',
});
// 2) Check availability + warm up the Google Pay provider
const available = await DeunaSDK.getWalletsAvailable();
if (available.includes('GOOGLE_PAY')) {
// Render button for Google Pay and append a listener (EXAMPLE)
btn.addEventListener('click', () => {
DeunaSDK.initPaymentWidget({
orderToken: '<order-token>', // REQUIRED
paymentMethods: [
{
paymentMethod: 'wallet',
processors: ['google_pay'],
},
], // In case only the specific payment method is to be used
callbacks: {
onSuccess: (order) => {
console.log('Payment completed:', order);
},
onError: (error) => {
console.error('Payment failed:', error.metadata.message);
},
onClosed: (action) => {
console.log('Widget closed:', action);
},
},
});
});
} else {
console.error('Google Pay is not available on this device.');
}SDK Android
No Android, o Google Pay é habilitado via PaymentRequest no WebView usado pelo DEUNA SDK. O aplicativo host deve aplicar a seguinte configuração:
- Adicione o seguinte ao módulo do seu aplicativo
build.gradleoubuild.gradle.kts:GROOVYdependencies { implementation("androidx.webkit:webkit:1.14.0") } AndroidManifest.xmlConsultas: o app host precisa declarar essas intenções para permitir a comunicação com o Google Pay.AndroidManifest.xmlXML<queries> <intent> <action android:name="org.chromium.intent.action.PAY" /> </intent> <intent> <action android:name="org.chromium.intent.action.IS_READY_TO_PAY" /> </intent> <intent> <action android:name="org.chromium.intent.action.UPDATE_PAYMENT_DETAILS" /> </intent> </queries>- Configuração do SDK: Esta configuração deve ser executada antes de chamar
initPaymentWidgetmétodo ou renderizar um incorporadoDeunaWidget.Kotlinimport androidx.webkit.WebSettingsCompat import androidx.webkit.WebViewFeature import com.deuna.maven.DeunaSDK import com.deuna.maven.shared.Environment val deunaSDK = DeunaSDK( environment = Environment.SANDBOX, publicApiKey = "YOUR_PUBLIC_API_KEY" ) // This enables the host app to configure PaymentRequest for Google Pay support. deunaSDK.applyCustomWebViewSettings { settings -> // Guard the call to avoid crashes on devices/WebView versions that do not support PaymentRequest. if (WebViewFeature.isFeatureSupported(WebViewFeature.PAYMENT_REQUEST)) { // Enable PaymentRequest API on DEUNA's internal WebView settings. WebSettingsCompat.setPaymentRequestEnabled(settings, true) } }
3.2 Cofre de Pagamento
Use este caminho quando quiser renderizar um botão nativo do Google Pay dentro de sua própria IU (sem iframe DEUNA). Comum em checkouts personalizados/sem cabeça.
SDK Web
Deixe o SDK da Web resolver as credenciais do Google Pay do back-end da DEUNA usando seu publicApiKey e (opcionalmente) um orderToken.
Para mais informações consulte o getWalletsAvailable documentation.
// 1) Initialize the SDK
await DeunaSDK.initialize({
env: 'sandbox',
publicApiKey: '<YOUR_PUBLIC_API_KEY>',
});
// 2) Check availability + warm up the Google Pay provider
const available = await DeunaSDK.getWalletsAvailable();
if (available.includes('GOOGLE_PAY')) {
// Render button for Google Pay and append a listener (EXAMPLE)
btn.addEventListener('click', () => {
deuna.initElements({
types: [{ name: 'GOOGLE_PAY' }],
orderToken: '<order-token>', // REQUIRED FOR MERCHANTS
userInfo: {
email: '<email>',
firstName: '<firstName>',
lastName: '<lastName>',
},
callbacks: {
// Called after user approves the Google Pay sheet.
// Send the token to your backend, return the result.
onSuccess: async (payload) => {
const cardId = payload.data.card_id;
// use the cardId to process payment
},
onError: (error) => {
console.error('Payment failed:', error.metadata.message);
},
},
});
});
} else {
console.error('Google Pay is not available on this device.');
}SDK Android
Use este caminho quando quiser renderizar diretamente uma planilha nativa do Google Pay. O SDK verifica a disponibilidade do dispositivo, busca as credenciais do Google Pay no back-end da DEUNA e inicia a planilha de pagamento. O resultado é uma carga de cartão tokenizada entregue ao seu onSuccess callback.
Passo 1 – Verifique a disponibilidade
Chame getWalletsAvailable() uma vez, antes que o usuário chegue à etapa de pagamento. O SDK verifica a configuração do comerciante DEUNA e se o dispositivo possui Google Play Services com um cartão salvo.
import com.deuna.maven.DeunaSDK
import com.deuna.maven.shared.Environment
import com.deuna.maven.wallets.GetWalletsAvailableParams
import com.deuna.maven.wallets.WalletProvider
import com.deuna.maven.wallets.getWalletsAvailable
val deunaSDK = DeunaSDK(
environment = Environment.SANDBOX,
publicApiKey = "YOUR_PUBLIC_API_KEY",
)
deunaSDK.getWalletsAvailable(
context = context,
params = GetWalletsAvailableParams(
orderToken = "<order-token>", // optional — pass if you have one at this point
),
) { wallets, error ->
if (error != null) {
// handle fetch error
return@getWalletsAvailable
}
val googlePayAvailable = WalletProvider.GOOGLE_PAY in wallets
// show or hide your Google Pay button based on googlePayAvailable
}Passo 2 — Inicie o Google Pay
Quando o usuário tocar no botão do Google Pay, ligue initElements com GOOGLE_PAY como o tipo. O SDK busca novas credenciais para o pedido e, em seguida, inicia a planilha de pagamento nativa.
// Wire this to your Google Pay button's onClick
deunaSDK.initElements(
context = context,
types = listOf(mapOf("name" to "GOOGLE_PAY")),
orderToken = "<order-token>",// required for google pay wallet
userInfo = UserInfo(// optional — associate with a DEUNA user
email = "user@example.com",
firstName = "Jane",
lastName = "Doe",
),
callbacks = ElementsCallbacks().apply {
onSuccess = { payload ->
// payload contains the tokenized card data
// send it to your backend to complete the purchase
}
onError = { error ->
// error.metadata.code and error.metadata.message describe the failure
}
onClosed = { action ->
// user dismissed the sheet
}
},
)SDK React Native
Use este caminho quando quiser renderizar uma planilha nativa do Google Pay diretamente, sem um WebView. O SDK verifica a disponibilidade do dispositivo, busca as credenciais do Google Pay no back-end da DEUNA e inicia a planilha de pagamento. O resultado é uma carga de cartão tokenizada entregue ao retorno de chamada onSuccess.
Pré-requisitos:
- O dispositivo deve ter o Google Play Services instalado e atualizado.
- O dispositivo deve ter pelo menos um cartão salvo na Google Wallet.
- A conta do comerciante deve ter o Google Pay ativado no painel DEUNA.
Reagir CLI nativo - adicionar a android/app/src/main/AndroidManifest.xml:
<application>
...
<meta-data
android:name="com.google.android.gms.wallet.api.enabled"
android:value="true" />
</application>Expo — adicionar ao app.json e execute o pré- compilação do expo do npx:
{
"expo": {
"android": {
"manifestTransforms": [
{
"type": "meta-data",
"name": "com.google.android.gms.wallet.api.enabled",
"value": "true"
}
]
}
}
}import { useState, useEffect } from 'react';
import { DeunaSDK } from '@deuna/react-native-sdk';
// 1) Initialize the SDK
const sdk = new DeunaSDK({
publicApiKey: '<YOUR_PUBLIC_API_KEY>',
environment: 'sandbox', // 'production' | 'sandbox'
});
// 2) Check availability
const available = await sdk.getWalletsAvailable({
orderToken: '<order-token>',
userInfo: {
email: '<email>',
firstName: '<firstName>',
lastName: '<lastName>',
},
});
// 3) Launch
if (available.includes('google_pay')) {
sdk.initElements({
orderToken: '<order-token>', // required
types: [{ name: 'google_pay' }],
userInfo: { // required
email: '<email>',
firstName: '<firstName>',
lastName: '<lastName>',
},
callbacks: {
onSuccess: (payload) => {
const cardId = payload?.card_id;
// use cardId to process payment on your backend
},
onError: (error) => {
console.error('Payment failed:', error.metadata.message);
},
onClosed: (action) => {
console.log('Sheet dismissed by', action);
},
},
});
}Pegadinhas#
| Te peguei | Correção |
|---|---|
| Botão não renderiza | Verifique getWalletsAvailable() result. isReadyToPay pode estar rejeitando o dispositivo. Verifique se você está conectado ao Google e se possui um cartão salvo. |
| Funciona localmente, falha na produção | O domínio não está registrado no Google Pay Business Console. |
DEVELOPER_ERROR na folha | merchantId, gateway, ou gatewayMerchantId está errado ou ausente. Verifique novamente o walletConfig. |
| A planilha abre, mas não há formas de pagamento | Redes de cartões em allowedCardNetworks não correspondem a nenhum cartão salvo na conta do Google. |
| A descriptografia do token falha no seu back-end | Você está dentro DIRECT modo com uma incompatibilidade publicKey / protocolVersion. Prefiro PAYMENT_GATEWAY a menos que você precise de dados brutos do cartão. |
Referência rápida
| API | Objetivo |
|---|---|
DeunaSDK.getWalletsAvailable() | Verifique quais carteiras podem ser utilizadas + provedores de aquecimento. |
DeunaSDK.initElements({ types, orderToken?, walletConfig?, callbacks }) | Monte botões de carteira nativos em sua própria UI. |
| Console Empresarial do Google Pay | Onde os domínios de produção devem ser registrados. Nenhum arquivo para hospedar em seu servidor. |