Having written a few of these before, there's a couple of things you should do.
First, as mentioned by others, you want some kind of paid_through_date field. This is important for a number of reasons, but the main one is that it gives you additional flexibility in case of, say, your servers going down, and you decide users should be credited with an additional day of free service. Just push back their paid_through_date value by a day. This also makes free trials simple to implement.
Second, don't use stuff like Authorize.net's Automated Recurring Billing, even if you're working on a subscription system. You want to be in full control over when the payment gets scheduled, and offloading that responsibility to your gateway is just a bad idea in most cases. Most gateways will allow you to store a credit card on their servers. They'll give you back an ID for that card, and you can issue charges against that intermediate ID instead of the card itself.
Third, LOG ALL TRANSACTIONS. I can't overemphasize this enough. In fact, you should probably expose this log to the user as well. Basically just a table of all of the payments they've made, the amounts, and the final balance. It's common to put invoices into this table as well. Invoices have a positive amount, payments and credits have a negative amount, and just sum everything for the user to obtain the final balance. You can introduce arbitrary credits to this table very easily if so desired.
Run a cron script that fires every 24 hours that checks what users need to have an invoice generated. This cron script should have three critical properties: First, if it doesn't run for some reason, you shouldn't lose a day's worth of charges. Second, if it runs more than once in a day, or if it gets aborted mid-way through and rerun, it shouldn't charge people twice. And third, if the date on the server gets changed to 2090 by accident, it shouldn't automatically bill all of your users for millions of dollars. Similarly, resets to dates in the past (Notably, Jan 1, 1970) should also cause it to raise hell. Daylight savings, in my experience, is rarely an issue.
I think that covers most of the big stuff, but there are always little gotchas in billing systems that you have to watch out for.