Проверка InAppPurchase и отдельный сервер для логики игры

Я разрабатываю приложение, использующее Unity (для Android и iOS). Я использую плагин SOOMLA, чтобы позволить пользователям приобретать драгоценные камни (виртуальную валюту) с помощью In App Purchase.

Пользователи и Gems и все другие логики игр проходят через мой сервер на Azure.

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

  1. Пользователь покупает драгоценные камни с помощью IAP
  2. Приложение уведомляет сервер
  3. Сервер проверяет данные покупки и обновления

Но если интернет-соединение разбивается между шагами 1 и 2, пользователь платит за драгоценные камни, которые он не получил (не хорошо!)

Поэтому мой нынешний подход таков:

  1. Пользователь инициирует покупку
  2. Приложение уведомляет сервер
  3. Сервер слепо обновляет данные соответственно
  4. Пользователь покупает драгоценные камни с помощью IAP
  5. Если покупка отменена, уведомите сервер, чтобы отменить его

Таким образом, пользователю гарантированно получить его приобретенные драгоценные камни, но мне не гарантируется оплата (не очень …)

Примечание. Я не хочу управлять пользователями Gems в самом магазине. Я хочу все на своем сервере. Таким образом, баланс SOOMLA не имеет смысла для меня. Меня это не волнует.

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


Я представляю лучшее решение как что-то, что будет правильно обрабатывать этот сценарий:

  1. Пользователь покупает драгоценные камни с помощью IAP
  2. IAP преуспевает
  3. Интернет распадается
  4. Мой собственный сервер не уведомлен
  5. Пользователь удаляет приложение из своего устройства
  6. Затем пользователь может установить приложение на другие устройства:

    • Либо он был обвинен, и он получил драгоценные камни от какой-то магии
    • Или он был возвращен автоматически, поскольку драгоценные камни не были получены

До сих пор кажется, что это невозможно каким-либо образом, что меня разочаровывает в технологии IAP. Надеюсь на ответы, которые докажут, что я ошибаюсь.


Кажется, все, что мне когда-либо понадобилось, – это возможность получить историю покупок пользователя с моего сервера с защищенным запросом в Google Play или Apple Store. Но это не входит в рамки.


