I’m nearing completion on my latest project, Training Sleuth, and I’ve once again decided to use Stripe as my payment processor. I used Stripe on my previous project, Rhino SchoolTracker, and have absolutely nothing negative to say about it :).
While with Rhino SchoolTracker I tested my stripe payments manually, I decided I wanted to write some automated integration tests this time around (particularly since I’m using Scala for this project which has a decidedly slower and more unwieldy edit-compile-test loop than Ruby does).
- You serve an HTML payment form (with fields for CC number, etc.) from your server to the client.
- When the client submits the form, instead of sending it to your sever, you use stripe.js to grab the form data and sends it to Stripe’s servers, which will validate the card and return a unique token (or an error message in case of invalid/expired credit cards, etc.) via an ajax request.
- Once you have the stripe card token, you send it up to your server, do whatever processing you need to do on your end (grant access to your site, record an order, etc.), and then submit a charge to Stripe using the Stripe API.
The key feature of all of this is that the user’s credit card information never touches your server, so you don’t need to worry about PCI compliance and all the headaches that go with it (yes, stripe does require you to use SSL, and despite their best efforts it is possible to mis-configure your server in such a way as to expose user payment info if you don’t know what you’re doing).
Now Stripe offers a test mode, which is what we’ll be using here, with a variety of test card numbers to simulate various conditions (successful charge, declined card, expired card, etc.). The main problem I ran into writing automated tests in Scala was that I needed to use stripe.js to generate a card token before I could interact with the server-side (Java) API.
First, here’s my stripetest.js:
And you need to provide some basic HTML, I created a file called ‘stripetest.html’ which merely contained this:
<!DOCTYPE html> <html> <head> <title></title> </head> <body> </body> </html>
Simple, but this was enough to get things working.
I dropped these files (along with env.rhino.js which I obtained from the Envjs website) into my test/resources folder.
With all of that in place, I was able to write some specs2 tests:
There you go, kind of painful to get set up, but definitely nice to have.