Oauth 2.0 Google Play应用内计费/应用内购买:购买、验证和消费流?

Oauth 2.0 Google Play应用内计费/应用内购买:购买、验证和消费流?,oauth-2.0,google-play,google-play-services,in-app-billing,Oauth 2.0,Google Play,Google Play Services,In App Billing,我想确认我对单个应用内购买的应用内付费购买、验证和消费流有正确的概念 1) 用户在我的应用程序中订购产品,比如gems_9。(9个gems)他们查询Google Play服务器并输入密码。谷歌播放记录订单 2) 然后,我的服务器使用。例如: 3) 我自己的服务器现在将验证该购买是否尚未消费。访客: 3b)我的服务器为用户提供应用内货币 4) 好的,太好了,购买经过验证。现在我需要消耗它。应用程序本身消费购买的物品 问:是什么阻止用户入侵我的应用程序,不消费购买的物品,并向我的服务器发送相同的

我想确认我对单个应用内购买的应用内付费购买、验证和消费流有正确的概念

1) 用户在我的应用程序中订购产品,比如gems_9。(9个gems)他们查询Google Play服务器并输入密码。谷歌播放记录订单

2) 然后,我的服务器使用。例如:

3) 我自己的服务器现在将验证该购买是否尚未消费。访客:

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

4) 好的,太好了,购买经过验证。现在我需要消耗它。应用程序本身消费购买的物品

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


有没有一种方法可以通过oauth消费购买的内容?

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

通过存储每个签名,然后检查唯一性,可以修复重播问题

对于非消费性购买,开发人员负载可以消除这种需求,因为我们可以很容易地从令牌中提取类似(例如)用户id的内容

对于消费品购买,这是比较棘手的,但我们仍然可以这样做:只需在代币中存储购买的总数量。我们可以从服务器上验证此计数。(在进行验证时,不要忘记锁定该条目的读写操作!)

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);
}