Google Android en la aplicación de compras "Entrega de contenido" ¿Cómo entregar correctamente el contenido?

Actualmente estoy intentando codificar las compras en la aplicación. Buscaba documentación, información, tutoriales sobre las mejores prácticas para algunas de las cosas que Google no maneja.

Lo que he hecho hasta ahora:

Tengo un servicio de facturación en ejecución que se ocupa de hablar con Google Play. Este servicio puede completar las transacciones "muestra" y mi aplicación recibe el mensaje.

Quiero ahora entregar el contenido al dispositivo. Lo que creo que tiene que suceder a continuación:

  1. Mi aplicación debe ponerse en contacto con mi servidor y mostrar algunas pruebas de la transacción exitosa. Haga un poco de sacudida de la mano de Cert o un cierto absurdo.

  2. Entonces voy a descargar el contenido y colocar ese contenido en una base de datos. Probablemente debería cifrar la base de datos con un dispositivo de cifrado único de algún tipo.

Estoy mirando para aprender cómo hacer las 2 cosas arriba y cualquier otra cosa que necesita ser hecha. Me gustaría una cantidad razonable de seguridad / cifrado. Cualquier documentación / tutoriales / proyectos de muestra sería genial, he intentado buscar este material y no he encontrado lo que estaba buscando.

One Solution collect form web for “Google Android en la aplicación de compras "Entrega de contenido" ¿Cómo entregar correctamente el contenido?”

Tendrá que realizar algunos cambios en el código de cliente del servicio de facturación de la muestra.

En primer lugar, debe llamar a su servidor para obtener el nonce que se utilizará para RestoreTransactions o hacer la compra, para hacer las cosas lo más seguro posible.

Vamos a seguir lo que sucede. Aquí está el BillingReceiver que Google Play te llama:

/** * This is called when Android Market sends information about a purchase state * change. The signedData parameter is a plaintext JSON string that is * signed by the server with the developer's private key. The signature * for the signed data is passed in the signature parameter. * @param context the context * @param signedData the (unencrypted) JSON string * @param signature the signature for the signedData */ private void purchaseStateChanged(Context context, String signedData, String signature) { Intent intent = new Intent(Consts.ACTION_PURCHASE_STATE_CHANGED); intent.setClass(context, BillingService.class); intent.putExtra(Consts.INAPP_SIGNED_DATA, signedData); intent.putExtra(Consts.INAPP_SIGNATURE, signature); context.startService(intent); } 

Si miras handleCommand dentro de BillingService.java, maneja esta intención:

 /** * The {@link BillingReceiver} sends messages to this service using intents. * Each intent has an action and some extra arguments specific to that action. * @param intent the intent containing one of the supported actions * @param startId an identifier for the invocation instance of this service */ public void handleCommand(Intent intent, int startId) { String action = intent.getAction(); if (Consts.DEBUG) { Log.i(TAG, "handleCommand() action: " + action); } if (Consts.ACTION_CONFIRM_NOTIFICATION.equals(action)) { String[] notifyIds = intent.getStringArrayExtra(Consts.NOTIFICATION_ID); confirmNotifications(startId, notifyIds); } else if (Consts.ACTION_GET_PURCHASE_INFORMATION.equals(action)) { String notifyId = intent.getStringExtra(Consts.NOTIFICATION_ID); getPurchaseInformation(startId, new String[] { notifyId }); } else if (Consts.ACTION_PURCHASE_STATE_CHANGED.equals(action)) { String signedData = intent.getStringExtra(Consts.INAPP_SIGNED_DATA); String signature = intent.getStringExtra(Consts.INAPP_SIGNATURE); purchaseStateChanged(startId, signedData, signature); } else if (Consts.ACTION_RESPONSE_CODE.equals(action)) { long requestId = intent.getLongExtra(Consts.INAPP_REQUEST_ID, -1); int responseCodeIndex = intent.getIntExtra(Consts.INAPP_RESPONSE_CODE, ResponseCode.RESULT_ERROR.ordinal()); ResponseCode responseCode = ResponseCode.valueOf(responseCodeIndex); checkResponseCode(requestId, responseCode); } } 

A continuación, se llama a la función PurchaseStateChanged. Esta función debe ser reemplazada por una llamada a su servidor para crear una sesión para su entrega de contenido. El código de Security.java debe ser portado al lado del servidor para validar la transacción dentro de la nube.

 /** * Verifies that the data was signed with the given signature, and calls * {@link ResponseHandler#purchaseResponse(Context, PurchaseState, String, String, long)} * for each verified purchase. * @param startId an identifier for the invocation instance of this service * @param signedData the signed JSON string (signed, not encrypted) * @param signature the signature for the data, signed with the private key */ private void purchaseStateChanged(int startId, String signedData, String signature) { ArrayList<Security.VerifiedPurchase> purchases; purchases = Security.verifyPurchase(signedData, signature); if (purchases == null) { return; } ArrayList<String> notifyList = new ArrayList<String>(); for (VerifiedPurchase vp : purchases) { if (vp.notificationId != null) { notifyList.add(vp.notificationId); } ResponseHandler.purchaseResponse(this, vp.purchaseState, vp.productId, vp.orderId, vp.purchaseTime, vp.developerPayload); } if (!notifyList.isEmpty()) { String[] notifyIds = notifyList.toArray(new String[notifyList.size()]); confirmNotifications(startId, notifyIds); } } 

Asegúrese de poner su clave pública en el lado del servidor en el archivo portado Security.java.

  • Las extensiones de Android - SPAN_EXCLUSIVE_EXCLUSIVE no pueden tener una longitud cero
  • Acceso al método desde un fragmento en el botón Haga clic en MainActivity
  • Mejora el adaptador grande ListView deslizamiento suave, a veces espasmódico
  • Cómo configurar los márgenes de diseño de cuadros de texto de edición?
  • MediaMetadataRetrieverJNI: getEmbeddecPicture ha fallado
  • Uso de hormigas-fuente 7 o superior para permitir que el operador de diamante
  • Android - Llamadas de red asíncronas - Respuesta dependiente entre sí
  • Al almacenar en caché las imágenes y los datos debe utilizar almacenamiento interno o externo?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.