Делаем таблицу подписок, в ней дата начала, дата окончания, пользователь.
Никаких расписаний не надо. Тем более можно напороться на случай, когда вы будете менять привелегии у пользователя с подписан на не подписан по расписанию, и в этот момент пользователь будет продлевать подписку. Проверку что пользователь подписан нужно делать каждый раз при запросе привилегий пользователя, путём запроса к таблице описанной выше. Условие = пользователь, плюс текущее время находится между двумя датами. Если запись найдена - есть привилегии.
Оплатил: к текущей дате прибавили 29 (28+сегодня, т.е. полных - всегда 28 даём) и установили timestamp.
При действиях пользователя - проверяем: текущая дата меньше или равна timestamp, если "ДА" - то привилегия работает, "НЕТ" - период привилегии закончился и ставим флаг "EXPIRED" в БД.
PS: А почему месячная подписка - это 28 дней, а не больше?
Можно сделать отправку формы на js, но не хочу, поскольку javascript можно остановить и изменить значения
для этого существует подпись, которую Вы кладёте в поле hidden при формировании страницы.
После оплаты - получаете данные и проверяете их через подпись.
Если он что-то подменит - подпись не совпадёт и Ваш ответчик транзакции сгенерит ошибку (оплата не пройдёт, деньги ни с кого не спишутся).
Так как совершенно непонятна ваша система/инструменты, очень условно представляется так:
- таблица в БД с отправленными ссылками,
- при открытии страницы регистрации проверяете ссылку, у неё есть двоичное свойство "использована",
- при успешном завершении регистрации помечаете ссылку, как использованную.