{"id":137923,"date":"2021-09-29T00:00:00","date_gmt":"2021-09-29T00:00:00","guid":{"rendered":"https:\/\/adapty.io\/es-android-in-app-purchases-part-4-billing-library-error-codes-and-how-not-to-fail-testing\/"},"modified":"2025-06-26T13:05:05","modified_gmt":"2025-06-26T13:05:05","slug":"android-in-app-purchases-part-4-billing-library-error-codes-and-how-not-to-fail-testing","status":"publish","type":"post","link":"https:\/\/adapty.io\/es\/blog\/android-in-app-purchases-part-4-billing-library-error-codes-and-how-not-to-fail-testing\/","title":{"rendered":"Las compras dentro de la aplicaci\u00f3n de Android, parte 4: facturaci\u00f3n de los C\u00f3digos de Error de la Biblioteca y c\u00f3mo no fallar en las pruebas."},"content":{"rendered":"\n
Hoy hablaremos de los c\u00f3digos de error<\/a> que podemos obtener de la Biblioteca de Facturaci\u00f3n en el m\u00e9todo getResponseCode()<\/a>.<\/p>\n\n\n\n Puedes encontrar un ejemplo de c\u00f3mo pasamos los errores en nuestras devoluciones de llamada en este art\u00edculo<\/a>. Ya hemos considerado uno de los errores en art\u00edculos anteriores: se trata de USER_CANCELED<\/strong><\/a> cuando un usuario cierra el di\u00e1logo de compra sin comprar nada. Conozcamos a los dem\u00e1s.<\/p>\n\n\n\n\n\n Empecemos con los errores llamados ERROR<\/strong><\/a> (responseCode 6) y DEVELOPER_ERROR<\/strong><\/a> (responseCode 5). Para el primer caso, Google escribe en la documentaci\u00f3n \u00abError fatal durante la acci\u00f3n de la API\u00bb, para el segundo – \u00abArgumentos no v\u00e1lidos proporcionados a la API\u00bb. Por ejemplo, pude obtener un DEVELOPER_ERROR cuando pas\u00e9 una cadena vac\u00eda al constructor en setType()<\/a> para la solicitud querySkuDetailsAsync()<\/a>.<\/p>\n\n\n\n Pero no es tan simple. Fui m\u00e1s all\u00e1 y en el m\u00e9todo launchBillingFlow()<\/a> utilic\u00e9 el SkuDetails modificado (extraje el json de SkuDetails<\/a> del producto real, cambi\u00e9 el productID en \u00e9l y lo pas\u00e9 al nuevo constructor SkuDetails). De hecho, es un argumento no v\u00e1lido, y esperaba obtener un DEVELOPER_ERROR<\/strong>, pero … Tengo un ERROR<\/strong>.<\/p>\n\n\n\n Esto, por supuesto, era un ejemplo artificial. El caso en el que Google rechaz\u00f3 el pago es mucho m\u00e1s cercano a la realidad. Si seleccionas \u00abtarjeta de prueba, siempre rechazada\u00bb en el di\u00e1logo de compra al probar las compras con una tarjeta de prueba, de lo que te hablaremos al final del art\u00edculo, tambi\u00e9n volver\u00e1 el ERROR<\/strong>, pero con un texto adecuado.<\/p>\n\n\n\n En el tercer art\u00edculo<\/a>, donde se describ\u00eda el cambio de suscripci\u00f3n, aumentamos el precio de una suscripci\u00f3n anual casi 3 veces para uno de los modos de prorrateo, pero no dijimos qu\u00e9 error deber\u00eda haber habido si no hubi\u00e9ramos hecho eso. Estamos reparando los da\u00f1os.<\/p>\n\n\n\n Como resulta que all\u00ed se especifica un modo de prorrateo err\u00f3neo, l\u00f3gicamente deber\u00edamos obtener el mismo DEVELOPER_ERROR<\/strong>. En su lugar, obtenemos SERVICE_UNAVAILABLE<\/strong><\/a> (responseCode 2). Tambi\u00e9n lo conseguimos si introducimos cualquier n\u00famero inadecuado como modo de prorrateo (esto es int, no enum, nadie nos lo impedir\u00e1), y si especificamos un PurchaseToken incorrecto. Consultamos la documentaci\u00f3n sobre SERVICE_UNAVAILABLE<\/strong> y … espera, \u00bfqu\u00e9? Vemos que la \u00abConexi\u00f3n de red est\u00e1 inactiva\u00bb.<\/p>\n\n\n\n Al mismo tiempo, tambi\u00e9n vemos un extra\u00f1o di\u00e1logo:<\/p>\n\n\n\n Otra cosa interesante en el caso del ERROR <\/strong>es que al cerrar el di\u00e1logo NO <\/strong>a trav\u00e9s del bot\u00f3n \u00abOK\u00bb (es decir, por medios que se interpretan como \u00abnavegar de vuelta\u00bb), el ERROR <\/strong>llega a onPurchasesUpdated()<\/a>, y en el caso de SERVICE_UNAVAILABLE<\/strong> en una situaci\u00f3n similar llega USER_CANCELED<\/strong> (pero si se hace clic en \u00abOK\u00bb en el di\u00e1logo, recibiremos SERVICE_UNAVAILABLE<\/strong>, como se esperaba).<\/p>\n\n\n\n Y en el caso de p\u00e9rdida de conexi\u00f3n a Internet, de hecho, viene SERVICIO_DISPONIBLE<\/strong>.<\/p>\n\n\n\n Aqu\u00ed hay m\u00e1s c\u00f3digos de error con peque\u00f1os comentarios, por as\u00ed decirlo, menciones honor\u00edficas.<\/p>\n\n\n\n El \u00faltimo error, y probablemente el m\u00e1s popular, al principio de la ruta de implementaci\u00f3n de las compras dentro de la aplicaci\u00f3n es ITEM_UNAVAILABLE<\/strong><\/a> (responseCode 4). Indica que el producto no est\u00e1 disponible para su compra, pero no explica por qu\u00e9. Las razones pueden ser muy diferentes: desde probarlo en una cuenta o dispositivo equivocado hasta comprar un producto inactivo.<\/p>\n\n\n\n Aqu\u00ed tienes una lista de comprobaci\u00f3n de lo que tienes que hacer para evitar este error durante las pruebas:<\/p>\n\n\n\n 1. Env\u00eda una aplicaci\u00f3n con la Biblioteca de Facturaci\u00f3n a tu pista de pruebas. Esta es una condici\u00f3n obligatoria; al mismo tiempo, tambi\u00e9n puedes probar en compilaciones de depuraci\u00f3n con el mismo applicationId, pero es importante que la aplicaci\u00f3n con la Biblioteca de Facturaci\u00f3n se cargue en la Play Console al menos una vez.<\/p>\n\n\n\n 2. A\u00f1ade las cuentas de Google de los probadores a esta pista de pruebas, lo que es especialmente importante para las pruebas internas o las alfa\/beta cerradas. Tambi\u00e9n habr\u00e1 un enlace en la secci\u00f3n C\u00f3mo se unen los probadores a tu prueba<\/em>, donde los probadores deben aceptar la invitaci\u00f3n.<\/p>\n\n\n\n 3. S\u00f3lo puedes comprar un producto activado. Despu\u00e9s de crear un producto, hay un bot\u00f3n de activaci\u00f3n <\/em><\/strong>en Play Console. En el primer art\u00edculo<\/a> describimos m\u00e1s detalladamente el proceso de creaci\u00f3n de un producto.<\/p>\n\n\n\n 4. Aseg\u00farate de que las pruebas en el dispositivo se realizan desde la cuenta de Google de un probador (lo que significa que debe estar inscrito como probador en esta pista de pruebas y debe tener todos los accesos t\u00e9cnicos necesarios). Este punto parece obvio, pero las cosas suceden, y tambi\u00e9n tienes que comprobarlo si has recibido un error de este tipo.<\/p>\n\n\n\n 5. El applicationId de la compilaci\u00f3n que se utiliza para las pruebas de compra debe coincidir completamente con el applicationId de Play Console. Esto es especialmente importante para aquellos que tienen un sufijo a\u00f1adido en sus compilaciones de depuraci\u00f3n.<\/p>\n\n\n\n 6. A\u00f1ade las direcciones de correo electr\u00f3nico de los probadores a la secci\u00f3n Setup \u2192 License Testing<\/em> en el men\u00fa izquierdo de la cuenta (no de la aplicaci\u00f3n), a fin de que compren productos gratis desde una tarjeta de prueba, y no desde una real. Otra ventaja es que las suscripciones en este caso tendr\u00e1n una duraci\u00f3n de prueba<\/a>. No est\u00e1 relacionado con este error, pero tambi\u00e9n es un conocimiento \u00fatil.<\/p>\n\n\n\n Los errores pueden complicar mucho el trabajo, por lo que siempre es importante entender c\u00f3mo pueden producirse. Teniendo en cuenta la cantidad de pasos que hay que dar para acceder a los productos, lo m\u00e1s f\u00e1cil es detectar el ITEM_UNAVAILABLE. Por tanto, espero que mi lista de comprobaci\u00f3n te ayude.<\/p>\n\n\n\nERROR y DEVELOPER_ERROR<\/h2>\n\n\n\n
<\/figure>\n\n\n\n
C\u00f3digos de error<\/h2>\n\n\n\n
\n
ITEM_UNAVAILABLE<\/h2>\n\n\n\n
Conclusi\u00f3n<\/h2>\n\n\n\n