/// <summary> /// Cancel subscription from Stripe /// </summary> /// <param name="subscriptionId">Stripe subscription Id</param> /// <param name="user">Application user</param> /// <param name="cancelAtPeriodEnd">Cancel immediately or when the paid period ends (default immediately)</param> /// <param name="reasonToCancel">The reason to cancel.</param> /// <returns>The Date when the subscription ends (it can be future if cancelAtPeriodEnd is true)</returns> public async Task <DateTime?> EndSubscriptionAsync(int subscriptionId, SaasEcomUser user, bool cancelAtPeriodEnd = false, string reasonToCancel = null) { DateTime?subscriptionEnd = null; try { var subscription = await _subscriptionDataService.UserActiveSubscriptionAsync(user.Id); if (subscription != null && subscription.Id == subscriptionId) { subscriptionEnd = _subscriptionProvider.EndSubscription(user.StripeCustomerId, subscription.StripeId, cancelAtPeriodEnd); await _subscriptionDataService.EndSubscriptionAsync(subscriptionId, subscriptionEnd.Value, reasonToCancel); } } catch (Exception) { // TODO: Log subscriptionEnd = null; } return(subscriptionEnd); }