Должен ли я вызвать finishTransaction, когда проверка получения подтверждения сервером не удалась?
Я использую проверку подтверждения на стороне сервера.
Когда клиент
- (void)paymentQueue:(SKPaymentQueue *)queue
updatedTransactions:(NSArray *)transactions
а transactionState
- SKPaymentTransactionStatePurchased
,
клиент отправляет квитанцию на наш сервер,
и наш сервер проверяет его.
Когда проверка подтверждения на стороне сервера завершается успешно,
клиент явно вызывает finishTransaction
, без проблем.
Когда проверка подтверждения на стороне сервера не удалась,
потому что apple временно возвратил non json, или клиент отправил недопустимую квитанцию или что-то еще,
сервер возвращает эту информацию клиенту.
Далее, что должен делать наш клиент?
Должны ли мы называть finishTransaction
?
Это приводит к недействительным транзакциям, живущим вечно в очереди?
как сказал в этом вопросе: покупка iPhone в приложении: проверка квитанции
Но если вы обнаружите, что квитанция недействительна, вы должны завершить связанную транзакцию. Если нет, у вас могут быть дополнительные транзакции, живущие вечно в очереди транзакций. Это означает, что каждый раз, когда ваше приложение запускается, paymentQueue: updatedTransaction: будет вызываться один раз за транзакцию...
Но если мы делаем finishTransaction
, наш ценный пользователь заряжается этой квитанцией (которую мы не смогли проверить), правильно?
Или истекает ли транзакция с подтверждением проверки в течение определенного периода?
Является ли это документированным где-то в документе Apple?
Я не мог найти никого в http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/Introduction/Introduction.html
Ответы
Ответ 1
Да, вы должны закончитьTransaction.
Это вам, если вы дадите пользователю то, что они хотят. В некоторых случаях лучше дать пользователю то, что они хотят, даже если квитанция недействительна или подделана (с использованием джейлбрейка). Особенно, когда это ничего не стоит.
Ответ 2
Я завершаю транзакцию, чтобы удалить ее из очереди, но не предоставляйте дополнительный контент, если проверка не выполняется. Если это недопустимая квитанция, то Apple не взимает плату. Если это окажется чем-то другим, например, временно приостановленным сервером проверки Apple, тогда они будут заряжены, и когда они попытаются восстановить покупки (или добавят их снова), они не будут снова заряжаться, и ваше приложение получит еще один снимок проверки чека.
Если проверка по технической причине, такой как сервер Apple, не работает, будет неудобно, но я не вижу другого способа предотвратить кражу вашего контента. Хорошей новостью является то, что вы можете сообщить пользователю всплывающее окно, если сервер Apple выключен, и что они должны повторить попытку позже, а самое главное, что они больше не будут списаны.