Facturación en la aplicación de Android: Security.java dice "Error en la verificación de la firma"

He implementado una aplicación de prueba con la facturación en aplicaciones de Android. He llenado mi clave pública en el archivo Security.java. Todo funciona, pero cuando envío el pago, la aplicación se bloquea. Recibo un error en LogCat que dice "Error de verificación de firma", que corresponde a este bit de código:

if (!sig.verify(Base64.decode(signature))) { Log.e(TAG, "Signature verification failed."); return false; } 

Si cambio ese bit para devolver true en lugar de devolver false, entonces todo funciona correctamente – puedo enviar el pago y volver a la aplicación con seguridad – pero estoy asumiendo que algo más está mal, ya que probablemente debería cambiar eso para devolver true.

¿Alguna idea sobre qué podría estar causando esto?

Ese error de verificación de firma puede ser causado por:

1.- Una clave pública errónea . Tal vez se haya olvidado de copiar algún personaje. Ocurre

2.- El archivo .apk debe estar firmado . No se puede usar debug.keystore, si lo hace, su cadena de firma estará vacía.

Y recuerde, para probar la facturación en la aplicación:

  • Agregue la clave pública de Android Market a Security.java ( String base64EncodedPublicKey = "your public key here" )

  • Construir en modo de liberación y firmarlo (si está utilizando Eclipse, puede utilizar el Asistente para exportación).

  • Cargue la versión de lanzamiento en Android Market, no la publique y cree la lista de productos.

  • Instale la aplicación en su dispositivo (adb -d install myapp.apk) y haga una cuenta de prueba primaria en su dispositivo.

En mi caso había un problema bien escondido.

Cuando configuré por primera vez la facturación en la aplicación, intenté respuestas estáticas y compré el ítem android.test.purchased. Cuando cambié a artículos de producción y traté de consultar el inventario, ese producto falso causó todos mis problemas.

Así pues, en este caso, la solución era quitar el producto falso de mi artículo poseído.

Basta con añadir en el archivo IABHelper.java este fragmento:

  Purchase p = new Purchase(itemType, purchaseData, signature); try { consume(p); } catch (IabException e) { e.printStackTrace(); } 

En la instrucción else del método que tiene esta firma:

 int queryPurchases(Inventory inv, String itemType) throws JSONException, RemoteException 

Una vez limpiado sus propios artículos, vuelva a volver al original el archivo java del ayudante. Por supuesto, esto es sólo para la fase de desarrollo.

En mi caso, pegué una clave pública incorrecta que tiene un mismo prefijo y sufijo. Sólo asegúrese 100% de que es correcto.

  • ¿Cómo afectan las recientes vulnerabilidades de java a Android y la programación?
  • Hacer una aplicación de Android que no se puede desinstalar / eliminar
  • En Google App Engine, ¿puedo relacionar un Token de Google OAuth 2 y un símbolo de SACSID que obtuve con el AccountManager de Android?
  • ¿Cómo está comprobando Google SHA1 y el nombre del paquete en las llamadas de la API?
  • Evitar que el usuario tome fotos de la pantalla de la aplicación
  • No se pudo enviar la solicitud de Amazon AppStore: "La información sensible como la contraseña se repite en texto sin cifrado"
  • ¿Cuál es la forma más segura de autorizar a un usuario en Android?
  • Seguridad y autenticación cliente-servidor
  • ¿Cómo ahorrar mejor el estado de compra de InApp localmente?
  • Android donde guardar datos personales?
  • ¿Dónde debo hash las contraseñas de usuario?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.