Beispiel #1
0
    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']
Beispiel #2
0
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)