2
votes

There is one thing I don't quite understand when it comes to In-App Subscription purchase.

I obtain the receipt on iOS client like this:

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
        }
    }

And send it for verification to my server (written n 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

I'm not sure if this is the correct way of verifying if a subscription is still valid.

I get the expires_date_ms from latest_receipt_info, and if it's greater than the current time in milliseconds, then the subscription counts as still valid.

However what I noticed is that the separate latest_receipt, which is supposed to be equal to the one I have just sent in, is actually changing every time I call the API. But why? I haven't subscribed to anything new, why is the latest receipt changing?

According to the docs:

latest_receipt

Only returned for receipts containing auto-renewable subscriptions. For iOS 6 style transaction receipts, this is the base-64 encoded receipt for the most recent renewal. For iOS 7 style app receipts, this is the latest base-64 encoded app receipt.

1

1 Answers

0
votes

If this is against the sandbox then the subscription is auto-renewing on a predefined period. See: https://help.apple.com/app-store-connect/#/dev7e89e149d