El cours de formation pour la vente de produits in-app dans Android suggère d'utiliser une charge utile lors d'une demande d'achat :
Le cinquième argument contient une chaîne "developer payload" que vous pouvez utiliser pour envoyer des informations supplémentaires sur une commande (il peut s'agir d'une chaîne vide). En général, cette chaîne est utilisée pour transmettre un jeton de chaîne qui identifie de manière unique cette demande d'achat. Si vous spécifiez une valeur de chaîne, Google Play renvoie cette chaîne avec la réponse d'achat. Par la suite, lorsque vous effectuez des recherches sur cet achat, Google Play renvoie cette chaîne avec les détails de l'achat.
Recommandation de sécurité : Il est bon de transmettre une chaîne qui aide votre application à identifier l'utilisateur qui a effectué l'achat, afin de pouvoir vérifier ultérieurement qu'il s'agit d'un achat légitime effectué par cet utilisateur. Pour les articles consommables, vous pouvez utiliser une chaîne générée de manière aléatoire, mais pour les articles non consommables, vous devez utiliser une chaîne qui identifie l'utilisateur de manière unique.
El Mise en œuvre de la page d'achat de l'IAB a une recommandation similaire, avec la suggestion supplémentaire que la valeur de la charge utile devrait être vérifiée sur votre propre serveur sécurisé :
Recommandation de sécurité : Lorsque vous envoyez une demande d'achat, créez un jeton de type String qui identifie de manière unique cette demande d'achat et incluez ce jeton dans le developerPayload.Vous pouvez utiliser une chaîne générée de manière aléatoire comme jeton. Lorsque vous recevez la réponse d'achat de Google Play, assurez-vous de vérifier la signature des données renvoyées, l'orderId et la chaîne developerPayload. Pour plus de sécurité, vous devriez effectuer la vérification sur votre propre serveur sécurisé. Assurez-vous que l'orderId est une valeur unique que vous n'avez pas encore traitée et que le developerPayload String correspond au jeton que vous avez envoyé précédemment avec la demande d'achat.
En regardant le code source de l'application Trivial Drive que Google utilise pour faire la démonstration de l'API, je trouve cet avertissement :
* 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.
D'après tous ces messages, il semble que ce soit une mauvaise idée d'utiliser un nombre aléatoire ou une chaîne de caractères pour la charge utile. De même, après avoir lu le dernier avertissement, il semble que ce soit une mauvaise idée de passer l'ID de l'appareil comme charge utile, car il sera différent pour le même utilisateur sur différents appareils. Que faut-il donc utiliser comme charge utile pour le développeur ?
Mon application fournit une fonctionnalité locale à laquelle l'utilisateur peut accéder sans avoir à se connecter à un quelconque service. Il n'y a donc pas de concept d'"utilisateur" et il n'y a pas non plus de composant côté serveur. La demande d'achat in-app porte sur une mise à niveau qui supprime les publicités de l'application. Est-il judicieux pour une application de ce type d'utiliser la fonction de charge utile, ou est-il préférable d'utiliser une chaîne vide et de la laisser exposée aux attaques par rejeu ?