Tutorial parte 4: Desarrolla aplicaciones de voz multiplataforma con VOXA

In-Skill Purchases para Alexa skills y Digital Goods para Google Assistant.

Octavio Menocal
9 min readOct 17, 2019

--

Imagen vía www.pixabay.com

Esta es la cuarta parte de la serie de artículos para crear aplicaciones de voz multiplataforma con VOXA.

En el artículo anterior, creamos la lógica de nuestro juego, la forma en que calcularíamos los puntos, como crear de forma aleatoria una operación matemática para que el usuario calcule el resultado, y conectamos nuestra aplicación de voz a DynamoDB para guardar el progreso del usuario en el juego.

Esto nos permite publicar un juego de voz para las tiendas de Alexa y Google Assistant, pero me gustaría ir un poco más allá.

En este artículo, vamos a agregar ISP para Alexa y Digital Goods para Google Assistant para vender una suscripción mensual para una competencia en el juego. Veamos cómo hacer esto!

En ambas plataformas de voz, Alexa y Google Assistant, hay 3 formas de monetizar tu aplicación:

  • Entitlements: compras de una sola ocasión, obtienes lo que compras de por vida.
  • Subscriptions: Paga un monto mensual o anual para acceder contenido exclusivo.
  • Consumables: Compra una característica de la aplicación o producto de forma recurrente, por ejemplo, vidas en un juego.

Vamos a implementar una competencia mensual para nuestra aplicación quick maths a través de una suscripción.

Los usuarios podrán jugar de forma normal, pero si quieren participar en la competencia, tendrán que suscribirse por $0.99 al mes.

In-Skill Purchases (ISP) para Alexa

Empecemos por agregar una suscripción ISP para Alexa. Asegúrate de tener instalado el ASK CLI. Ve al folder principal de tu proyecto y ejecuta lo siguiente:

Agregar ISP para tu Alexa skill

Selecciona Subscription y nómbralo: competition.

ISP competition creado

El archivo JSON será creado en el folder principal del proyecto en la ruta: ./isps/subscription/competition.json.

Para subir tu suscripción ISP, puedes usar el comando:

ask deploy -t isp
Subir tu ISP con el ASK CLI

Esto solamente subirá los cambios del folderisps, no del modelo de interacción ni del archivoskill.json.

Puedes descargar la última versión del proyecto en la rama part4. El 3 de junio, Amazon anunció que ISP había sido agregado a los idiomas de U.K. y Alemania, entonces vamos a vender nuestra suscripción no solamente a los usuarios de la tienda U.S. sino también a los usuarios en U.K.

Google Assistant si soportó esta región desde su inicio. El precio para la tienda U.K. será de 0.99 libras.

Digital Goods para Google Assistant

Configurar digital goods para Google Assistant es un poco más difícil.

Bien, el primer obstáculo que tendrás es que necesitas comprar un dominio para asociarlo a tu action. En mi caso, no había necesitado un dominio antes, así que tuve que comprar uno nuevo con Google Domains.

Cuando tengas tu dominio, ve a la configuración de tu action, en la pestaña Deploy, luego al menú Brand verification, y haz click en el botón Connect site.

Conecta tu dominio a tu action

Escribe la URL de tu dominio y haz click en Connect.

Solicitud de verificación de marca completada

Deberías esperar un máximo de 48 horas para que tu dominio sea verificado. Como mi dominio fue creado con Google Domains, el tiempo que le tomó en ser verificado fue menos de 6 horas.

Ahora, es tiempo de crear la in-app suscripción. Para Google Assistant, necesitas crear un producto in-app en tu cuenta de Developer Play Console. Y, este es el siguiente pago que necesitas para tu action. Crear una cuenta en la Play console cuesta $25 al tiempo de esta publicación.

Cuando vas a la consola de Google Play, la vista principal luce así. En mi caso, yo ya tengo un producto in-app para otra aplicación. Haz click en el botón CREATE APPLICATION para crear una nueva suscripción.

Vista principal de las aplicaciones de la Play Store

Selecciona el idioma (por defecto en-US) y escribe un título, luego haz click en CREATE.

Nombre tu suscripción in-app

Luego, necesitas llenar algunos campos como lo haces para Google Assistant; descripción, imágenes, y, lo más importante, el APK vacío únicamente con el permiso BILLING en el archivo manifest.

Información de la tienda para tu producto in-app

Luego, ve al menú App Releases y sube el APK de tu aplicación Android.

De acuerdo a la documentación, no necesitas tener una aplicación pública en la tienda, solo necesitas crear tu producto in-app en uno de los canales de publicación. En este caso, voy a lanzar el APK en el canal beta abierto.

Lanza una nueva versión de tu aplicación Android vacía

Ahora, necesitas asociar tu sitio web a tu producto in-app para que la consola de Google Actions tenga tus productos disponibles para asociarlos a tu action.

Ve al menú Services & APIs para asociar tu sitio web.

Asocia tu sitio web para tu suscripción in-app

En el menú Content rating, aplica para un rating para tu aplicación. Para el rate de tu aplicación, necesitas primero haber subido el APK. Al final, vamos de vuelta al menú de lanzamiento de la App para mandar la aplicación a certificación.

Rating para tu suscripción in-app

En el menú Price & distribution, selecciona los países en los que quieres que esté disponible tu suscripción, por defecto están seleccionados 145 países, 4 de ellos están prohibidos por políticas de Google.

Incluso puedes modificar el precio de tu suscripción para cada país. El monto seleccionado por defecto es el mínimo.

Países en los que quieres distribuir tu aplicación y sus precios

Finalmente, en el menú App content, selecciona la audiencia meta de tu aplicación.

Audiencia meta

Cuando todas las casillas verdes están marcadas, significa que estás listo para mandar tu aplicación a certificación.

