Google Play In-app billing/in-app-purchases:购买、验证、消费流程?

Google Play In-app billing / in-app-purchases: purchase, verification, and consumption flow?

我想确认我对单次应用内购买的应用内结算购买、验证和消费流程有正确的概念。

1) 用户在我的应用程序中订购产品,比方说 gems_9。 (9 颗宝石)他们查询 Google Play 服务器并输入密码。 Google播放记录顺序。

2) 然后我的服务器使用 openssl_verify to verify the transaction is valid and has the correct values。例如:

function validate_google_play_signature ($receipt, $signature, $public_key) {
 // Create an RSA key compatible with openssl_verify from our Google Play signature.
 $key = "-----BEGIN PUBLIC KEY-----\n" . chunk_split($public_key, 64,"\n") . '-----END PUBLIC KEY-----';
 $key = openssl_get_publickey ($key);

 // Signature should be in binary format, but it comes as BASE64.
 $signature = base64_decode($signature);

 // Verify the signature.
 $result = openssl_verify ($receipt, $signature, $key, OPENSSL_ALGO_SHA1);
 return ($result == 1);
}

3) 我自己的服务器现在将验证购买尚未消费。对于访客:
https://developers.google.com/android-publisher/api-ref/purchases/products/get
Get android subscription status, failed with 403

3b) 我的服务器为用户提供应用内货币。

4) 好的,太好了,购买已验证。现在我需要消耗它。应用 本身 消费购买。

问:是什么阻止用户破解我的应用程序、不消费所购买的商品并将相同的订单发送到我的服务器?在这种情况下,我是否需要为每个用户存储和测试令牌,这是唯一的方法吗?

我可以通过 oauth 消费购买的商品吗?

我要回答我自己的问题,因为我想到了一种在不存储签名的情况下防止重放的方法。

重放问题可以通过存储每个签名然后检查唯一性来解决。

对于非消耗品购买,开发人员有效载荷可以消除这种需求,因为我们可以轻松地从令牌中提取(例如)用户 ID 之类的内容。

对于消费品的购买,它比较棘手,但我们仍然可以这样做:只需在令牌中存储一个 total_purchased 计数。我们可以从我们的服务器验证此计数。 (在进行我们的验证时,不要忘记锁定该条目以防止读写!)