Mac App Store消耗型收据在服务器端验证时in_app哈希为空。

13

我在服务器端验证Mac App Store内购买(所谓的消耗品)的收据。苹果服务器的响应通常如下:

    { 
      "status"=>0, 
      "environment"=>"Production", 
      "receipt" => 
        { 
          "receipt_type" => "Production", 
          "adam_id"=>410628904, 
          "bundle_id" => "com.company.product", 
          "application_version"=>"1.0.0", 
          "download_id"=>002141541230420, 
          "request_date"=>"2013-10-22 07:53:11 Etc/GMT", 
          "request_date_ms"=>"1382428391914", 
          "request_date_pst"=>"2013-10-22 00:53:11 America/Los_Angeles", 
          "original_purchase_date"=>"2011-08-22 06:05:47 Etc/GMT", 
          "original_purchase_date_ms"=>"1313993147000", 
          "original_purchase_date_pst"=>"2011-08-21 23:05:47 America/Los_Angeles", 
          "original_application_version"=>"1.0.0", 
          "in_app"=> [
            {
              "quantity"=>"1", 
              "product_id"=>"com.company.product.mac_consumable", 
              "transaction_id"=>"9123912391231", 
              "original_transaction_id"=>"51881235936908", 
              "purchase_date"=>"2013-10-22 07:52:06 Etc/GMT", 
              "purchase_date_ms"=>"1382428326000", 
              "purchase_date_pst"=>"2013-10-22 00:52:06 America/Los_Angeles", 
              "original_purchase_date"=>"2013-10-22 07:52:06 Etc/GMT", 
              "original_purchase_date_ms"=>"1382428326000", 
              "original_purchase_date_pst"=>"2013-10-22 00:52:06 America/Los_Angeles", 
              "bundle_id"=>"com.company.product"
              }
         ]
      }
    }

但有时我们会得到没有设置in_app哈希值的信息:

    { 
      "status"=>0, 
      "environment"=>"Production", 
      "receipt" => 
        { 
          "receipt_type" => "Production", 
          "adam_id"=>312621904, 
          "bundle_id" => "com.company.product", 
          "application_version"=>"1.0.0", 
          "download_id"=>002141541230420, 
          "request_date"=>"2013-10-22 07:53:11 Etc/GMT", 
          "request_date_ms"=>"1382428391914", 
          "request_date_pst"=>"2013-10-22 00:53:11 America/Los_Angeles", 
          "original_purchase_date"=>"2011-08-22 06:05:47 Etc/GMT", 
          "original_purchase_date_ms"=>"1313993147000", 
          "original_purchase_date_pst"=>"2011-08-21 23:05:47 America/Los_Angeles", 
          "original_application_version"=>"1.0.0", 
          "in_app"=> []
      }
    }
这是否意味着收据无效?in_app字段应该始终填充吗?或者这些收据也应该被视为有效,为什么in_app信息为空呢?

我有同样的问题!我需要知道发生了什么事情!是不是交易被苹果拒绝了?我应该显示一个消息吗?当这种情况发生时,我的账户似乎没有得到信用。 - Steeve17
1个回答

3

这是否意味着收据无效?

不,status值为0,根据文档的解释,这表示收据是有效的,只是没有包含任何应用内购买“子收据”。

in_app字段是否始终需要被填充?

不需要,有可能收据不包含任何应用内购买。


因此,显然你的问题是,由于某种原因,你的应用程序发送到后端的收据不包含应用内购买的信息,即使你希望它包含。

当应用内购买交易进入“已购买”状态时,收据应该在客户端设备上保持最新状态 - 你应确保在此之前不要尝试将收据发送到服务器。

另一个需要考虑尝试的事情是SKReceiptRefreshRequest(仅适用于10.9及以上版本) - 在某些边缘条件下,收据可能没有保持最新状态,你需要等待其更新后再将收据赎回请求发送到你的后端。


我们从苹果那里得不到任何空白收据的现金,因此很明显这些订单没有在苹果方面完成。我仍然希望能够重现这个案例,因为对我们来说追踪可能很有趣。可能是无效的信用卡详细信息或资金不足吗? - Steeve17
2
@Steeve17 我们有同样的问题。你能理解当“in_app":[]时到底发生了什么吗?非常感谢任何提示。 - tyrex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接