using System.Threading.Tasks;
using ManagerService.Data;
using ManagerService.Helpers;
using Microsoft.Extensions.Options;
using Stripe;
using Stripe.Checkout;
namespace ManagerService.Services
{
///
/// Stripe integration for the Essentiel plan self-service subscription (customer creation,
/// Checkout Session, webhook signature verification). Stripe Checkout is hosted by Stripe —
/// no card form is built in any of our own apps.
///
public class StripeService
{
private readonly StripeSettings _settings;
private readonly CustomerService _customerService;
private readonly SessionService _checkoutSessionService;
public StripeService(IOptions settings)
{
_settings = settings.Value;
StripeConfiguration.ApiKey = _settings.SecretKey;
_customerService = new CustomerService();
_checkoutSessionService = new SessionService();
}
public async Task CreateCustomerAsync(Instance instance)
{
var customer = await _customerService.CreateAsync(new CustomerCreateOptions
{
Name = instance.Name,
Metadata = new System.Collections.Generic.Dictionary
{
{ "instanceId", instance.Id },
},
});
return customer.Id;
}
///
/// Create a Stripe Checkout Session for the Essentiel plan subscription.
/// Stripe Tax is applied automatically based on the customer's billing details.
///
public async Task CreateCheckoutSessionAsync(Instance instance, string successUrl, string cancelUrl)
{
var options = new SessionCreateOptions
{
Mode = "subscription",
Customer = instance.StripeCustomerId,
LineItems = new System.Collections.Generic.List
{
new SessionLineItemOptions
{
Price = _settings.EssentielPriceId,
Quantity = 1,
},
},
AutomaticTax = new SessionAutomaticTaxOptions { Enabled = true },
SuccessUrl = successUrl,
CancelUrl = cancelUrl,
Metadata = new System.Collections.Generic.Dictionary
{
{ "instanceId", instance.Id },
},
};
var session = await _checkoutSessionService.CreateAsync(options);
return session.Url;
}
public Event ConstructWebhookEvent(string json, string stripeSignatureHeader)
{
return EventUtility.ConstructEvent(json, stripeSignatureHeader, _settings.WebhookSecret);
}
}
}