Rails, Stripe и Subscriptions — Модель

На моем сайте у меня работает вся интеграция с Stripe, но я все еще пытаюсь понять, как определить, активна ли подписка. Я думал хранить все в локальной БД, но тогда у меня были бы дубликаты данных из Stripe. Однако, если Stripe является основной записью, что, если они не работают, и я не могу определить, есть ли у пользователя активная подписка? Мне кажется, должен быть способ синхронизировать все вместе. Должен ли я хранить какую-то дату истечения срока действия текущей подписки с учетной записью/пользователем?

Какую информацию о подписке следует хранить вместе с моделью? Должно ли это быть частью модели пользователя или отдельной модели «Подписка»?


person Steve Wright    schedule 17.04.2012    source источник


Ответы (3)


Просто сохраните флаг, указывающий, активна подписка или нет, для которого по умолчанию установлено значение true при подписке.

Затем настройте обработчики обратного вызова полосы, чтобы уведомлять ваше приложение, если подписка истекла/отменена/что-то еще. Прислушайтесь к запросу customer.subscription.updated и посмотрите на поле статуса, которое может быть активным, прошедшим, отмененным или неоплаченным.

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

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

person eagspoo    schedule 07.07.2012
comment
Расширение стратегии веб-перехватчиков Stripe (stripe.com/docs/webhooks). В случае, если веб-перехватчик не получает ответ с кодом 200 от приложения. Stripe будет пытаться отправить вебхук один раз в час в течение 3 дней. - person Christian Fazzini; 21.02.2014
comment
согласованный. Мне действительно не нравится решение задачи cron, предложенное в принятом ответе... - person matt walters; 04.07.2014

«Какая информация о подписке должна храниться вместе с моделью? Должна ли она быть частью модели «Пользователь» или частью отдельной модели «Подписка»?»

Сохраните всю информацию в модели подписки и свяжите эту модель с пользователем. Поскольку подписки имеют свои собственные метаданные и на самом деле являются разными объектами, имеет смысл хранить их отдельно.

«Однако, если Stripe является основной записью, что, если они не работают, и я не могу определить, есть ли у пользователя активная подписка? Мне кажется, что должен быть способ синхронизировать все вместе. Должен ли я хранить какую-то дату срока действия текущей подписки с учетной записью/пользователем?"

Если вы проверяете подписку при каждом запросе или входе в систему, вероятно, не имеет смысла каждый раз нажимать на полосу API... это много накладных расходов. Все действительно зависит от вашего варианта использования, но может иметь смысл запускать ежедневное (или ежечасное) задание cron, которое обращается к API-интерфейсу полосы, чтобы проверить срок действия подписки, а затем обновить локальное хранилище подписок.

person johnmcaliley    schedule 17.04.2012

Мой подход к SaaS Rails Kit состоит в том, чтобы хранить информацию в модели подписки, включая поле next_renewal_at, и не оставлять Stripe выставление счетов. Вместо этого у меня есть ежедневное задание cron, которое выставляет счета всем подпискам, у которых есть new_renewal_at = сегодня, поэтому вы сразу узнаете, если оплата не удалась.

person Benjamin Curtis    schedule 17.04.2012