import logging import stripe from flask import request, current_app from flask_restful import Resource from controllers.console import api from controllers.console.setup import setup_required from controllers.console.wraps import only_edition_cloud from services.provider_checkout_service import ProviderCheckoutService class StripeWebhookApi(Resource): @setup_required @only_edition_cloud def post(self): payload = request.data sig_header = request.headers.get('STRIPE_SIGNATURE') webhook_secret = current_app.config.get('STRIPE_WEBHOOK_SECRET') try: event = stripe.Webhook.construct_event( payload, sig_header, webhook_secret ) except ValueError as e: # Invalid payload return 'Invalid payload', 400 except stripe.error.SignatureVerificationError as e: # Invalid signature return 'Invalid signature', 400 # Handle the checkout.session.completed event if event['type'] == 'checkout.session.completed': logging.debug(event['data']['object']['id']) logging.debug(event['data']['object']['amount_subtotal']) logging.debug(event['data']['object']['currency']) logging.debug(event['data']['object']['payment_intent']) logging.debug(event['data']['object']['payment_status']) logging.debug(event['data']['object']['metadata']) session = stripe.checkout.Session.retrieve( event['data']['object']['id'], expand=['line_items'], ) logging.debug(session.line_items['data'][0]['quantity']) # Fulfill the purchase... provider_checkout_service = ProviderCheckoutService() try: provider_checkout_service.fulfill_provider_order(event, session.line_items) except Exception as e: logging.debug(str(e)) return 'success', 200 return 'success', 200 api.add_resource(StripeWebhookApi, '/webhook/stripe')