Here's some code that I use... hopefully should get you started.
In your python environment: pip install stripe
Then in a controller (donations):
```
def __create_stripe_session(item_name='', amount_cents=0, success_url='',
cancel_url='', item_description='', customer_email=None):
"""
Creates a Stripe session (with a payment intent id), valid for 24
hrs, which we can then submit later.
"""
import stripe
stripe.api_key = 'stripe_key_secret'
stripe_session = stripe.checkout.Session.create(
payment_method_types=['card'],
customer_email = customer_email,
# prepopulates, but readonly - user can't change it.
line_items=[{
'name': item_name,
'description': item_description,
'amount': amount_cents,
'currency': 'cad',
'quantity': 1,
}],
success_url = success_url,
cancel_url = cancel_url,
)
return stripe_session
def make_donation():
"""
display page with form to enter amount.
"""
# display form.
form = SQLFORM.factory(Field('amount', type='string', label='Donation
Amount'))
if form.process().accepted:
# create a Stripe session
stripe_session = __create_stripe_session(
item_name = 'Donation',
amount_cents =
int(round(float(form.vars.amount),2)*100),
success_url =
'http://localhost:8055/donations/done?action=payment_complete', # stripe
redirects here on success.
cancel_url =
'http://localhost:8055/donations/done?action=cancelled' # stripe
redirects here if cancelled.
)
# Save record so can compare with stripe returned event...
# Store the PI in the description temporarily and overwrite when
transaction is sucessful.
db.donations.insert(user_id = session.user_id,
description=stripe_session.payment_intent,
amount=round(float(form.vars.amount),2))
# Now submit to Stripe for execution.
context = dict(public_key = '<your stripe public key here>',
stripe_session_id = stripe_session.id)
return response.render('donations/do_stripe_payment.html', context)
elif form.errors:
response.error = form.errors.amount
return dict(form = form)
@request.restful()
def my_stripe_webhook():
"""
On event, Stripe POSTs this json `webhook` via http.
We need to respond with simple 200-ok or it will attempt to resend
a few more times.
"""
import stripe
def POST(*args, **vars):
# Alternatively can take the `id` from the POST info and turn it
into a stripe object that can be used and queried.
# e.g. See https://stripe.com/docs/api/python#retrieve_event for
details of the object.
if request.vars.id == 'evt_00000000000000': # Test event from
Stripe - can't query it with api...silly as that seems.
log.warning("dummy Stripe event evt_00000000000000 received.
Not processing further.")
return "Ok, thanks. (dummy/test event received)."
else:
# Set the secret key.
stripe.api_key = 'stripe_key_secret'
# see: https://stripe.com/docs/api/events/object
event = stripe.Event.retrieve(request.vars.id)
log.info(f"Stripe event received. id: {event.id} type:
{event.type}")
if event.type == 'charge.succeeded':
# Check if donation.
rec = db(db.donations.description ==
event.data.object.payment_intent).select().first()
if rec:
log.info(f"Donation made by user: {rec.user_id}")
# Overwrite the PI code in the description with actual
action/message visible to user.
# This is final step and confirms money has been
received.
rec.update_record(description = "Funds received, thank
you!")
else:
log.error(f"Unknown payment received, see:
{event.data.object.payment_intent}")
elif event.type == 'charge.refunded':
# Refund processing here...
elif event.type == 'checkout.session.completed':
return "Ok, thanks"
else:
# process other possible other event types.
return "Thanks again"
return locals()
```
the view (donations/do_stripe_payment.html):
```
<div>Communicating with our payment processor, Stripe...</div>
<script src="https://js.stripe.com/v3/"></script>
<script>
var stripe = Stripe('{{=public_key}}');
stripe.redirectToCheckout({
sessionId: '{{=stripe_session_id}}'
}).then(function (result) {
// If `redirectToCheckout` fails due to a browser or network
// error, display the localized error message to your customer
// using `result.error.message`.
});
</script>
```
Hope that helps,
J
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/web2py/433c2863-a2a1-4b60-874c-3786b520b1b5n%40googlegroups.com.