Проверка получения IAP для iOS


Я работаю над клиент-серверным приложением, которое использует Apple IAP и StoreKit framework для покупки подписки.

Мы хотели бы, чтобы клиент (iPhone или iPad) совершил первоначальную покупку подписки с apple через свою учетную запись iTunes с помощью StoreKit framework, а затем передал квитанцию на наш сервер, который подтвердит ее, а затем обновит статус учетной записи пользователя. Мы также хотели бы, чтобы сервер отвечал за управление статусом подписки. (проверьте наличие автоматического продления, отмены и т.д..) Это все с использованием iOS 7 style appleReceipts, а не iOS 6 style transaction receipts, которые в настоящее время устарели.

Документы Apple говорят, чтобы отправить на следующий URL-адрес для проверки квитанции в песочнице вместе с квитанцией и секретным кодом

Https://sandbox.itunes.apple.com/verifyReceipt

До этого момента .. все работает как надо.

Где все запутывается для меня, так это в ответ. В документах Apple говорится, что ответ должен содержать до 4 полей. Если вы проверяете получение приложения в стиле iOS 7, то вам следует ожидать только первые 2. Если это получение транзакции подписки в стиле iOS 6, то вы должны ожидать увидеть все 4.

1) статус (0 для valid, некоторый код ошибки в противном случае)

2) квитанция (представление JSON квитанции, которая была отправлена)

3) latest_receipt (возвращается только для iOS 6 style transaction receives for auto-renewable подписки. База-64 закодировала получение транзакции для последнего обновления.)

4) latest_receipt_info (то же, что и выше в формате JSON)

Задача 1: Я вижу все 4, хотя я проверяю получение приложения в стиле iOS 7. Врачи говорят, что этого не должно быть. событие.

Https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW1

Задача 2: Мы хотели бы, чтобы сервер поддерживал статус подписки пользователя, опрашивая этот API с исходной квитанцией приложения, которую клиент передал после своей первоначальной покупки. Поле latest_receipt_info, по-видимому, содержит постоянно обновляемый список транзакций, в то время как Поле receipt является копией оригинала без обновленной информации о транзакции.

Мой Вопрос: Тогда кажется, что единственный способ, которым сервер может получить информацию об обновленной транзакции, - это посмотреть на поля latest_receipt_info или latest_receipt, но эти поля не должны присутствовать в ответе согласно документации.

Является ли это ошибкой в документации Apple? Или единственный способ получить последний набор транзакций-это отправить клиенту обновленную версию AppReceipts, когда он получает уведомление от SKPayementTransactionObserver?

EDIT-добавление выполненных шагов и некоторого кода согласно комментарию ниже.

1) покупка продукта autoRenewSubscription с помощью SKPaymentQueue:

 SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];
    payment.applicationUsername = [self hashedValueForAccountName:[UserAccount sharedInstance].subscriberKey];
    [[SKPaymentQueue defaultQueue] addPayment:payment];

2) когда оплата завершена, мне перезванивают через мой SKPaymentTransactionObserver и отправляют файл по следующему адресу:

NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];

На мой удаленный сервер.

3) я использую следующий код python для проверки получение

import itunesiap
import base64

file = "/path/to/receipt/sandboxReceipt"
f = open(file)
encoded = base64.b64encode(f.read())

with itunesiap.env.current().clone(use_sandbox=True):  # additional change for current environment.
    response = itunesiap.verify(encoded,"mysecretkey")

Ответ содержит словарь. Словарь имеет следующие поля

"latest_receipt" = base64 encoded receipt here
"latest_receipt_info" = a JSON representation of the latest receipt
"receipt" = a JSON representation fo the receipt I sent for verification

В документах говорится, что первые 2 поля являются

" возвращается только для iOS 6 стиль транзакций квитанции для автоматического возобновления подписки."

  1. почему они появляются здесь, так как я проверял стиль iOS 7 получение приложения?
  2. если эти поля не должны присутствовать, как я могу это сделать? получить последнюю транзакцию информация?
2 2

2 ответа:

Формулировка в документах Apple неоднозначна. возвращается только для транзакций в стиле iOS 6 для автообновляемых подписок. Это означает, что поле всегда присутствует для поступлений iOS 7 с использованием appStoreReceiptURL, но только для устаревших поступлений в стиле транзакций, которые предназначены для автоматического продления подписки. то есть они не появляются на транзакционных квитанциях iOS 6, Если покупка не является подпиской.

Вам нужно включить ключ "password "в ваш JSON вместе с" receipt-data "при нажатии, чтобы подтвердить reciept, и его значение будет" shared secret key", который вы можете сгенерировать из учетной записи itunes. Обратитесь к третьему разделу этой ссылки для получения более подробной информации. https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html