2011-08-15 15 views
13

Implementé una aplicación de prueba con la facturación en la aplicación de Android. He completado mi clave pública en el archivo Security.java. Todo funciona, pero cuando envío el pago, la aplicación falla. Recibo un error en LogCat que dice "Comprobación de la firma ha fallado", que corresponde a este trozo de código:Facturación dentro de la aplicación de Android: Security.java dice "Falló la verificación de la firma"

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

Si cambio que poco a devolver verdadero lugar de retorno falso, entonces todo funciona correctamente - puedo enviar pago y regreso seguro a la aplicación, pero supongo que algo más está mal, ya que probablemente debería cambiar eso para que sea cierto.

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

Respuesta

23

Ese error de verificación de firmas puede ser causada por:

1.- Una clave pública errónea. Tal vez has olvidado copiar algún personaje. Sucede :)

2.- The .apk must be signed. No puede usar el debug.keystore, si lo hace, su cadena de firma estará vacía.

Y recuerda, para las pruebas de facturación integrada en aplicaciones:

  • Añadir clave pública Android Market para Security.java (String base64EncodedPublicKey = "your public key here")

  • Construir en modo de lanzamiento y firmarlo (Si está utilizando Eclipse, puede usar el Asistente de 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.

+2

El APK que inserte en su dispositivo de prueba también debe tener los mismos valores EXACTA de la versión que la APK que cargó en Developer Console. La Consola del desarrollador puede demorar hasta 6 horas para actualizar su versión de APK. –

+6

A partir de hoy, base64PublicKey es el parámetro pasado a IabHelper, no está definido en Security.java – 18446744073709551615

+8

¿No hay una manera más fácil de desarrollar el flujo de integración de facturación sin firmar, cargar, esperar, etc.? Estoy de acuerdo con que las pruebas se realicen lo más cerca posible de la producción, pero el ciclo de desarrollo es muy largo. Si equivocadamente hice un mal si o NPE, ¡tengo que volver a hacer toda la fase de publicación! –

20

En mi caso, había un problema bien escondido.

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

Entonces, en este caso, la solución fue eliminar el producto falso de mi artículo de propiedad.

Sólo tiene que añadir en el IABHelper.java presentar este fragmento:

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

en la sentencia else del procedimiento que tiene esta firma:

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

Una vez limpiado sus propios artículos, volver a el archivo original de ayudante java. Por supuesto, esto es solo para la fase de desarrollo.

+1

Wow Perdí todo el día buscando algo así, gracias – fersarr

+1

Funciona como un milagro. Otro error más en la facturación en la aplicación. –

+0

Tengo que hacer esto cada vez que realizo una compra de prueba ... – AxeEffect

0

En mi caso, pegué una clave pública incorrecta que tiene el mismo prefijo y sufijo. Solo asegúrate al 100% de que sea correcto.

Cuestiones relacionadas