From f9e340af887a81bd1b5f67fefd3e5505813cdaf1 Mon Sep 17 00:00:00 2001 From: rizwanisready Date: Tue, 5 Mar 2024 12:54:29 +0530 Subject: [PATCH] corrected stripe sig header --- goodtimes/services.py | 39 +++++++++++++++++++++++++++++-- manage_referrals/models.py | 2 +- manage_subscriptions/api/views.py | 6 ++--- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/goodtimes/services.py b/goodtimes/services.py index 344be5a..480dda5 100644 --- a/goodtimes/services.py +++ b/goodtimes/services.py @@ -7,7 +7,7 @@ from django.template.loader import render_to_string from django.shortcuts import get_object_or_404 from smtplib import SMTPException from accounts.models import IAmPrincipal, IAmPrincipalOtp, IAmPrincipalType -from manage_referrals.models import GoodTimeCoins +from manage_referrals.models import GoodTimeCoins, ReferralRecord from manage_subscriptions.models import PrincipalSubscription, Subscription from manage_wallets.models import TransactionStatus, Wallet, Transaction from goodtimes.utils import CapacityError, RandomGenerator @@ -191,6 +191,7 @@ class PaymentProcessingService: self.charge_data = webhook_data["data"]["object"] self.customer_id = self._get_customer_id() self.transaction = self._get_transaction_by_id() + self.principal_id = self.transaction.principal_id def _get_customer_id(self): # Access the customer ID from the charge object @@ -219,6 +220,38 @@ class PaymentProcessingService: self._create_principal_subscription() self._update_wallet() self._update_transaction_success() + self._credit_referral_reward_if_applicable() + + def _credit_referral_reward_if_applicable(self): + # Step 1: Check for an existing, completed referral record + referral_record = ReferralRecord.objects.filter( + referred_principal_id=self.principal_id, is_completed=True + ).first() + + if referral_record: + # Step 2: Check for an active subscription of the referrer + today = timezone.now().date() + active_subscription = ( + PrincipalSubscription.objects.filter( + principal=referral_record.referrer_principal, + end_date__gte=today, + cancelled=False, + ) + .order_by("-end_date") + .first() + ) + + if active_subscription: + # Step 3: Credit Good Time Coin + # Assume a method exists to credit the coin, adjust as needed + self._credit_good_time_coin(referral_record.referrer_principal) + + def _credit_good_time_coin(self, referrer_principal): + # Assuming functionality to credit coin exists, implement or call here. + # This could involve updating a wallet model, creating a transaction, etc. + print( + f"Crediting a Good Time Coin to {referrer_principal}'s wallet" + ) # Placeholder def _handle_failure(self): # Implement any necessary logic to handle a failed payment @@ -254,7 +287,9 @@ class PaymentProcessingService: .value_in_pound ) - wallet, created = Wallet.objects.get_or_create(principal=self.transaction.principal) + wallet, created = Wallet.objects.get_or_create( + principal=self.transaction.principal + ) wallet.coins += 1 wallet.save() diff --git a/manage_referrals/models.py b/manage_referrals/models.py index 92224d1..f421b2a 100644 --- a/manage_referrals/models.py +++ b/manage_referrals/models.py @@ -136,7 +136,7 @@ class ReferralRecordReward(BaseModel): subscription = models.ForeignKey( Subscription, on_delete=models.CASCADE, related_name="subscription_reward" ) - coins = models.PositiveBigIntegerField() + coins = models.PositiveBigIntegerField(default=1) value = models.DecimalField(max_digits=14, decimal_places=2) class Meta: diff --git a/manage_subscriptions/api/views.py b/manage_subscriptions/api/views.py index e465227..1bab6ba 100644 --- a/manage_subscriptions/api/views.py +++ b/manage_subscriptions/api/views.py @@ -165,11 +165,11 @@ class StripeWebhookTest(APIView): def post(self, request): stripe.api_key = settings.STRIPE_SECRET_KEY payload = request.body - sig_header = request.META.get("HTTP_STRIPE_SIGNATURE") + sig_header = request.META["HTTP_STRIPE_SIGNATURE"] endpoint_secret = "whsec_ccf1f87295603cdd1733995ee2d3c0d6f74c7ceaf28916ea45114a54b7ce1d0f" # Make sure to retrieve this from your settings - + event = None try: - event = stripe.Webhook.construct_event(payload, sig_header, endpoint_secret) + event = stripe.Event.construct_from(json.loads(payload), stripe.api_key) except ValueError as e: # Invalid payload return ApiResponse.error(