I'm using Stripe and when a user signs up, I create a Stripe customer object and store their card info in a DB.
Are you sure you want to store their card info in your database? This opens you up to a lot of risk, and burdens you with PCI compliance. It would be better to store Stripe's card "reference", and not store the actual card info.
I just feel like there's an easier way here. If I weren't handling people's money here, I would just roll with it and see what happens.
Your can either handle the charge schedule yourself, or you can create a subscription in Stripe (i.e. sign them up to a plan). Either way you're going to have to do some work.
Also, what happens if the server for some reason doesn't execute the job? Do I set it to charge exactly after 30 days on the second?
You are going to need to rely on cron regardless. Even if you let Stripe handle the subscription, you will have to tell Stripe when to cancel the agreement.
If you do choose to let Stripe handle the subscription, then you can use the cancel_at_period_end flag to tell Stripe to stop the subscription but not immediately. Depending on how your implementation works, this may be useful. See the Stripe documentation about cancelling.