ILicenseResultListener.verifyLicense的signedData参数中有什么?

时间:2016-11-30 17:50:55

标签: android google-play

Android上的Google Play提供了许可检查服务com.android.vending.licensing.ILicensingService。它支持回调接口ILicenseResultListener。它有一个方法verifyLicense,有三个参数。对于已从Google Play下载的付费应用,请问第二个signedData中的内容是什么?

this就是我想知道的原因。

1 个答案:

答案 0 :(得分:0)

答案在android-sdk-windows \ extras \ google \ market_licensing \ library \ src \ com \ google \ android \ vending \ licensing \ ResponseData.java中,在parse()方法中。

signedData字符串是由6个字段组成的序列,以|分隔,可选地后跟冒号和& -separated name = value集合(如查询字符串)。例如:

0|17|com.acme.myapp|1|AAAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHH==|1480563297411:GR=10&VT=1480570457760&GT=1481088857760

这个来自付费应用。

第一部分中的6个字段是:

  • 响应代码(int) - 可能与verifyLicense的第一个参数
  • 相同
  • Nonce(int) - 直接来自checkLicense电话
  • 包名称
  • 版本代码
  • 用户ID,带注释"特定于应用程序的用户标识符"
  • 时间戳(长) - 不确定是什么。绝对不是购买; repeat运行返回一个不同的,稍后的值。可能是许可证检查本身。

UserID似乎是Base64编码的字符串。它识别哪个用户,以及如何识别?许可证持有者,一个人假设;但怎么样?解码提供一个25字节长的字节数组。

对于侧载应用程序,基本字段就是全部。对于商店购买的应用程序,还有额外的数据。可以找到额外数据字段的含义here。具体来说,使用新购买的应用程序,会出现以下额外字段:

  • GR - 最大重试次数
  • VT - 许可证有效期时间戳;指定何时需要重新检查许可证
  • GT - 宽限期时间戳

关于UserID,我做了一些测试。我有三个案例:

  • 套餐A,侧装
  • 套餐A,从Play
  • 付费下载
  • 套餐B,免费从Play(由同一用户)下载

在所有三种情况下,解码的UserID的前5个字节匹配,其余的不匹配。因此,无法在UserID中轻松识别包独特部分和用户唯一部分。值得注意的是,剩余部分长度为20个字节 - 可能是MD5哈希值。 UserID绝对不是任何合理编码中的字符串,并且它看起来也不像是具有二进制整数的结构。看似随机的位模式指向散列或密文。后者不太可能。