Mac App Store消耗品收据在服务器端验证时具有空的in_app哈希值

时间:2013-10-22 12:46:16

标签: ios objective-c in-app-purchase app-store mac-app-store

我验证了服务器端Mac App Store收到的应用内购买(所谓的耗材)。 Apple服务器的响应通常如下:

    { 
      "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信息是空的呢?

1 个答案:

答案 0 :(得分:3)

这是否意味着收据无效?

不,status值为0,根据the docs表示收据有效。它只是不包含任何应用内购买“子收据”。

是否应始终填充in_app字段?

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


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

当应用内购买交易进入“已购买”状态时,收据应该是客户端设备上的最新信息 - 您应该确保在发生这种情况之前不要尝试将收据发送到您的服务器上。 / p>

要考虑尝试的另一件事是SKReceiptRefreshRequest(仅在10.9之后可用) - 在某些边缘条件下,收据可能不是最新的,您需要在发送之前等待它更新收据兑换请求到您的后端。