为什么每次我从Apple请求时,latest_receipt对象都会发生变化?

时间:2017-12-13 19:49:25

标签: ios in-app-purchase in-app-subscription

在购买应用程序内订阅时,有一点我不太明白。

我在iOS客户端上获得收据如下:

private func loadReceipt() -> Data? {
        guard let url = Bundle.main.appStoreReceiptURL else {
            return nil
        }

        do {
            let receipt = try Data(contentsOf: url)
            return receipt
        } catch {
            print("Error loading receipt data: \(error.localizedDescription)")
            return nil
        }
    }

将其发送给我的服务器验证(用Python编写)。

def verify_receipt(self, receipt):
    r = requests.post(config.APPLE_STORE_URL, json=receipt)
    request_date_ms = DateUtils.generate_ms_from_current_time()
    for item in r.json()['latest_receipt_info']:
        expires_date_ms = int(item['expires_date_ms'])
        if expires_date_ms > request_date_ms:
            return True
    return False

我不确定这是否是验证订阅是否仍然有效的正确方法。

我从expires_date_ms获取latest_receipt_info,如果它大于当前时间(以毫秒为单位),则订阅仍然有效。

然而我注意到的是,单独的latest_receipt,应该等于我刚发送的那个,实际上每次调用API时都会改变。但为什么?我没有订阅任何新的,为什么最新的收据会改变?

根据文件:

  

latest_receipt

     

仅对包含自动续订订阅的收据返回。   对于iOS 6样式的交易收据,这是base-64编码   最近续订的收据。对于iOS 7样式的应用程序收据,   这是最新的base-64编码应用收据。