IAP 应用的收据验证


IAP 应用的收据验证

Receipt Verification Service (RVS) 允许验证您的应用用户所进行的购买。

RVS 概述

下表显示了带有收据验证的购买工作流程。RVS 在 IAP API 完成购买后启动并将购买收据返回给应用。

步骤 组件 任务
步骤 1 IAP API IAP API 与用户交互以完成购买。IAP API 向应用返回购买收据。
步骤 2 应用 应用将购买收据转发给应用服务器。
步骤 3 应用服务器 应用服务器向 RVS 服务器发送验证收据请求。
步骤 4 RVS 服务器 RVS 服务器确认收据是否有效。
步骤 5 应用服务器 应用服务器将向用户提供内容。

上表中的步骤与下图中的标注匹配

您还可以使用 RVS 来允许访问在其他平台(如您的网站)上购买的订阅,只要是通过亚马逊购买的。以下情景描述了此工作流程:

  1. 您的应用用户从您的公司网站上通过亚马逊购买订阅。
  2. 您的应用收到所购买订阅的收据
  3. 为允许访问,您的应用将收据的信息发送到您的服务器。最后,您的服务器通过查询 RVS 来验证此交易。

设置 RVS

RVS 提供了两个环境选项,具体取决于您的应用是处于开发/测试阶段,还是已发布到 Amazon Appstore:

  • RVS 沙盒: 在开发和测试应用时,请使用 RVS 沙盒环境验证 App Tester 测试工具生成的收据。要设置 RVS 沙盒,请参阅 RVS 沙盒环境的说明
  • RVS 生产服务器: 将应用发布到 Amazon Appstore 后,您可以使用 Amazon RVS 生产服务器。请参阅 RVS 生产环境的说明

RVS 请求语法

使用 RVS 来验证在 PurchaseResponsePurchaseUpdatesResponse 中收到的收据对象。这些响应对象包含表示用户的唯一标识符的用户 ID 值。PurchaseResponse 中的收据包含 ReceiptId,它与用户 ID 结合使用来对购买执行带外服务器端验证。为了安全起见,来自您的服务器的请求需要共享密钥来确认您的身份,然后才能传递。

这些请求使用以下格式:

<Protocol>//<Server>/<[_RVSSandbox_]>/version/<Operation_version_number>/verifyReceiptId/developer/<Shared_Secret>/user/<UserId>/receiptId/<ReceiptId>

将尖括号中的词语替换为要验证的交易的以下值:

  • Protocol: 用于与服务器或沙盒通信的协议,如 https:。
  • Server:​ 要与之通信的 RVS 服务器的 URL。
    • 如果您使用的是 RVS 沙盒,请使用“localhost:8080”或您设置的 Tomcat 位置。
    • 如果您使用的是 RVS 生产服务器,则 URL 为“appstore-sdk.amazon.com”。
  • [RVSSandbox]:​ 如果您使用的是 RVSSandbox,请使用值“RVSSandbox”。如果您使用的是 RVS 生产服务器,请省略此字段。
  • Operation_version_number:​ verifyReceiptId 操作的版本号。此版本号独立于 IAP 版本号。当前 verifyReceiptId 版本号为“1.0”。
  • Shared_secret:​ 用于标识发出请求的开发者的共享密钥。您的共享密钥可在 Amazon Appstore 中您的开发者账户的“Shared Key”(共享密钥)页面上找到:https://developer.amazon.com/sdk/shared-key.html。对于 RVSSandbox,共享密钥可以是任何非空字符串。
  • UserId:​ 代表您的应用商店应用的不同亚马逊客户的 ID:purchaseResponse->userData->userId
  • ReceiptId:​ 购买的唯一 ID:purchaseResponse->receipt->receiptIdpurchaseUpdatesResponse->receipts->receipt->receiptId

RVS 响应语法

RVS 提供了 RESTful JSON API 接口。作为最佳实践,使用 JSON 解析器类从 RVS 服务器读取 JSON 响应。

