一个Google 应用内购买刷单的故事

前段时间发现当一个APP User 使用Google Wallet 购买应用内商品完成支付后(这时用户购买的商品已经发放到用户账户)一段时间段内用户发起退款请求,Google将会自动退款,并将订单状态变更为refund。
** 关键字:Google, Google in-app purchases, Google Void Purchases**

为了解决这个问题,首先我阅读了 Google Void Purchase API 。发现API中提到

The Google Play Voided Purchases API provides a list of in-app
orders that are associated with purchases that a user has voided. You can use information from this list to implement a revocation system that prevents the user from accessing products from those in-app orders.
The user can void a purchase in the following ways:

  • The user requests a refund for their order.
  • The user cancels their order.
  • An order is charged back.

By using this API, you help create a more balanced and fair experience for all of your app's users, particularly if your app is a game.

于是我决定使用这个接口来检测Refund Purchases,但注意到这个接口的配额是:

  • 100 queries per day. (The day begins and ends at midnight Pacific Time.)
  • 30 queries during any 30-second period.
    所以每隔15分钟去检测一次这个API,和运营人员沟通后我这里直接将用户进行了封禁并以为问题得到解决,于是我快乐的下班了。

但是过了几天我神奇的发现,Google Void Purchases 返回的订单并不是所有订单都是Refund的,有一些订单的状态是Charged,并由于这个原因造成了 部分充值用户误封。发现问题后马上取消的封号。再次仔细的阅读了Google的API,然而并没有发现问题。一脸mb的我觉得我大谷哥是不能错的,又去查了我的代码是不是有问题,结果又是一脸mb,期间还为了发动社区的力量,去stackoverflow 发了一个问题 ,不过目前还没有人回答。

后来我发现refund的时候客户端是有接收到广播的,但是客户端若是经过了root,广播可能会被屏蔽,单靠这种方法是不可行的。但若是void purchase API的话又不可靠。于是,我们可以在拿到void purchases 的数据后在Google 再次核对订单状态。但是由于Google 的purchase 接口是v2 版本只会返回 succeed 或者cancel, 通过我的试验发现,refund的订单会属于cancel的状态。考虑到Google的退单一般完成在2小时之内,所以我每隔2小时核对一下2小时之内产生的订单,每隔15分钟拉取一次Google Void Purchases API并核对状态,每天核对当天的订单状态即可。

你可能感兴趣的:(一个Google 应用内购买刷单的故事)