Написав несколько из них ранее, вы должны сделать несколько вещей.
Во-первых, как уже упоминалось, вам нужно какое-то поле paid_through_date. Это важно по ряду причин, но главная из них заключается в том, что он дает вам дополнительную гибкость в случае, например, отказа ваших серверов, и вы решаете, что пользователям следует предоставить дополнительный день бесплатного обслуживания. Просто верните их значение paid_through_date на один день. Это также упрощает реализацию бесплатных пробных версий.
Во-вторых, не используйте такие вещи, как Automated Recurring Billing от Authorize.net, даже если вы работаете в системе подписки. Вы хотите полностью контролировать, когда запланирован платеж, и перекладывание этой ответственности на ваш шлюз в большинстве случаев является плохой идеей. Большинство шлюзов позволит вам хранить кредитные карты на своих серверах. Они вернут вам удостоверение личности для этой карты, и вы сможете взимать плату за этот промежуточный идентификатор вместо самой карты.
В-третьих, ЗАПИСАТЬ ВСЕ СДЕЛКИ. Я не могу переоценить это достаточно. На самом деле, вы, вероятно, должны также предоставить этот журнал пользователю. В основном это просто таблица всех выполненных ими платежей, сумм и окончательного баланса. Распространено также выставлять счета в эту таблицу. Счета имеют положительную сумму, платежи и кредиты имеют отрицательную сумму, и просто суммируйте все, чтобы пользователь получил окончательный баланс. Вы можете очень легко ввести произвольные кредиты в эту таблицу, если пожелаете.
Запустите скрипт cron, который запускается каждые 24 часа и проверяет, что пользователям нужно для создания счета. Этот скрипт cron должен иметь три критических свойства: во-первых, если по какой-то причине он не запускается, вы не должны терять дневные расходы. Во-вторых, если он запускается более одного раза в день или прерывается и выполняется повторно, он не должен взимать плату дважды. И в-третьих, если дата на сервере была случайно изменена на 2090, она не должна автоматически выставлять счета всем вашим пользователям за миллионы долларов. Точно так же, сбросы к датам в прошлом (в частности, 1 января 1970 г.) также должны стать причиной возникновения ада. По моему опыту, переход на летнее время редко является проблемой.
Я думаю, что это охватывает большинство важных вещей, но в биллинговых системах всегда есть небольшие хитрости, за которыми нужно следить.