En esta guía, se explica cómo agregar transacciones digitales a tu acción de conversación, para que los usuarios puedan comprar tus artículos digitales consumibles.
Términos clave: Un artículo digital consumible es una unidad de mantenimiento de inventario (SKU) que un usuario puede usar y comprar más de una vez, como la cantidad de moneda del juego de Android. Este elemento digital es diferente de un artículo digital no consumible que el usuario solo puede comprar una vez.
Para obtener más información sobre los productos únicos que se consumen, consulta la documentación de Android sobre las funciones específicas de productos únicos.
Flujo de transacción
En esta guía, se describe cada paso de desarrollo a medida que ocurren en un flujo de transacciones de artículos digitales. Cuando tu acción administra transacciones de artículos digitales, usa el siguiente flujo:
- Configura un cliente de la API de compras digitales: La acción usa la API de compras digitales para comunicarse con el inventario y las transacciones de Google Play. Antes de que tu Acción realice cualquier otra acción, crea un cliente JWT con una clave de servicio para comunicarse con la API de compras digitales.
- Recopilar información: La acción recopila información básica sobre el usuario y tu inventario de Google Play a fin de prepararse para una transacción.
- Valida los requisitos de las transacciones: Tu acción usa el ayudante de requisitos de transacciones digitales al comienzo del flujo de compra para asegurarte de que el usuario pueda realizar transacciones.
- Recopilar inventario disponible: La acción revisa tu inventario de Google Play y, luego, identifica qué elementos están disponibles para comprar.
- Crear el pedido: La acción presenta los artículos digitales disponibles al usuario para que pueda seleccionar uno para que compre.
- Completa la compra: Tu acción usa la API de compras digitales para iniciar una compra con la selección del usuario en Google Play Store.
- Controla el resultado: La acción recibe un código de estado para la transacción y notifica al usuario que la compra se realizó correctamente (o que realiza pasos adicionales).
- Haz que la compra sea repetible: Tu acción usa la API de compras digitales con el objetivo de "consumir" el artículo comprado, lo que permite que ese usuario vuelva a comprarlo.
Restricciones y lineamientos de revisión
Se aplican políticas adicionales a las Acciones con transacciones. La revisión de las acciones que incluyen transacciones puede tardar algunas semanas, por lo que debes tener en cuenta ese tiempo cuando planifiques tu programa de lanzamientos. A fin de facilitar el proceso de revisión, asegúrate de cumplir con las políticas y los lineamientos para las transacciones antes de enviar tu acción a revisión.
Las acciones que venden artículos digitales solo se pueden implementar en los siguientes países:
- Australia
- Brasil
- Canadá
- Indonesia
- Japón
- México
- Rusia
- Singapur
- Tailandia
- Turquía
- Reino Unido
- Estados Unidos
Requisitos previos
Antes de incorporar transacciones digitales en tu acción, necesitas los siguientes requisitos previos:
Una cuenta de desarrollador y una cuenta del comerciante en Google Play para administrar tus artículos digitales en Google Play Console
Un dominio web verificado en Google Search Console No es necesario que este dominio esté asociado con un sitio web lanzado de forma pública, solo debemos hacer referencia a tu dominio web.
Una app para Android con el permiso
com.android.vending.BILLING
en Google Play Console Tus artículos digitales serán "compras directas desde la aplicación" asociadas con esta app en Google Play Console.También debes crear una versión en Play Console con esta app. Sin embargo, si no quieres que sea pública, puedes crear una versión Alfa cerrada.
Si aún no tienes una app para Android, sigue las instrucciones para asociar una app para Android.
Uno o más productos administrados en Google Play Console, que son los artículos digitales que vendes con tu acción. Ten en cuenta que no puedes crear productos administrados en Play Console hasta que configures el requisito previo de la app para Android.
Si aún no tienes productos administrados, sigue las instrucciones para crear tus artículos digitales.
Cómo asociar una app para Android
Si actualmente no tienes una app para Android con el permiso de facturación en Google Play Console, sigue estos pasos:
- En Android Studio o el IDE de Android que elijas, crea un proyecto nuevo. Elige opciones en los mensajes de configuración del proyecto para crear una app muy básica.
- Asigna un nombre de paquete, como
com.mycompany.myapp
, al proyecto. No dejes este nombre como predeterminado, ya que no puedes subir paquetes que incluyancom.example
a Play Console. - Abre el archivo
AndroidManifest.xml
de tu app. Agrega la siguiente línea de código dentro del elemento
manifest
:<uses-permission android:name="com.android.vending.BILLING" />
El archivo
AndroidManifest.xml
debería verse como el siguiente bloque de código:<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.mycompany.myapp"> <uses-permission android:name="com.android.vending.BILLING" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" /> </manifest>
Compila tu app como un APK firmado. En Android Studio, sigue estos pasos:
- Ve a Build y a Generate Signed Bundle / APK.
- Haz clic en Siguiente.
- En Key store path, haz clic en Create new.
- Completa cada campo y haz clic en Aceptar. Anota la contraseña del almacén de claves y la contraseña de la clave y almacénalas en un lugar seguro, ya que las usarás más adelante.
- Haz clic en Siguiente.
- Selecciona Liberar.
- Selecciona V1 (JAR Signature).
- Haz clic en Finish.
- Después de unos segundos, Android Studio generará un archivo
app-release.apk
. Busca este archivo para usarlo más tarde.
En Google Play Console, crea una aplicación nueva.
Ve a Versiones de la app.
En Segmentos cerrados, ve a Administrar y, luego, a Alfa.
Haz clic en el botón Crear versión.
En Permitir que Google administre y proteja tu clave de firma, ingresa la información de tu clave de firma.
Sube el archivo APK.
Haz clic en Guardar.
Crea tus artículos digitales
Si actualmente no tienes artículos digitales en Play Console, sigue estos pasos:
- En Google Play Console, ve a Productos integrados en la aplicación y, luego, a Productos administrados. Si ves una advertencia, sigue las instrucciones anteriores a fin de crear una app para Android o haz clic en el vínculo a fin de crear un perfil de comercio.
- Haz clic en Crear producto administrado.
- Completa los campos de tu producto digital. Toma nota del ID del producto, que es la forma en la que harás referencia a este producto desde tu acción.
- Haz clic en Guardar.
- Repita los pasos 2 a 4 para cada producto que desee vender.
Prepara tu proyecto de Actions
Con los artículos digitales configurados en Google Play Console, debes habilitar las transacciones digitales y asociar tu proyecto de acciones con la app de Play.
Configuración
Para activar las transacciones de artículos digitales en tu proyecto de Actions, sigue estos pasos:
- En la Consola de Actions, abre tu proyecto o crea uno nuevo.
- Ve a Implementar y, luego, a Información del directorio.
- En Información adicional y Transacciones, marca la casilla Sí en ¿Tus acciones usan la API de compra digital para realizar transacciones de artículos digitales?.
- Haz clic en Guardar.
Crea una clave de API de artículos digitales
Para enviar solicitudes a la API de artículos digitales, debes descargar una clave de cuenta de servicio JSON asociada con tu proyecto de la Consola de Actions.
Para recuperar la clave de tu cuenta de servicio, sigue estos pasos:
- En la Consola de Actions, haz clic en el ícono de tres puntos en la esquina superior derecha y, luego, en Configuración del proyecto.
- Busca el ID del proyecto de tu acción.
- Sigue este vínculo y reemplaza "
<project_id>
" con el ID de tu proyecto:https://console.developers.google.com/apis/credentials?project=project_id
- En la navegación principal, ve a Credenciales.
- En la página que aparece, haz clic en Crear credenciales y, luego, en Clave de cuenta de servicio.
- Ve a Cuenta de servicio y haz clic en Nueva cuenta de servicio.
- Asigna un nombre a la cuenta de servicio, como transacciones digitales.
- Haz clic en Crear.
- Configura la Función como Proyecto > Propietario.
- Haz clic en Continuar.
- Haga clic en Crear clave.
- Selecciona el tipo de clave JSON.
- Haz clic en Crear clave y descarga la clave de la cuenta de servicio JSON.
Guarda esta clave de cuenta de servicio en un lugar seguro. La usarás en tu entrega a fin de crear un cliente para la API de compras digitales.
Conéctese a su inventario de Play
Para acceder a tus artículos digitales desde un proyecto de Actions, asocia tu dominio web y app con el proyecto como propiedades conectadas.
Para conectar tu dominio web y app de Play Console a tu proyecto de Actions, sigue estos pasos:
- En la Consola de Actions, ve a Deploy y, luego, a Verificación de marca.
Si no conectaste ninguna propiedad, primero debes conectar un sitio web:
- Haga clic en el botón de propiedad web (</>).
- Ingrese la URL de su dominio web y haga clic en Conectar.
Google envía un correo electrónico con más instrucciones a la persona que se verificó para ese dominio web en Google Search Console. Una vez que el destinatario de este correo electrónico siga esos pasos, el sitio web debería aparecer en Verificación de la marca.
Una vez que tengas al menos un sitio web conectado, sigue estos pasos a fin de conectar tu app para Android:
- En la Consola de Actions, ve a Deploy y, luego, a Verificación de marca.
- Haz clic en Conectar app.
En la página que aparece, sigue las instrucciones para verificar tu dominio web en Play Console. Selecciona la app de Play que contiene tus productos digitales y, luego, ingresa la URL de dominio web exactamente como se muestra en la página Verificación de marca.
Una vez más, Google envía un mensaje de verificación al propietario verificado del dominio. Una vez que aprueben la verificación, tu app de Play debería aparecer en Verificación de marca.
Habilita Acceder a las compras de Play.
Crea tu flujo de compra
Con el proyecto de Actions y el inventario de bienes digitales preparados, crea un flujo de compra de artículos digitales en el webhook de entrega de conversaciones.
1. Configura un cliente de la API de compras digitales
En el webhook de entrega de conversaciones, crea un cliente JWT con la clave JSON de tu cuenta de servicio y el permiso https://www.googleapis.com/auth/actions.purchases.digital
.
El siguiente código Node.js crea un cliente de JWT para la API de compras digitales:
const serviceAccount = {'my-file.json'};
const request = require('request');
const {google} = require('googleapis');
const jwtClient = new google.auth.JWT(
serviceAccount.client_email, null, serviceAccount.private_key,
['https://www.googleapis.com/auth/actions.purchases.digital'],
null
);
2. Recopila información
Antes de que un usuario pueda realizar una compra, tu acción recopila información sobre su capacidad para realizar compras y los productos que están disponibles en tu inventario.
2. a. Valida los requisitos de compra digital
Te recomendamos que te asegures de que la cuenta del usuario esté configurada para realizar transacciones antes de que tengan la opción de realizar una compra. Debes hacer la transición a una escena DigitalPurchaseCheck
, que verifica que el usuario esté verificado, que esté realizando la transacción en una plataforma permitida (pantalla inteligente, bocina inteligente o Android) y que se encuentre en una configuración regional donde se admitan las transacciones digitales.
Para crear una escena de verificación de compra digital, sigue estos pasos:
- En la pestaña Escenas, agrega una Escena nueva con el nombre
DigitalPurchaseCheck
. - En Relleno de ranuras, haz clic en + para agregar un espacio nuevo.
- En Seleccionar tipo, selecciona
actions.type.DigitalPurchaseCheckResult
como tipo de espacio. - En el campo del nombre de la ranura, asígnale el nombre
DigitalPurchaseCheck
. - Habilita la casilla de verificación Customize slot value writeback (habilitada de forma predeterminada).
- Haz clic en Guardar.
Una verificación de compra digital generará uno de los siguientes resultados:
- Si se cumplen los requisitos, el parámetro de sesión se establece con una condición de éxito y puedes permitir que el usuario compre productos digitales.
- Si no se pueden cumplir uno o más de los requisitos, el parámetro de sesión se establece con una condición de falla. En este caso, debes alejar la conversación de la experiencia transaccional o finalizarla.
Para administrar un resultado de la verificación de compra digital, sigue estos pasos:
- En la pestaña Scenes, selecciona la escena
DigitalPurchaseCheck
que acabas de crear. - En Condición, haz clic en + para agregar una condición nueva.
En el campo de texto, ingresa la siguiente sintaxis para verificar la condición correcta:
scene.slots.status == "FINAL" && session.params.DigitalPurchaseCheck.resultType == "CAN_PURCHASE"
Coloca el cursor sobre la condición que acabas de agregar y haz clic en la flecha hacia arriba para colocarla antes de
if scene.slots.status == "FINAL"
.Habilita Enviar mensajes y proporciona un mensaje simple que le informe al usuario que está listo para realizar una transacción.
candidates: - first_simple: variants: - speech: >- You are ready to purchase digital goods.
En Transition, selecciona otra escena y permite que el usuario continúe la conversación y realice una transacción.
Selecciona la condición
else if scene.slots.status == "FINAL"
.Habilita Enviar mensajes y proporciona un mensaje simple para que el usuario sepa que no puede realizar una transacción.
candidates: - first_simple: variants: - speech: Sorry you cannot perform a digital purchase.
En Transición, selecciona Finalizar conversación para finalizarla.
2. b. Recopile el inventario disponible
Usa la API de compras digitales a fin de solicitar el inventario disponible en Play Store y, luego, agrégalo a un array de objetos JSON para cada producto. Más adelante, deberás hacer referencia a este array para mostrarle al usuario las opciones disponibles para la compra.
Cada uno de tus artículos digitales se representa como un SKU en formato JSON. El siguiente código Node.js describe el formato esperado de cada SKU:
body = {
skus: [
skuId: {
skuType: one of "SKU_TYPE_IN_APP" or "SKU_TYPE_SUBSCRIPTION"
id: string,
packageName: string
}
formattedPrice: string,
title: string,
description: string
]
}
Envía una solicitud POST al extremo https://actions.googleapis.com/v3/packages/{packageName}/skus:batchGet
, en la que {packageName}
es el nombre del paquete de tu app en Google Play Console (por ejemplo, com.myapp.digitalgoods
) y da formato al resultado en un array de objetos SKU.
Para recuperar solo artículos digitales específicos del array resultante, enumera los ID de los productos digitales (como se muestra debajo de cada producto integrado en la aplicación en Google Play Console) que quieras que estén disponibles para la compra en body.ids
.
El siguiente código de Node.js solicita una lista de artículos disponibles de la API de compras digitales y da el resultado como un array de SKU:
return jwtClient.authorize((err, tokens) => {
if (err) {
throw new Error(`Auth error: ${err}`);
}
const packageName = 'com.example.projectname';
request.post(`https://actions.googleapis.com/v3/packages/${packageName}/skus:batchGet`, {
'auth': {
'bearer': tokens.access_token,
},
'json': true,
'body': {
'conversationId': conv.session.id,
'skuType': 'SKU_TYPE_IN_APP',
// This request is filtered to only retrieve SKUs for the following product IDs
'ids': ['consumable.1']
},
}, (err, httpResponse, body) => {
if (err) {
throw new Error(`API request error: ${err}`);
}
console.log(`${httpResponse.statusCode}: ${httpResponse.statusMessage}`);
console.log(JSON.stringify(body));
});
});
});
3. Cree el pedido
Para iniciar la compra digital del usuario, presenta una lista de tus artículos digitales disponibles para la compra. Puedes usar diversos tipos de respuestas enriquecidas para representar tu stock y solicitarle al usuario que seleccione una opción.
El siguiente código de Node.js lee un array de inventario de objetos SKU y crea una respuesta de lista con un elemento de lista para cada uno:
const items = [];
const entries = [];
skus.forEach((sku) => {
const key = `${sku.skuId.skuType},${sku.skuId.id}`
items.push({
key: key
});
entries.push({
name: key,
synonyms: [],
display: {
title: sku.title,
description: `${sku.description} | ${sku.formattedPrice}`,
}
});
});
conv.session.typeOverrides = [{
name: 'type_name',
mode: 'TYPE_REPLACE',
synonym: {
entries: entries
}
}];
conv.add(new List({
title: 'List title',
subtitle: 'List subtitle',
items: items,
}));
Crear compra a partir de la selección del usuario
Una vez que el usuario selecciona un artículo, puedes crear el pedido. Para hacerlo, en la ranura asociada con el elemento seleccionado, puedes llamar a tu webhook a fin de crear el pedido. Desde tu entrega, guarda los datos del pedido en un parámetro de sesión. El objeto de orden se usa entre escenas para la misma sesión.
conv.session.params.purchase = {
"@type": "type.googleapis.com/google.actions.transactions.v3.CompletePurchaseValueSpec",
"skuId": {
"skuType": "<SKU_TYPE_IN_APP>",
"id": "<SKU_ID>",
"packageName": "<PACKAGE_NAME>"
},
"developerPayload": ""
};
En Actions Builder, puedes usar el editor de JSON para configurar el espacio
con el objeto de pedido anterior. Ambas implementaciones usan el mismo formato para CompletePurchaseValueSpec
, que puedes encontrar en la referencia de carga útil de webhook de JSON.
4. Completa la compra
Una vez que el usuario seleccione un artículo, podrás completar la compra. Una vez que completes el espacio asociado con el elemento seleccionado, deberás cambiar a una escena en la que se realice la compra en su totalidad.
Crea una escena de compra completa
- En la pestaña Escenas, agrega una escena nueva con el nombre
CompletePurchase
. - En Relleno de ranuras, haz clic en + para agregar un espacio nuevo.
- En Seleccionar tipo, selecciona
actions.type.CompletePurchaseValue
como el tipo de espacio. - En el campo del nombre de la ranura, asígnale el nombre
CompletePurchase
. - Habilita la casilla de verificación Personalizar la escritura de valores de ranura (habilitada de forma predeterminada).
- En Configure slot, selecciona
Use session parameter
en el menú desplegable. - En Configura el espacio, ingresa el nombre del parámetro de la sesión que se usó para almacenar el pedido en el campo de texto (es decir,
$session.params.purchase
). - Haz clic en Guardar.
5. Cómo controlar el resultado
Una ranura con el tipo actions.type.CompletePurchaseValue
puede tener los siguientes resultados:
PURCHASE_STATUS_OK
: La compra se realizó correctamente. La transacción se completó en este punto, por lo que debes salir del flujo de transacciones y volver a la conversación.PURCHASE_STATUS_ALREADY_OWNED
: La transacción falló porque el usuario ya es propietario de ese elemento. Para evitar este error, revisa las compras anteriores del usuario y adapta los elementos que se muestran para que no tengan la opción de volver a comprarlos.PURCHASE_STATUS_ITEM_UNAVAILABLE
: la transacción falló porque el elemento solicitado no está disponible. Para evitar este error, verifica los SKU disponibles más cerca del momento de la compra.PURCHASE_STATUS_ITEM_CHANGE_REQUESTED
: La transacción falló porque el usuario decidió comprar algo más. Vuelve a preguntar con la compilación de tu pedido para que el usuario pueda tomar otra decisión de inmediato.PURCHASE_STATUS_USER_CANCELLED
: La transacción falló porque el usuario canceló el flujo de compra. Dado que el usuario salió prematuramente del flujo, pregúntale si quiere reintentar la transacción o salir de ella por completo.PURCHASE_STATUS_ERROR
: No se pudo realizar la transacción por una razón desconocida. Infórmale al usuario que no se pudo realizar la transacción y pregúntale si quiere volver a intentarlo.PURCHASE_STATUS_UNSPECIFIED
: Se produjo un error desconocido debido a la transacción, lo que generó un estado desconocido. Para manejar este estado de error, informa al usuario que la transacción falló y pregúntale si quiere volver a intentarlo.
Debes controlar cada uno de estos resultados de tu escena de CompletePurchase
.
- En la pestaña Scenes, selecciona la escena
CompletePurchase
que acabas de crear. - En Condición, haz clic en + para agregar una condición nueva.
En el campo de texto, ingresa la siguiente sintaxis para verificar la condición correcta:
scene.slots.status == "FINAL" && session.params.CompletePurchase.purchaseStatus == "PURCHASE_STATUS_OK"
Coloca el cursor sobre la condición que acabas de agregar y haz clic en la flecha hacia arriba para colocarla antes de
if scene.slots.status == "FINAL"
.Habilita Enviar mensajes y proporciona un mensaje simple que le informe al usuario que está listo para realizar una transacción.
candidates: - first_simple: variants: - speech: >- Your purchase was successful.
En Transición, selecciona Finalizar conversación para finalizarla.
Repite los pasos anteriores para cada tipo de resultado de compra que desees admitir.
6. Haz que la compra sea repetible
Después de realizar una transacción exitosa, envía una solicitud POST a la API de compras digitales para consumir el artículo, lo que le permite al usuario volver a comprarlo. Envía tu
solicitud al extremo https://actions.googleapis.com/v3/conversations/{sessionId}/entitlement:consume
con el ID de la sesión que se encuentra en session.id
.
Tu solicitud POST también debe incluir el objeto del token de compra asociado con la compra del usuario, que se encuentra en el archivo JSON de la solicitud del usuario en packageEntitlements.entitlements.inAppDetails.inAppPurchaseData.purchaseToken
.
El siguiente código envía una solicitud consume
a la API de compras digitales y, luego, informa si la solicitud se realizó correctamente:
request.post(`https://actions.googleapis.com/v3/conversations/${conv.session.id}/entitlement:consume`, {
'auth': {
'bearer': tokens.access_token,
},
'json': true,
'body': {
// This purchase token is in both the purchase event and the user's entitlements
// in their request JSON
"purchaseToken": entitlement.purchaseToken
},
}, (err, httpResponse, body) => {
if (err) {
throw new Error(`API request error: ${err}`);
}
console.log(`${httpResponse.statusCode}: ${httpResponse.statusMessage}`);
console.log(JSON.stringify(httpResponse));
console.log(JSON.stringify(body));
resolve(body);
});
// Make sure the consume request was successful. In production, don't notify the user; handle failures on the back end
return consumePromise.then(body => {
const consumed = Object.keys(body).length === 0;
if (consumed) {
conv.add(`You successfully consumed ${id}`);
} else {
conv.add(`Failed to consume: ${id}`);
}
});
Reflejar las compras del usuario
Cuando un usuario consulta tu acción, el objeto user
de la solicitud JSON incluye una lista de sus compras. Verifica esta información y cambia la respuesta de tu acción según el contenido que haya pagado el usuario.
En el siguiente código de muestra, se muestra el objeto user
de una solicitud que incluye el packageEntitlements
de compras directas desde la aplicación anteriores que realizaron para el paquete com.digitalgoods.application
:
{
"handler": {
"name": "handler_name"
},
"intent": {
"name": "actions.intent.MAIN",
"params": {},
"query": ""
},
"scene": {
"name": "SceneName",
"slotFillingStatus": "UNSPECIFIED",
"slots": {}
},
"session": {
"id": "example_session_id",
"params": {},
"typeOverrides": []
},
"user": {
"locale": "en-US",
"params": {
"verificationStatus": "VERIFIED"
"packageEntitlements": [
{
"packageName": "com.digitalgoods.application",
"entitlements": [
{
"sku": "non-consumable.1",
"skuType": "SKU_TYPE_IN_APP"
}
{
"sku": "consumable.2",
"skuType": "SKU_TYPE_IN_APP"
}
]
},
{
"packageName": "com.digitalgoods.application",
"entitlements": [
{
"sku": "annual.subscription",
"skuType": "SKU_TYPE_SUBSCRIPTION",
"inAppDetails": {
"inAppPurchaseData": {
"autoRenewing": true,
"purchaseState": 0,
"productId": "annual.subscription",
"purchaseToken": "12345",
"developerPayload": "HSUSER_IW82",
"packageName": "com.digitalgoods.application",
"orderId": "GPA.233.2.32.3300783",
"purchaseTime": 1517385876421
},
"inAppDataSignature": "V+Q=="
}
}
]
}
]
}
},
"homeStructure": {
"params": {}
},
"device": {
"capabilities": [
"SPEECH",
"RICH_RESPONSE",
"LONG_FORM_AUDIO"
]
}
}
Prueba tu proyecto
Cuando pruebas tu proyecto, puedes habilitar el modo de zona de pruebas en la Consola de Actions para probar tu acción sin cobrar una forma de pago. Para habilitar el modo de zona de pruebas, sigue estos pasos:
- En la Consola de Actions, haz clic en Test en el menú de navegación.
- Haz clic en Configuración.
- Habilita la opción Zona de pruebas de desarrollo.