Exemple #1
0
 public PaymentProviderEvent SaveEvent(PaymentProviderEvent providerEvent)
 {
     return(null);
 }
 public async Task <PaymentProviderEvent> SaveEventAsync(PaymentProviderEvent providerEvent,
                                                         CancellationToken cancellationToken = default(CancellationToken))
 {
     return(null);
 }
Exemple #3
0
        public async Task <IActionResult> Index()
        {
            Event stripeEvent = null;
            PaymentProviderEvent providerEvent = null;

            try
            {
                string json = await new StreamReader(HttpContext.Request.Body).ReadToEndAsync();
                stripeEvent = EventUtility.ConstructEvent(json, Request.Headers["Stripe-Signature"], PaymentProviderConfig.TestWebhookSigningKey, 300L, false);

                providerEvent = new PaymentProviderEvent();
                providerEvent.ProviderType = (int)PaymentMethods.Stripe;
                providerEvent.RecievedOn   = DateTime.UtcNow;
                providerEvent.Data         = JsonConvert.SerializeObject(stripeEvent);
                providerEvent.Processed    = false;
                providerEvent.CustomerId   = "SYSTEM";
            }
            catch (Exception ex)
            {
                Logging.LogException(ex);
                return(BadRequest());
            }

            if (stripeEvent == null)
            {
                return(BadRequest());
            }

            try
            {
                switch (stripeEvent.Type)
                {
                case "charge.succeeded":
                    var succeededCharge = JsonConvert.DeserializeObject <Charge>(stripeEvent.Data.RawObject.ToString());
                    providerEvent.CustomerId = succeededCharge.CustomerId;
                    providerEvent.Processed  = true;
                    providerEvent.Type       = typeof(Charge).FullName;

                    CqrsEvent stripeChargeSucceededEvent = new CqrsEvent();
                    stripeChargeSucceededEvent.Type = (int)CqrsEventTypes.StripeChargeSucceeded;
                    stripeChargeSucceededEvent.Data = stripeEvent.Data.RawObject.ToString();

#if !DEBUG
                    await _cqrsProvider.EnqueuePaymentEventAsync(stripeChargeSucceededEvent);
#else
                    await _paymentProviderService.ProcessStripePaymentAsync(succeededCharge);
#endif
                    break;

                case "charge.failed":
                    var failedCharge = JsonConvert.DeserializeObject <Charge>(stripeEvent.Data.RawObject.ToString());
                    providerEvent.CustomerId = failedCharge.CustomerId;
                    providerEvent.Type       = typeof(Charge).FullName;

                    CqrsEvent stripeChargeFailedEvent = new CqrsEvent();
                    stripeChargeFailedEvent.Type = (int)CqrsEventTypes.StripeChargeFailed;
                    stripeChargeFailedEvent.Data = stripeEvent.Data.RawObject.ToString();

#if !DEBUG
                    await _cqrsProvider.EnqueuePaymentEventAsync(stripeChargeFailedEvent);
#else
                    await _paymentProviderService.ProcessStripeChargeFailedAsync(failedCharge);
#endif
                    break;

                case "charge.refunded":
                    var refundedCharge = JsonConvert.DeserializeObject <Charge>(stripeEvent.Data.RawObject.ToString());
                    providerEvent.CustomerId = refundedCharge.CustomerId;
                    providerEvent.Type       = typeof(Charge).FullName;

                    CqrsEvent stripeChargeRefundedEvent = new CqrsEvent();
                    stripeChargeRefundedEvent.Type = (int)CqrsEventTypes.StripeChargeRefunded;
                    stripeChargeRefundedEvent.Data = stripeEvent.Data.RawObject.ToString();

#if !DEBUG
                    await _cqrsProvider.EnqueuePaymentEventAsync(stripeChargeRefundedEvent);
#else
                    await _paymentProviderService.ProcessStripeSubscriptionRefundAsync(refundedCharge);
#endif
                    break;

                case "customer.subscription.updated":
                    var updatedSubscription = JsonConvert.DeserializeObject <Subscription>(stripeEvent.Data.RawObject.ToString());
                    providerEvent.CustomerId = updatedSubscription.CustomerId;
                    providerEvent.Processed  = true;
                    providerEvent.Type       = typeof(Subscription).FullName;

                    CqrsEvent stripeSubUpdatedEvent = new CqrsEvent();
                    stripeSubUpdatedEvent.Type = (int)CqrsEventTypes.StripeSubUpdated;
                    stripeSubUpdatedEvent.Data = stripeEvent.Data.RawObject.ToString();

#if !DEBUG
                    await _cqrsProvider.EnqueuePaymentEventAsync(stripeSubUpdatedEvent);
#else
                    await _paymentProviderService.ProcessStripeSubscriptionUpdateAsync(updatedSubscription);
#endif
                    break;

                case "customer.subscription.deleted":
                    var deletedSubscription = JsonConvert.DeserializeObject <Subscription>(stripeEvent.Data.RawObject.ToString());
                    providerEvent.CustomerId = deletedSubscription.CustomerId;
                    providerEvent.Processed  = true;
                    providerEvent.Type       = typeof(Subscription).FullName;

                    CqrsEvent stripeSubDeletedEvent = new CqrsEvent();
                    stripeSubDeletedEvent.Type = (int)CqrsEventTypes.StripeSubDeleted;
                    stripeSubDeletedEvent.Data = stripeEvent.Data.RawObject.ToString();

#if !DEBUG
                    await _cqrsProvider.EnqueuePaymentEventAsync(stripeSubDeletedEvent);
#else
                    await _paymentProviderService.ProcessStripeSubscriptionCancellationAsync(deletedSubscription);
#endif

                    break;

                case "customer.subscription.created":
                    var createdSubscription = JsonConvert.DeserializeObject <Subscription>(stripeEvent.Data.RawObject.ToString());
                    providerEvent.CustomerId = createdSubscription.CustomerId;
                    providerEvent.Type       = typeof(Subscription).FullName;
                    break;

                case "checkout.session.completed":
                    var session = JsonConvert.DeserializeObject <Session>(stripeEvent.Data.RawObject.ToString());
                    providerEvent.CustomerId = session.CustomerId;
                    providerEvent.Processed  = true;
                    providerEvent.Type       = typeof(Session).FullName;

                    CqrsEvent stripeSessionCompletedEvent = new CqrsEvent();
                    stripeSessionCompletedEvent.Type = (int)CqrsEventTypes.StripeCheckoutCompleted;
                    stripeSessionCompletedEvent.Data = stripeEvent.Data.RawObject.ToString();

                    if (!String.IsNullOrWhiteSpace(session.Mode) && session.Mode.ToLower() == "setup")
                    {
                        var service     = new SetupIntentService();
                        var setupIntent = service.Get(session.SetupIntentId);
                        providerEvent.CustomerId = setupIntent.Metadata["customer_id"];

                        stripeSessionCompletedEvent.Type = (int)CqrsEventTypes.StripeCheckoutUpdated;
#if !DEBUG
                        await _cqrsProvider.EnqueuePaymentEventAsync(stripeSessionCompletedEvent);
#else
                        await _paymentProviderService.ProcessStripeCheckoutUpdateAsync(session);
#endif
                    }
                    break;
                }
            }
            catch (Exception ex)
            {
                Logging.LogException(ex);
                Logging.SendExceptionEmail(ex, "StripeHandler");
                return(BadRequest());
            }
            finally
            {
                await _paymentProviderService.SaveEventAsync(providerEvent);
            }

            return(Ok());
        }