Ну, вы задаете два вопроса.
как вы будете постепенно взимать плату с пользователя
каждый месяц?
То, что вы ищете, - это регулярные платежи, большинство платежных шлюзов предоставляют такие возможности (Paypal делает). По сути, он хранит информацию о кредитной карте в защищенной базе данных и запускает cron каждый день, чтобы проверить наличие повторяющегося профиля и запросить авторизацию. Тем не менее, я на самом деле не советую вам делать это самостоятельно, это сложно и как-то незаконно в большинстве стран. (Вы не можете хранить номера CC самостоятельно).
Какой-то веб-сайт взимает плату один раз за n месяцев, но с точки зрения пользователя он может их испугать.
Как бы я реализовал это в коде?
Zend Framework поставляет компонент (Zend_Acl
), который поможет вам создать Список контроля доступа .
То, что вы можете сделать, - это создать одну «роль» для каждого типа подписки, каждая из которых имеет разные привилегии для разных ресурсов.
Если вы знаете метод МОСКВЫ , это как-то похоже:
- (Роль) Бесплатный план может (Привилегия) зарегистрировать (Ресурс) веб-сайт.
- (Роль) Базовый план может (Привилегия) создать 5 (Ресурсное) рабочее пространство.
и т.д.
Обратите внимание, что большую часть времени существует своего рода Повышение привилегий , потому что о том, как вы можете наследовать роли.
Вам нужно изолировать и найти, какой у вас ресурс, ресурсы могут быть чем угодно, и даже быть динамичными и созданными на лету.
Используя утверждения, вы должны иметь возможность ограничить количество рабочих пространств для каждой роли.
Class WorkspaceCountAssertion {
const MAX_WORKSPACE = 5;
public function assert(Zend_Acl $acl,
Zend_Acl_Role_Interface $role = null,
Zend_Acl_Resource_Interface $resource = null,
$privilege = null)
{
//retrieve the current workspace count
if ($workspaceCount > self::MAX_WORKSPACE) {
return false;
}
return true;
}
}
$acl->allow('basic', 'workspace', 'create', new WorkspaceCountAssertion());
Это дает вам идею.
Обратите внимание, что я никогда не использовал термин пользователь, контроллер и т. Д., Вам на самом деле нужно думать с точки зрения роли, ресурса, привилегий.
Вам необходимо сохранить роль с соответствующей учетной записью в простых отношениях «многие к одному».
Каждая учетная запись может иметь одну роль. Как обновить это, когда оплата остановится? Зависит, но в большинстве случаев вам потребуется запустить cron, который проверит окончание подписки и проверит повторяющийся платеж, в зависимости от платежного шлюза, он либо отзовет результирующую транзакцию, либо вернет ее напрямую через веб-сервис. Если платеж не прошел или вам было отказано, вы можете изменить роль на бесплатную учетную запись.
Есть несколько способов сделать это, это зависит от вашего приложения и требований.
Возможно, вы захотите сохранить каждую ежемесячную подписку или обновить связанный аккаунт / строку подписки.