Проверка на стороне сервера автоматически обновляемых подписок iOS и Android с использованием уведомлений от сервера к серверу и облачных функций Firebase - PullRequest
1 голос
/ 01 февраля 2020

Я успешно выполнил проверку подписки для Google Play, но я изо всех сил пытаюсь понять процесс проверки для iOS автоматически возобновляемых подписок и хотел бы попросить вас о помощи. Вот как выглядит логика высокого уровня c для Google Play:

Новая проверка подписки

  1. Пользователь покупает подписку в приложении.
  2. A SubscriptionRequest создается в моей базе данных Firestore, которая включает UserID и токен транзакции.
  3. Облачная функция обнаруживает, что SubscriptionRequest и запрашивает соответствующий API Google с помощью токена , чтобы получить сведения о подписке. Это делается с помощью googleapis Node.js libary.
  4. Последние данные о подписке сохраняются в Firestore как Подписка , включая токен (как connectedPurchaseToken) ) и UserID .
  5. Дата истечения срока подписки оценивается, и, если она не истекла, Пользователь в Firebase обновляется и соответственно установлен флаг hasActiveSubscription (включая идентификатор подписки Google Play, например, month_sub или year_sub и платформу, в данном случае android).

Уведомления Google Play Developer

  1. Уведомление получено с помощью облачной функции Pub / Sub.
  2. Соответствующая информация о подписке будет быть извлечены с использованием соответствующего API Google и токена из уведомления.
  3. Если Подписка с этим токеном (как connectedPurchaseToken ) не существует в база данных, ш мы попытаемся найти существующую подписку в нашей базе данных, используя connectedPurchaseToken из сведений о подписке, которые были получены в (2).
  4. Если все еще нет Подписка может быть найдена в базе данных, что, очевидно, означает, что это новая подписка, которая будет обрабатываться исключительно через процесс проверки Новая подписка , описанный выше. Причина этого заключается в том, что в противном случае я не могу связать свой идентификатор пользователя и подписку.
  5. Если найдена подписка , она обновляется с последними сведениями.
  6. Оценивается дата истечения срока подписки, и, если она не истекла, Пользователь в Firebase обновляется, и соответственно устанавливается флаг hasActiveSubscription . [...]

Это работало исключительно хорошо и надежно в течение достаточно долгого времени.

Насколько я вижу, developerPayload , который мог использоваться для передачи, например, UserID , чтобы определить, кому принадлежит подписка, не рекомендуется. ( Источник )

Как вы думаете, есть более простой способ сделать это, возможно только с помощью уведомлений Google Play Developer?

Я получаю уведомление на каждом этапе, когда меняется подписка, и я просто обновляю свои Подписка и hasActiveSubscription , основываясь на дате истечения срока действия. Это работает хорошо, потому что я получаю уведомление в момент истечения срока подписки (тип уведомления SUBSCRIPTION_EXPIRED) и в любой момент, например, продление подписки. ( Источник )

Чего-то не хватает в этой логике проверки c или какого-либо потенциального риска?

Эти два вопроса пока только чтобы я не пропустил что-то важное. Опять же, по моему опыту, это работает довольно хорошо.

Все, что осталось для моего приложения (кстати, на основе Flutter), которое должно быть выпущено на iOS, - это реализация логики проверки c для iOS.

Одна вещь, которая сделала логику проверки Google c довольно простой, это то, что есть библиотека googleapis , которая, по сути, дает мне классы моделей для всех ответов, такие как уведомления или детали подписки. Мне не удалось найти что-то похожее для Apple, и я не уверен, что есть.

Есть ли какая-либо (официальная) библиотека, которая предоставляет мне функции, подобные googleapis для Node.js?

Для новых подписок в настоящее время я запрашиваю конечную точку verifyReceipt , которая, кажется, работает хорошо. Однако Apple, похоже, нигде не говорит, какие поля должны быть проверены точно, чтобы предоставить пользователям доступ к приложению. Я следую тому же логу c, что означает: если я получаю действительную квитанцию ​​от конечной точки, и срок ее действия не истек, я даю доступ.

Достаточно ли этого логика c для новые подписки или я что-то упустил?

Для Google до сих пор я просто сохранял информацию о подписке, полученную при запросе API, включая UserID и токен . Это делается в основном из-за лени и потому, что полученная структура документа довольно проста. Ответы Apple намного сложнее, поэтому я совершенно не уверен, что хранить (и плохо документирован, если вы спросите меня), поэтому мне интересно:

Какие детали я на самом деле нужно, как для Google, так и для Apple, особенно если я полагаюсь на уведомления об обновлении подписки?

Что касается обновлений подписок, мне интересно, как работать с уведомлениями между серверами от Apple.

Когда именно они отправляются, и могу ли я реализовать тот же лог c, как описано выше для Android?

Как я не могу Кажется, вы найдете хорошую документацию или учебное пособие для этой части:

Возможно, вы знаете какие-нибудь хорошие учебники для этих уведомлений?

Большое спасибо за вашу поддержку, Матиас

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