PVStream -------- 1. Подписки Могут быть или Trial или Реальной. Trial - только на нашей стороне. У подписки есть 2-а основных атрибута: active (да/нет) и state (TRIAL, ACTIVE, OVERDUE, CANCEL, DEACTIVE, FREE). state: ACTIVE, OVERDUE, CANCEL, DEACTIVE по смыслу соотв. статусам в FastSpring. state: FREE - на будущее (для бесплатных подписок). Для Реальной подписки - создается соотв. запись в Subscription, для Trial не создается (но подразумевается виртуальная). 2. Trial При регистрации нового пользователя/компании, компании выставляется атрибут trial_expiration - дата окончания Trial периода. Trial периода == Profile."trial.expiration.in.days" В системе запущен демон, отслежиающий скорое окончание и окончание Trial периода - TrialProcessorPeriodicTimer. Данный демон, должен запускается раз в день и слать письма о скором окончании или окончании Trial периода, админу соотв. компании. Если демон будет запускаться больше одного раза в день, то и письма будут слаться больше одного раза в день (т.к. мы не храним факт отправки данного типа писем в соотв. день). Дни в которые надо слать эти письма, задаются параметром Profile."trial.email.before.days.list" (список дней за сколько до окончания Trial периода надо слать письмо). Например: Profile."trial.email.before.days.list"=[-1, 1, 3, 5] - надо слать по письма за 5, 3, 1 дней до окончания и на следующий день после окнчания. Шаблоны писем (2-а вида) см. в EmailTemplate: trial.expired.soon и trial.expired (_нужно придумать реальный текст_). _ После того, как Trial период закончился, после успешного логина, пользователь получает роль "TrialFinalizer" и право usr:login (_нужно добавить все нужные права_). Роль "TrialFinalizer" задумана как спец. роль для покупки Реальной подписки (и возможно для урезанной функциональности от обычной). Получить статус текущей подписки можно черерз REST: GET /services/subscription/current { "name": "pvstream_trial", "state": "TRIAL", "active": true } Trial подписка активна, если период не окончился, а ее state всегда равен "TRIAL". Отмена подписки не предусмотрена. 3. Реальная Подписка Создается до или после окончания Trial периода. При успешном создании (и оплате) у компании сбрасывается атрибут trial_expiration и создается объект Subscription (на который ссылается компания). Так же у компании заполняется атрибут external_account_id (FastSpring токен Account'а плательщика в контексте нашей компании). Статусы подписки: ACTIVE(оплачена на период), OVERDUE(оплата следующего периода не прошла), CANCEL(отменена, но текущий оплаченный период еще действует), DEACTIVE (закрыта навсегда). Статусы подписки максимально синхронизированы с FastSpring API (посредством Webhooks). Получить статус текущей подписки можно через REST: GET /services/subscription/current { "name": "pvstream", "state": "ACTIVE", "active": true } На то Активна или нет подписка, указывает атрибут "active" (а state/статус - носит вспомогательный характер!), например статус можен быть CANCEL(отменена), но сама подписка еще активна. Купить новую подписку при наличии активной подписки со статусом "ACTIVE" нельзя. Купить(начать) новую подписку можно через REST: POST /services/subscription, в успешном ответе будет ссылка на страницу оплаты в FastSpring: { "name": "default", "state": null, "paymentUrl": "https://pvstream.test.onfastspring.com/session/eYN7CXAfQS62B4h4vqu0_A", "active": null } После успешной оплаты на стороне FastSpring, в систему приходит Webhook subscription.activated и подписка становится активной и статус будет = "ACTIVE". Что бывает при неуспешной оплате я не знаю (т.к. тест не позволяет сделать неуспешную - мы просто остаемся на экране оплаты...) !!!! Важно! Купить подписку можно, если заполнены Имя и Фамилия покупателя (у нас это админ текущей компании) и название компании !!! Все настройки FastSpring(target API, auth basic, links to payment, и т.п.) вынесены в Profile в звписи с префиксом: "pgw.fast.spring." Отмена текущей подписки делается или на стороне FastSpring или через REST: DELETE /services/subscription/ В обоих случаях приходит Webhook subscription.canceled, но подписка остается активной до прихода Webhook subscription.deactivated. При неуспешной оплате нового периода (и окончании старого) и после получения соотв. Webhook, подписка становится неактивной(Subscription.active=false) и после следующего успешного логина, этот пользователь получает спец. роль "SubscriptionPayer" и право usr:login (нужно добавить все нужные права_). Роль "SubscriptionPayer" задумана как спец. роль для продления Реальной подписки (и возможно для урезанной функциональности от обычной). Для отслеживания ситуации не-продления подписки, введен фильтр SubscriptionCheckFilter, который, если видит, что Реальная подписка не активна, выдает на некоторые запросы ответ HttpServletResponse.SC_PAYMENT_REQUIRED (нужно дописать код после обсуждения с UI разработчиком). Фильтр можно отключить в web.xml. FastSpring ---------- 1. Webhooks (раздел Integrations https://dashboard.fastspring.com) http://87.110.182.73:8180/services/subscription/PA3xQ7PRgzxSYganQA92DJ2KuV6YyHjGh/activated subscription.activated http://87.110.182.73:8180/services/subscription/PA3xQ7PRgzxSYganQA92DJ2KuV6YyHjGh/chargefailed subscription.charge.failed http://87.110.182.73:8180/services/subscription/PA3xQ7PRgzxSYganQA92DJ2KuV6YyHjGh/cancelled subscription.canceled http://87.110.182.73:8180/services/subscription/PA3xQ7PRgzxSYganQA92DJ2KuV6YyHjGh/deactivated subscription.deactivated 2. тестовые карточки: OK: 4242 4242 4242 4242, any date in future, CVC = *MTXF FAIL: 4000 0000 0000 0002, any date in future, CVC = *MTXF US zip code: 94203 3. Логин: https://dashboard.fastspring.com/app Username: alexgul@swdfactory.com Password: 927R0TiCitiF Проблемы, Вопросы и Недоделки ------------------ 1. Как проводить тесты на stg или qa? Webhooks одни и те же. 2. Не проверено неуспешнось оплаты новой подписки (остаемся на том же экране оплаты FastSpring) 3. Не 100% проверены Webhooks по неуспешным оплатам за новые периоды (я проверял но не системно - в консоли FastSpring есть эмуляция таких ситуаций) 4. фильтр SubscriptionCheckFilter (нужно дописать код после обсуждения с UI разработчиком). 5. На BL нужно реализовать проверку ролей SubscriptionPayer и TrialFinalizer