Ve al menú App Release. Luego, tienes que esperar algunos días para que tu producto in-app aparezca en la consola de Google Actions, en mi caso, me tomo 3 días, de Sábado a Martes.

Productos In-app asociados a tu action

Configuración de la Consola de Google Cloud

Ahora que has configurado la consola de Google Play, debemos crear una llave JSON para poder consultar las suscripciones en Google Play.

La forma más fácil de ir a las configuraciones de tu proyecto en Google Cloud es mediante la consola de Google Actions; en el menú Test, luego ve a la esquina de arriba a la derecha y haz click en el menú settings, y haz click en la etiqueta de Manage user access.

Acceso a la configuración del proyecto en Google Cloud

Esto te llevará al menú IAM en Google Cloud donde puedes invitar a otras personas a probar tu aplicación. Para obtener una llave, ve al menú Service accounts.

Vista de la Consola de Google Cloud

Haz click en la etiqueta CREATE SERVICE ACCOUNT, escribe un nombre para tu llave y una descripción, y descarga la llave JSON para tu proyecto. Asegúrate de poner este archivo en esta ruta en tu proyecto: ./src/client_secret.json.

Ahora, ve a la vista principal de APIs, haz click en ENABLE APIS AND SERVICES y busca la API de Actions para habilitarla.

APIs & Services
Actions API para tu proyecto

Algo que necesitas revisar

Esta sección fue escrita el 1 de Septiembre, 2 meses después que inicié escribiendo este artículo.

Tuve muchos problemas todo este tiempo tratando de averiguar por qué me daba un error extraño: INVALID_ARGUMENTS; que no está documentado. Incluso me comuniqué con el equipo de Google pero ellos no supieron exactamente de qué se trataba.

Después de todo este tiempo, encontré el error. Pero más que un error, es como un aspecto técnico que debería estar aclarado en la documentación.

El usuario que está probando tu aplicación no debe hacer click en la etiqueta Stop <actionName> from remembering me por ninguna razón.

Si ellos hacen click en esta opción, ellos serán automáticamente considerados como un GUEST en tu aplicación y este usuario no podrá comprar tu suscripción o cualquier otro digital good.

Si un usuario es un guest, el valor conversationId de la petición JSON viene como un string numerado como este153982789723948, en lugar de un string largo como este:

ABwppHEqSttOVOPiYZE8SJ35bO4qzHGxE7dhEi3W3s4P7kOA_34Lu0607awo9S2fgK1rAxIu8PxcHclUZsVQU

Asegúrate de revisar en tu cuenta cuando estés creando tu Google Action y en otras cuentas con las cuales pudieras tener este tipo de problemas.

Lógica de la competencia

Como debiste haber notado en la parte 2, tenemos intents para manejar operaciones para vender la suscripción, como un soporte para cuando el usuario pide entrar a la competencia, o pide una devolución, que cosa pueden comprar, que compraron, preguntar por su puntaje, y días restantes para la competencia.

Todos estos intents son manejados en un nuevo archivo controlador llamado competition.states.js.

Archivo competition.states.js

Este archivo contiene todos los manejadores y validaciones para vender digital goods y ISP. Uno de los estados en los que quería hacer más énfasis es el estado competition:

Una vez que el usuario solicita entrar a la competencia, revisamos si el usuario ya está suscrito para avisarles que no hay necesidad de suscribirse nuevamente.

Luego, verificamos si no han asociado su cuenta. Esto es importante para saber el nombre y dirección de correo electrónico del usuario. Después de eso, verificamos validaciones específicas de cada plataforma.

Para Alexa, revisamos si los usuarios han dado permiso para acceder a su ubicación, esto es para mostrar en la tabla de liderazgo de dónde son. VOXA tiene un útil manejador para obtener la dirección del usuario simplemente ejecutando este comando:

const info = await voxaEvent.alexa.deviceAddress.getAddress();

Para Google Assistant, necesitamos acceder a la ubicación del usuario, entonces enviamos la directiva dialogflowPermission para solicitar los permisos DEVICE_PRECISE_LOCATION y DEVICE_COARSE_LOCATION.

Cuando el usuario acepta o rechaza esta petición, el actions_intent_PERMISSION estado manejará esta respuesta y nosotros validaremos si el permiso está otorgado o no para continuar.

Si todo está bien hasta ahora, para Alexa enviamos la directiva alexaConnectionsSendRequest:

const buyDirective = await voxaEvent.alexa.isp.buyByReferenceName(
config.alexa.subscriptionId,
token,
);
return {
alexaConnectionsSendRequest: buyDirective,
};

Para Google Assistant, la directiva que usaremos es googleCompletePurchase. Puedes aprender más acerca del proceso completo en su guía para digital goods.

Cuando el proceso de compra es lanzado en Google Assistant, mostrará una pantalla como esta en tu teléfono:

Recibo cuando se compra un Digital Good con Google Assistant

Cuando el proceso de compra finaliza, nuestra aplicación VOXA manejará la respuesta de Alexa en el estado Connections.Response y la respuesta de Google en el estado CompletePurchaseIntent.

Final

Otra porción de código que estoy seguro le prestarás mucha atención es como mostramos la tabla de liderazgo en los dispositivos con pantalla.

En el siguiente y último artículo, verás cómo podemos agregar plantillas APL (Alexa Presentation Language por sus siglas en inglés) y una Tabla para Google Assistant, mostrando la tabla de liderazgo de nuestro juego.

¡Gracias por leer! Asegúrate de leer los demás artículos de la serie.

Recuerda: ¡No tires basura al océano!

--

--

Octavio Menocal

Software engineer at Soar.com. Nicaraguan developing Amazon Alexa Skills and actions for Google Assistant. Pingpong lover, big fan of Ma Long!