Различия между первоначальной покупкой и бесплатной повторной покупкой в ​​StoreKit / Покупке в приложении

Из руководства StoreKit:

Если пользователь пытается приобрести нерасходуемый продукт или возобновляемую подписку, которую он уже приобрел, ваше приложение получает обычную транзакцию для этого элемента, а не транзакцию восстановления. Однако с пользователя не взимается дополнительная плата за этот продукт. Ваше приложение должно обрабатывать эти транзакции так же, как и исходные транзакции.

Это представляет собой огромную проблему в приложении, над которым я работаю. Мы лицензировали большой объем контента от издателя для продажи через покупку в приложении. Они требуют, чтобы каждый раз, когда мы продаем часть этого контента (т. Е. Пользователь платит нам), наш сервер вызывал API на своих серверах, чтобы сообщить о транзакции. Это делается для целей бухгалтерского учета и в конечном итоге используется для определения того, сколько мы платим им в конце месяца в соответствии с нашим соглашением с ними.

Я прочитал несколько предложений по SO и в других местах о том, как довольно часто вызывать restoreCompletedTransactions и поддерживать локальное понимание на устройстве того, что пользователь уже купил, поэтому им нельзя разрешить купить это снова. Мне кажется, что это должно быть реализовано на стороне сервера. Однако квитанции, которые мы получаем от серверов Apple, точно такие же для покупки и повторной покупки, как и обещано в руководстве StoreKit.

Если обратным вызовам платежей из StoreKit нельзя доверять как действующему механизму учета в такой ситуации («вам заплатили» или «вам не заплатили»), какие еще доступны аналитические данные о трафике транзакций в реальном времени? Я не думаю, что издатель, с которым мы работаем, будет счастлив, если мы скажем им, что нам нужно подождать 45 дней после окончания месяца, чтобы получить РЕАЛЬНУЮ заплаченную сумму в долларах из iTunes Connect.


person Ben Englert    schedule 11.04.2011    source источник
comment
связанные (то же намерение, но подходит к нему с точки зрения того, когда использовать восстановление): stackoverflow.com/questions/16084315/   -  person Johannes Rudolph    schedule 08.06.2013


Ответы (3)


Недавно я столкнулся с той же проблемой. В моем случае я хотел реализовать точное отслеживание доходов с помощью отслеживания мобильных приложений для отслеживания доходов от различных кампаний по привлечению клиентов.

К счастью, есть способ сделать это. Следует отметить, что SKPaymentTransactionStatePurchased vs. SKPaymentTransactionStateRestored зависит исключительно от инициирующего действия, например инициировали ли вы восстановление или (повторную) покупку, так что это не сработает.

Вместо этого работает проверка на SKPaymentTransaction.originalTransaction, который будет != nil для восстановления и повторной покупки. Последнее, к сожалению, является неопределенным поведением (документы). Тем не менее, я бы посчитал нулевой чек достаточно справедливым.

Другой вариант - проверить транзакцию-получение транзакций с помощью SKPaymentTransactionStatePurchased и проверить, что свойство original_transaction_id в возвращенной подтвержденной квитанции соответствует transaction_id.

person Johannes Rudolph    schedule 08.06.2013
comment
Обратите внимание, что в случае возобновляемых подписок, когда пользователь отменяет подписку и позже запускает ее снова, исходная транзакция по-прежнему будет установлена ​​на самую первую транзакцию покупки (т.е. она настроена не только на автоматическое продление, но и на продление вручную). . - person Frederik; 18.12.2018

Плохая новость: в текущей версии iOS (4.3.x) нет возможности различать покупку и повторную покупку непотребных товаров.

Чтобы облегчить ситуацию, я бы порекомендовал две вещи:

Первый

После успешной покупки сохраните product identifier приобретенного продукта в NSUserDefaults на устройстве. Затем вы можете скрыть от пользователя уже приобретенные продукты и таким образом справиться с ситуацией повторной покупки.

NSUserDefaults резервируются iTunes, когда пользователь синхронизирует свое устройство. Таким образом, ваша сохраненная информация о покупке не теряется, когда пользователь получает новое устройство.

Второй

Сохраните данные квитанции вместе с идентификатором устройства на вашем сервере. Проанализируйте идентификатор продукта чека и идентификатор устройства.

Если вы получили еще один чек с тем же идентификатором продукта и комбинацией идентификатора устройства, предположите повторную покупку. По крайней мере, это позволит вам покрыть большинство случаев повторной покупки.

Предполагая, что обычный пользователь iPhone меняет свое устройство каждые 1-2 года, вы, по крайней мере, покроете большую часть случаев повторной покупки, и, возможно, Apple исправит это в будущем.

person leviathan    schedule 21.04.2011
comment
Я просто не думаю, что вообще стоит привязывать покупки к устройствам. Покупки привязаны к идентификаторам Apple ID, и мы мало что можем с этим поделать: пользователь мог бы восстановить нерасходуемые материалы на 100 устройствах, если бы захотел. - person Jonny; 06.09.2016

У меня есть одно решение,

  1. Настройте продукт как расходный материал. это решит проблему - (Они требуют, чтобы каждый раз, когда мы продавали часть этого контента (т.е.пользователь платил нам)).

  2. Далее вам необходимо реализовать логику в опции покупки товара. Таким образом, как только пользователь приобретает продукт, опцию покупки необходимо удалить, иначе пользователь может случайно пойти на покупку и снова потерять деньги за тот же продукт на том же устройстве. для этой цели вы можете использовать NSUserdefaults.

Благодарность,

person Naveen Shan    schedule 04.07.2011