已收到欺诈Google Play订单ID

时间:2016-08-01 09:08:05

标签: android in-app-purchase in-app-billing

我已经在我的Android应用程序中实现了In App Billing。

在我的应用程序中购买功能后,我一直在收集该采购订单的购买包到我的本地服务器。

我不知道发生了什么问题,我在本地服务器上发现了很少的购买订单,这些订单没有反映在商家页面中。

当我检查服务器上的采购订单时,我发现了一些奇怪的东西,

该购买的订单ID为

Order ID  <19 Digit number>.<16 Digit Number>
  say <1234567891234567891>.<1234567891234567>

根据谷歌的说法,

  

订单号本身是一个仅由数字组成的字符串,带有   由Google分配和管理的格式。

     

对于2012年12月5日或之后的交易,Google付款   分配商家订单号(而不是Google订单号)   并将商户订单号报告为orderId的值。这里的   一个例子:

     

“orderId”:“GPA.1234-5678-9012-34567”

     

对于2012年12月5日之前的交易,Google结帐   分配了Google订单号并将该号码作为值报告   of orderId。以下是持有Google订单的orderId示例   号:

     

“orderId”:“556515565155651”

商家页面显示的订单采用以下格式,

"orderId" : "GPA.1234-5678-9012-34567"

问题:

  1. 除格式以外的OrderId是否被视为欺诈?

  2. 如果在欺诈订单的情况下如何验证实际购买[即订单ID&lt; 19数字编号&​​gt;。&lt; 16数字编号&​​gt;]?

3 个答案:

答案 0 :(得分:1)

  1. 是的,无效的orderId具有不正确的格式。如果不是欺诈行为,那就是不正确的订单,没有有效的收入。
  2. 您以相同方式验证¹所有购买;结果会告诉您是否可以接受。

请注意:此答案仅基于近似值。四年(订阅)数据,因为尚不知道具体的文档。尽管如此,还是出现了一些模式:

  • 有效令牌的长度始终为144个字符,在起始[a-z]{24}部分之后带有以句点分隔的119个字符的Base64ish部分,该欺骗尝试仅包含(例如 eiorsfdmklehiojapofmknoe )。
  • 正确的订单ID始终看起来像GPA\.[1-9][0-9]{3}(-[0-9]{4}){3}[0-9](例如 GPA.3479-1780-0192-98654 )。
  • 无效的订单编号显示的格式类似于[1-9][0-9]{18}\.[0-9]{16}(例如 2394627089137137670234.7256937842057394 )。

通过这些规则,您可以严格检查成功案例(应大于90%),否则可以采取任何动作组合:

  • 撤销授予的功能
  • 通知您的用户/客户
  • 提醒您的管理员/工作人员分别检查这些情况
  • 从这些实例中得出进一步的规则

¹要验证购买,Google Play开发人员API的“订阅和应用内购买API”部分中有get for productsget for subscriptions

答案 1 :(得分:0)

您应该使用购买令牌来验证订单,而不是使用Google购买API验证订单ID

Purchases.subscriptions: get

根据此link,Google服务器返回的订单ID似乎并非始终采用新格式(GPA.1234-5678-9012-34567)。由于格式可能在将来的任何时候发生变化,因此最好避免将其用于验证。

答案 2 :(得分:0)

如果要验证购买的有效性,则必须验证签名。

任何无法验证签名的应用内计费实施方式都是不良的,并且能够接受欺诈性购买。

如Google所建议的,最好在外部服务器上验证签名,这是一个示例。 Android - protecting in app purchases with server side verification