import json from datetime import datetime from django.http import HttpResponse, Http404 from django.shortcuts import get_object_or_404 import stripe # Create your views here. from django.utils import timezone from django.views import View from BaseBillet.models import Configuration from PaiementStripe.models import Paiement_stripe from QrcodeCashless.views import postPaimentRecharge import logging logger = logging.getLogger(__name__) class retour_stripe(View): def get(self, request, uuid_stripe): paiement_stripe = get_object_or_404(Paiement_stripe, uuid=uuid_stripe) configuration = Configuration.get_solo() if configuration.stripe_mode_test: stripe.api_key = configuration.stripe_test_api_key else: stripe.api_key = configuration.stripe_api_key if paiement_stripe.status != Paiement_stripe.VALID : checkout_session = stripe.checkout.Session.retrieve(paiement_stripe.id_stripe) if checkout_session.payment_status == "unpaid": paiement_stripe.status = Paiement_stripe.PENDING if checkout_session.expires_at > datetime.now().timestamp() : paiement_stripe.status = Paiement_stripe.EXPIRE elif checkout_session.payment_status == "paid": paiement_stripe.status = Paiement_stripe.PAID # on vérifie si les infos sont cohérente avec la db : Never Trust Input :) metadata_stripe_json = checkout_session.metadata metadata_stripe = json.loads(str(metadata_stripe_json)) metadata_db_json = paiement_stripe.metadata_stripe metadata_db = json.loads(metadata_db_json) try: assert metadata_stripe == metadata_db assert set(metadata_db.keys()) == set(metadata_stripe.keys()) for key in set(metadata_stripe.keys()) : assert metadata_db[key] == metadata_stripe[key] except: logger.error(f"{timezone.now()} " f"retour_stripe {uuid_stripe} : " f"metadata ne correspondent pas : {metadata_stripe} {metadata_db}") raise Http404 # on check si il y a un rechargement de carte cashless dans la commande if metadata_db.get('recharge_carte_uuid') : return postPaimentRecharge(paiement_stripe, request) else: paiement_stripe.status = Paiement_stripe.CANCELED return HttpResponse(f'Le paiement a été annulé.') paiement_stripe.save() return HttpResponse(f'ok {uuid_stripe}') class webhook_stripe(View): def get(self, request): print(f"webhook_stripe GET") return HttpResponse(f'ok') def post(self, request): endpoint_secret = 'whsec_1Urn98yUMsgwdXA7vhN5dwDTRQLD2vmD' event = None payload = request.data sig_header = request.headers['STRIPE_SIGNATURE'] try: event = stripe.Webhook.construct_event( payload, sig_header, endpoint_secret ) except ValueError as e: # Invalid payload raise e except stripe.error.SignatureVerificationError as e: # Invalid signature raise e # Handle the event print('Unhandled event type {}'.format(event['type'])) print(f"webhook_stripe POST {event}") return HttpResponse(f'ok {event}')