Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Stripe Flask Example
import os
from flask import Flask, render_template, request
import stripe
stripe_keys = {
'secret_key': os.environ['SECRET_KEY'],
'publishable_key': os.environ['PUBLISHABLE_KEY']
}
stripe.api_key = stripe_keys['secret_key']
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html', key=stripe_keys['publishable_key'])
@app.route('/charge', methods=['POST'])
def charge():
amount = 500
customer = stripe.Customer.create(
email='customer@example.com',
card=request.form['stripeToken']
)
charge = stripe.Charge.create(
customer=customer.id,
amount=amount,
currency='usd',
description='Flask Charge'
)
return render_template('charge.html', amount=amount)
if __name__ == '__main__':
app.run(debug=True)
{% extends "layout.html" %}
{% block content %}
<h2>Thanks, you payed <strong>$5.00</strong>!</h2>
{% endblock %}
{% extends "layout.html" %}
{% block content %}
<form action="/charge" method="post">
<article>
<label>Amount: $5.00</label>
</article>
<script src="https://checkout.stripe.com/v2/checkout.js" class="stripe-button" data-key="{{ key }}"></script>
</form>
{% endblock %}
<!DOCTYPE html>
<html>
<head>
<title>Stripe</title>
<style type="text/css" media="screen">
form article label {
display: block;
margin: 5px;
}
form .submit {
margin: 15px 0;
}
</style>
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>
@jgentes

This comment has been minimized.

Copy link

jgentes commented Apr 17, 2013

A few instructions for hosting this on heroku:

  1. Create a 'Procfile' file in the root folder that includes (without quotes): "web: python app.py"
  2. Create a 'requirements.txt' file in the root folder that includes (without quotes): "flask"
  3. Adjust the last line of app.py to read: "app.run(host='0.0.0.0', port=int(os.environ.get("PORT")))"
  4. If desired, you can add the secret key and publishable key as environment variables using "heroku config:add" using the heroku toolbelt

Also charge.html has a misspelling: should say "you paid" :)

Cheers, and thanks for the example!

-James

@ecaldwell

This comment has been minimized.

Copy link

ecaldwell commented May 31, 2013

Indentation is off (slightly overindented) in app.py on lines 22-25 and 27-32.

@octaflop

This comment has been minimized.

Copy link

octaflop commented Jun 25, 2013

To use the amount in the charge template, you'll want to use the format filter: https://gist.github.com/octaflop/5860862

<h2>Thanks, you payed <strong>$
    {{ '%(amt).2f'|format(amt=amount/100) }}
</strong>!</h2>
@fyears

This comment has been minimized.

Copy link

fyears commented Jun 4, 2014

Line #22 ~ #23 indention error. There should be 2 spaces in the front of each line.

@dhamaniasad

This comment has been minimized.

Copy link

dhamaniasad commented Mar 2, 2015

If anyone is getting a TemplateNotFound exception with this example, just make a directory called templates and put the templates in that directory, and it'll work. This is because Flask looks for templates in the templates directory.

@coreybrett

This comment has been minimized.

Copy link

coreybrett commented Mar 6, 2015

I've noticed that the email address entered on the checkout ends up as the “card holders name” and the hard-coded address is the customer's email address. Any way to fix that?

@NAThompson

This comment has been minimized.

Copy link

NAThompson commented May 8, 2016

Why
customer = stripe.Customer.create( email='customer@example.com', card=request.form['stripeToken'] )

instead of

customer = stripe.Customer.create( email=request.form['stripeEmail'], card=request.form['stripeToken'] )?

@tb123

This comment has been minimized.

Copy link

tb123 commented Mar 4, 2017

What about writing unit tests for all of this?

@emiranda04

This comment has been minimized.

Copy link

emiranda04 commented Oct 13, 2017

How will you pass values dynamically from the script form using the POST request? For example:

amount = request.form['amount'] 
description = request.form['description']

Then you can use them in the charge object thus avoiding the hard coded values like:

charge = stripe.Charge.create( 
    customer = customer.id, 
    amount = amount, 
    currency = 'usd', 
    description = description
 )
@thepythonist99

This comment has been minimized.

Copy link

thepythonist99 commented Oct 30, 2017

Cool It worked just as I expected. Thanks !!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.