def stripe_webhook_handler(self): if not cherrypy.request or not cherrypy.request.body: cherrypy.response.status = 400 return "Request required" sig_header = cherrypy.request.headers.get('Stripe-Signature', '') payload = cherrypy.request.body.read() event = None try: event = stripe.Webhook.construct_event(payload, sig_header, c.STRIPE_ENDPOINT_SECRET) except ValueError as e: cherrypy.response.status = 400 return "Invalid payload: " + payload except stripe.error.SignatureVerificationError as e: cherrypy.response.status = 400 return "Invalid signature: " + sig_header if not event: cherrypy.response.status = 400 return "No event" if event and event['type'] == 'payment_intent.succeeded': payment_intent = event['data']['object'] matching_txns = Charge.mark_paid_from_stripe_id( payment_intent['id']) if not matching_txns: cherrypy.response.status = 400 return "No matching Stripe transaction" cherrypy.response.status = 200 return "Payment marked complete for payment intent ID " + payment_intent[ 'id']
def check_missed_stripe_payments(): pending_ids = [] with Session() as session: pending_payments = session.query(StripeTransaction).filter_by( type=c.PENDING) for payment in pending_payments: pending_ids.append(payment.stripe_id) events = stripe.Event.list( type='payment_intent.succeeded', created={ # Check for events created in the last hour. 'gte': int(time.time() - 60 * 60), }) for event in events.auto_paging_iter(): payment_intent = event.data.object log.debug('Processing Payment Intent ID {}', payment_intent.id) if payment_intent.id in pending_ids: log.debug('Charge is pending, intent ID is {}', payment_intent.id) Charge.mark_paid_from_stripe_id(payment_intent.id)