我已经在我的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"
问题:
除格式以外的OrderId是否被视为欺诈?
如果在欺诈订单的情况下如何验证实际购买[即订单ID&lt; 19数字编号&gt;。&lt; 16数字编号&gt;]?
答案 0 :(得分:1)
请注意:此答案仅基于近似值。四年(订阅)数据,因为尚不知道具体的文档。尽管如此,还是出现了一些模式:
[a-z]{24}
部分之后带有以句点分隔的119个字符的Base64ish部分,该欺骗尝试仅包含(例如 eiorsfdmklehiojapofmknoe )。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 products和get
for subscriptions。
答案 1 :(得分:0)
您应该使用购买令牌来验证订单,而不是使用Google购买API验证订单ID
根据此link,Google服务器返回的订单ID似乎并非始终采用新格式(GPA.1234-5678-9012-34567
)。由于格式可能在将来的任何时候发生变化,因此最好避免将其用于验证。
答案 2 :(得分:0)
如果要验证购买的有效性,则必须验证签名。
任何无法验证签名的应用内计费实施方式都是不良的,并且能够接受欺诈性购买。
如Google所建议的,最好在外部服务器上验证签名,这是一个示例。 Android - protecting in app purchases with server side verification