在发出验证交易的请求后,RVS 服务器或沙盒将返回响应代码来指示请求是否成功。如果成功,则返回的 JSON 响应将包括有关交易的信息。

以下示例显示了一个成功响应:

   { "betaProduct":false,
     "cancelDate":null,
     "parentProductId":null,
     "productId":"com.amazon.iapsamplev2.gold_medal",
     "productType":"CONSUMABLE",
     "purchaseDate":1399070221749,
     "quantity":1,
     "receiptId":"wE1EG1gsEZI9q9UnI5YoZ2OxeoVKPdR5bvPMqyKQq5Y=:1:11",
     "renewalDate":null,
     "term":null,
     "termSku":null,
     "testTransaction":true
   }

RVS 响应代码

Receipt Verification Service 将回复以下代码之一,这些代码指示验证检查的结果:

响应代码 描述
HTTP 200 Success: 收据 ID、用户 ID 和共享密钥都是有效的。产品类型是以下项之一: “ENTITLED”、“CONSUMABLE”或“SUBSCRIPTION”
HTTP 400 由此 receiptId 表示的交易无效,或没有找到此 receiptId 的交易。
HTTP 496 sharedSecret 无效
HTTP 497 用户 ID 无效
HTTP 500 出现内部服务器错误

成功交易的 RVS 响应字段

下表列出并描述了成功交易的 RVS 响应中包含的字段:

字段 数据类型 描述
betaProduct 布尔值 指示所购买的产品是否是 Live App Testing 产品。
cancelDate 长整数 取消购买的日期,或订阅到期的日期。如果未取消购买,则此字段为 null。
parentProductId 字符串 Null。预留以供将来使用。
productId 字符串 您在应用中为此项目定义的 SKU。
productType 字符串 所购买产品的类型。有效产品类型为 CONSUMABLE、SUBSCRIPTION 和 ENTITLED。
purchaseDate 长整数 购买的日期,以纪元以后的毫秒数存储。对于订阅项目,purchaseDate 代表首次购买日期,而不是后续续订的购买日期。
quantity 整数 所购买的数量。始终为 null 或 1。
receiptID 字符串 购买的唯一标识符。
renewalDate 长整数 需要续订订阅购买的日期。日期以纪元以后的毫秒数存储。
term 字符串 订阅 IAP 将保持有效的持续时间(期限从购买之日开始)。期限由数字和时间段(天、周、月、年)构成,如 1 Week2 Months
termSku 字符串 对应于订阅期限的唯一 SKU。
testTransaction 布尔值 指示此购买是否是作为亚马逊发布和测试过程的一部分执行的。

取消日期和续订日期

renewalDate 字段包含自动续订订阅购买下次需要续订的日期。此字段仅适用于订阅购买。

cancellDate 字段包含订阅购买到期的日期或亚马逊客户服务取消购买的日期。

续订日期和取消日期字段以毫秒为单位存储。您可以使用 java.util.Date(timeInMillis) 来将值转换为日期对象。

消费品或权利购买

在有效的收据中,取消日期和续订日期都包含 null 值。如果取消日期字段不为 null,它将包含亚马逊客户服务取消购买的日期。

订阅购买

在有效的订阅收据中,取消日期为 null。如果 cancellDate 字段不为 null,它将包含订阅到期的日期或亚马逊客户服务取消购买的日期。

renewalDate 字段包含自动续订订阅购买下次需要续订的日期。如果订阅未设置为自动续订,字段值将为 null。

在以下示例中,用户具有已取消的订阅:

  • 订阅的有效期为 2016 年 1 月 1 日 – 2016 年 1 月 3 日。在此收据中,此订阅的 purchaseDate 设置为 01/01/2016,cancelDate 设置为 03/01/2016。
  • 如果此订阅后来在 2016 年 1 月 4 日重新激活,则订阅将具有第二个收据。第二个收据将显示 purchaseDate 为 04/01/2016,cancelDate 为 null。

RVS 沙盒和生产示例

请参阅 RVS 示例