modo - opciones de desarrollador android 8
¿Cuál debería ser la carga útil del desarrollador en Android app-app v3 vi? (2)
Estoy implementando la facturación en la aplicación en mi aplicación para desbloquear funciones premium. La facturación en la aplicación se configura correctamente. Todo parece estar bien, excepto la "carga útil para desarrolladores".
La aplicación de muestra dice
/*
* TODO: verify that the developer payload of the purchase is correct. It will be
* the same one that you sent when initiating the purchase.
*
* WARNING: Locally generating a random string when starting a purchase and
* verifying it here might seem like a good approach, but this will fail in the
* case where the user purchases an item on one device and then uses your app on
* a different device, because on the other device you will not have access to the
* random string you originally generated.
*
* So a good developer payload has these characteristics:
*
* 1. If two different users purchase an item, the payload is different between them,
* so that one user''s purchase can''t be replayed to another user.
*
* 2. The payload must be such that you can verify it even when the app wasn''t the
* one who initiated the purchase flow (so that items purchased by the user on
* one device work on other devices owned by the user).
*
* Using your own server to store and verify developer payloads across app
* installations is recommended.
*/
La aplicación de ejemplo utiliza una cadena vacía como carga útil del desarrollador. Mi pregunta es ¿qué cadena usar como carga útil para desarrolladores? ¿Puedo usar la ID de correo electrónico principal del usuario?
Para mí, una cadena aleatoria no es útil ya que, en primer lugar, debe depender del usuario que la compró, no del dispositivo en el que se compró. En segundo lugar, es un artículo no consumible, por lo que una cadena vacía puede adaptarse, pero no es ideal.
Así que mi manera de evitarlo es crear un hash cifrado basado en una clave. Cada vez que se realiza una compra, es identificable de forma única, ya que el hash nunca debería ser el mismo (esto depende del método de hashing, como bcrypt).
Dado que la clave es la misma en todos los dispositivos, es fácil descifrar y verificar que el mensaje secreto sea correcto.
Para que la clave permanezca en secreto, he usado varias funciones de manipulación de cadenas para enmascararla para que no se almacene de manera visible.
Puede encontrar un ejemplo de la gestión del texto aquí: Android In App Billing: proteger la clave pública de la aplicación
String Base64EncodedPublicKey key = DecrementEachletter("Bl4kgle") + GetMiddleBit() + ReverseString("D349824");
Este método de crear un hash basado en una clave permite que la carga útil sea única e identificable, al mismo tiempo que es razonablemente segura. No es a prueba de balas, pero sí hace que sea difícil de romper.
Por favor marque abajo la respuesta, puede resolver su problema:
Si está utilizando un elemento consumible (elemento gestionado), puede utilizar una cadena generada al azar
Paso 1: antes de crear el método declara esto:
private static final char[] symbols = new char[36];
static {
for (int idx = 0; idx < 10; ++idx)
symbols[idx] = (char) (''0'' + idx);
for (int idx = 10; idx < 36; ++idx)
symbols[idx] = (char) (''a'' + idx - 10);
}
paso 2: establece la clase RandomString y SessionIdentifierGenerator en tu actividad
public class RandomString {
/*
* static { for (int idx = 0; idx < 10; ++idx) symbols[idx] = (char)
* (''0'' + idx); for (int idx = 10; idx < 36; ++idx) symbols[idx] =
* (char) (''a'' + idx - 10); }
*/
private final Random random = new Random();
private final char[] buf;
public RandomString(int length) {
if (length < 1)
throw new IllegalArgumentException("length < 1: " + length);
buf = new char[length];
}
public String nextString() {
for (int idx = 0; idx < buf.length; ++idx)
buf[idx] = symbols[random.nextInt(symbols.length)];
return new String(buf);
}
}
public final class SessionIdentifierGenerator {
private SecureRandom random = new SecureRandom();
public String nextSessionId() {
return new BigInteger(130, random).toString(32);
}
}
Paso 3: pase la carga útil a su solicitud de compra:
RandomString randomString = new RandomString(36);
System.out.println("RandomString>>>>" + randomString.nextString());
/* String payload = ""; */
// bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ
String payload = randomString.nextString();
Log.e("Random generated Payload", ">>>>>" + payload);
Log.d(TAG, "Launching purchase flow for infinite gas subscription.");
mHelper.launchPurchaseFlow(this, SKU_GAS,
IabHelper.ITEM_TYPE_INAPP, RC_REQUEST,
mPurchaseFinishedListener, payload);
Para obtener más información, consulte este enlace: Token que identifica al usuario.
Espero que resuelva tu problema.