import logging from typing import Dict, Callable from management.packages import sync_subscription from management.subscriptions import construct_stripe_event, stripe_subscription, stripe_update_payment_billing log = logging.getLogger() log.setLevel(logging.INFO) stripe_event_handlers: Dict[str, Callable] = {} def lambda_handler(event, context): log.info(f"{event}") if 'httpMethod' in event and event['httpMethod'] == 'POST' and \ 'requestContext' in event and 'path' in event['requestContext'] and \ event['requestContext']['path'].startswith('/stripehook'): try: payload = event['body'] sig_header = event['headers']['Stripe-Signature'] stripe_event = construct_stripe_event(payload, sig_header) log.info(f"Stripe Event: {stripe_event.type} [{stripe_event.data.object}]") if stripe_event.type in stripe_event_handlers: stripe_event_handlers[stripe_event.type](stripe_event.data.object) return { 'statusCode': 200, 'body': 'OK' } except Exception as e: log.exception("Weird parameters?!", exc_info=e) return { 'statusCode': 400, 'body': 'Bad Request' } # TODO implement return { 'statusCode': 405, 'body': 'Bad Request' } def stripe_invoice_paid(stripe_event): """ recurring payment failed: status == 'past_due' and latest_invoice. :param stripe_event: :return: """ # date_start = datetime.datetime.fromtimestamp(stripe_event['lines']['data'][0]['period']['start']) # date_end = datetime.datetime.fromtimestamp(stripe_event['lines']['data'][0]['period']['end']) # stripe_customer_id = stripe_event['customer'] # price_id = stripe_event['lines']['data'][0]['price']['id'] subscription_id = stripe_event['lines']['data'][0]['subscription'] paid = stripe_event['paid'] if paid: sync_subscription(stripe_subscription(subscription_id), send_email=True) stripe_event_handlers['invoice.paid'] = stripe_invoice_paid def stripe_setup_intent_succeeded(stripe_event): """ If setup intent succeeds, assign new default payment. :param stripe_event: :return: """ customer_id = stripe_event['customer'] status = stripe_event['status'] if status == 'succeeded': payment_method_id = stripe_event['payment_method'] stripe_update_payment_billing(customer_id, payment_method_id) stripe_event_handlers['setup_intent.succeeded'] = stripe_setup_intent_succeeded