Так что же делают другие? Каков наилучший подход?

    В общем, вы, кажется, страдаете от проблемы двух генералов, которая была

    Первая компьютерная проблема связи, которая будет доказана как неразрешимая.

    Поскольку повсюду в вашем протоколе связи сообщение может быть потеряно (даже подтверждение или подтверждение подтверждения или …), вы не можете быть на 100% уверены, что обе стороны связи (пользовательское устройство и ваш сервер) договорились о том же государство. Вы можете только сказать, что с определенной вероятностью информация о состоянии была успешно переделана.

    Я бы послал пару ACK обратно и вперед и сохранил покупку, если достаточное количество получили корыто. Цитата из Википедии:

    Кроме того, первый генерал может отправить отметку на каждое сообщение, говоря, что это сообщение 1, 2, 3 … из n. Этот метод позволит второму генералу узнать, насколько надежным является канал, и отправить соответствующее количество сообщений назад, чтобы обеспечить высокую вероятность получения хотя бы одного сообщения

    Для удовлетворения клиента я бы взял шансы в их пользу – 1% не доставленных товаров доставит вам много неприятностей, но 1% -ная потеря на вашей стороне приемлема.

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

    Чтобы купить покупку с помощью покупки в Google Play, вы будете называть consumePurchase . На iOS вы назовете finishTransaction на SKPaymentQueue . На обоих рынках потребительская покупка останется в активном состоянии до тех пор, пока они не будут потреблены. Если пользователь удаляет приложение с своего устройства до того, как его покупают, он сможет переустановить и восстановить свои прежние неиспользованные покупки.

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

    (Обратите внимание, что потребляемые покупки не будут отображаться в коллекции in_app в квитанции iTunes, они присутствуют только в том случае, если покупка еще не была использована).

    Если сервер отключен или сетевое подключение потеряно, покупки будут оставаться в активном состоянии, и приложение должно продолжать пытаться периодически отправлять данные, пока не получит ответ, который он ожидает.

    Покупки как для Google Play, так и для iOS хранятся локально, поэтому вам просто нужно запустить процесс, который ищет некурящие покупки, как только сетевое подключение будет восстановлено.

    Вы можете рассматривать предоставление драгоценных камней таким же образом, как банк обрабатывает депозиты чеков; Новый баланс будет немедленно обновлен, но затратная сумма не будет соответствовать, пока проверка (или в вашем случае проверка) не будет очищена.

    Некоторые псевдо-коды, чтобы сделать процесс понятным:

     Purchase product or Restore purchases While consumable purchases > 0 Send purchase receipt to API If response is ok If purchase is valid Consume product Allocate gems Break Else Remove retroactive gem allocation Discipline the naughty user Break Else Retroactively allocate un-spendable gems Pause process until network is re-established Re-send receipt to API 

    У меня не так много знаний об андроиде, но после прочтения вашего сообщения мне было очень интересно быстро и подробно искать, как игра, как столкновение кланов в логике покупки приложений, и предотвращать свободу поддельных взломов .

    После некоторых исследований я хотел бы поделиться своими мыслями по вашей проблеме, вы можете реализовать ее по следующему подходу :

    Сделайте свою проверку покупки приложения полностью онлайн. Например, вы можете рассмотреть игровое столкновение кланов.

    Как это работает:

    1) Игра загружается, синхронизируется с сервером. Требуется сетевое подключение, так как сетевое соединение нарушает перезагрузку игры с сервера.

    2) Пользователь имеет 10 драгоценных камней, у сервера также 10 драгоценных камней.

    3) Пользовательские драгоценные камни, сервер проверяет покупку отдельно для купленных расходных материалов, драгоценных камней, зачисленных на учетную запись пользователя.

    4) Если в случае сбоя сети может произойти сбой, то и сервер может проверить покупку, а затем обновить ее в учетной записи пользователя, независимо от того, находится ли она на любом устройстве.

    5) Это также поможет вам обойти многие поддельные покупки в приложениях, таких как свобода ( профилактика ) и счастливый патчер .

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

    Для получения дополнительной информации о покупках приложений и их предотвращения взлома вы можете посетить эти ссылки:

    1) Проверка на стороне сервера в части 1 покупки приложения и части 2 .

    2) Как вы можете проверить на стороне сервера биллинга покупки приложений .

    3) Проверьте покупку через PHP .

    4) Безопасный сценарий покупки приложений на веб-сервере .

    Надеюсь, это может привести вас в том направлении, в которое вы хотите пойти, также мне хотелось бы услышать ваши мысли по тому же поводу.

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

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

    После восстановления покупки вы снова получите приобретенный продукт с сервера iTunes, а затем вы можете уведомить об этом свой сервер.

    Некоторые советы:

    1. Пользователь покупает драгоценные камни с помощью IAP
    2. IAP преуспевает
    3. Интернет распадается
    4. Мой собственный сервер не уведомлен
    5. Пользователь удаляет приложение из своего устройства
    6. Затем пользователь может установить приложение на другие устройства:

      Либо ему было предъявлено обвинение, и он получил драгоценные камни от какой-то магии, или он был автоматически возвращен, так как драгоценные камни не были получены.


    1. На шаге 3 информация о получении хранится на устройстве пользователя. Если пользователь удалит и переустановит ваше приложение, информация о квитанции будет потеряна. Но вы можете восстановить его; Apple говорит об этом здесь . Вы можете отправить восстановленную квитанцию ​​на свой сервер. На вашем сервере вы подтверждаете, что плюс Gems для пользователя, чтобы он мог получить то, что должен.

    2. Он был возвращен автоматически, поскольку драгоценные камни не были получены

      Это кажется невозможным с IAP, потому что Apple не позволяет пользователю отменить свою покупку. (С помощью Google IAB возврат возможен, подробнее об этом здесь )