ASP.NET Core MVC에서 Stripe 결제 서비스 뼈대 구축하기
이 문서는 ASP.NET Core MVC 프로젝트에서 **Stripe 결제 기능을 사용하기 위한 최소한의 기본 구조(뼈대)**를 구축하는 방법을 단계별로 안내합니다. 정기결제(Billing), 카드 결제, Checkout Sessions 등 다양한 Stripe 기능의 기초가 되는 구조입니다.
1. appsettings.json에 Stripe 설정 추가
프로젝트의 설정 파일인 appsettings.json에 Stripe 설정 섹션을 추가합니다.
{
"Stripe": {
"SecretKey": "your-secret-key",
"PublishableKey": "your-publishable-key",
"WebhookSecret": "your-webhook-secret"
}
}
설명.
- SecretKey. 서버에서 API 호출 시 사용.
- PublishableKey. 클라이언트에서 카드 UI를 초기화할 때 사용.
- WebhookSecret. Stripe → 서버로 결과 통지 시 검증용.
운영 환경에서는 SecretKey가 sk_live_... 형태로 바뀝니다.
2. Stripe 옵션 클래스 생성 (StripeOptions.cs)
설정 파일의 "Stripe" 섹션을 Strongly Typed 객체로 바인딩하기 위해
다음 옵션 클래스를 생성합니다.
namespace Azunt.Web.Payments.Stripe
{
public class StripeOptions
{
public string SecretKey { get; set; } = string.Empty;
public string PublishableKey { get; set; } = string.Empty;
public string WebhookSecret { get; set; } = string.Empty;
}
}
3. 서비스 인터페이스 추가 (IStripeService.cs)
Stripe 기능을 추상화하기 위한 인터페이스를 생성합니다.
using System.Threading.Tasks;
namespace Azunt.Web.Payments.Stripe
{
public interface IStripeService
{
Task<string> CreateCheckoutSessionAsync(
decimal amount,
string currency,
string successUrl,
string cancelUrl);
Task<object?> HandleWebhookAsync(string json, string stripeSignatureHeader);
}
}
설명.
CreateCheckoutSessionAsync. Stripe Hosted UI 기반 결제(Checkout Sessions)를 생성합니다.HandleWebhookAsync. Stripe가 서버로 보내는 Webhook 이벤트를 처리합니다.
필요한 기능만 골라 사용해도 되며, 나중에 Billing API 등으로 확장할 수 있습니다.
4. Stripe 서비스 구현 (StripeService.cs)
SDK와 통신하는 구현 클래스를 생성합니다.
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using Stripe;
namespace Azunt.Web.Payments.Stripe
{
public class StripeService : IStripeService
{
private readonly StripeOptions _options;
public StripeService(IOptions<StripeOptions> options)
{
_options = options.Value;
StripeConfiguration.ApiKey = _options.SecretKey;
}
public async Task<string> CreateCheckoutSessionAsync(
decimal amount,
string currency,
string successUrl,
string cancelUrl)
{
var service = new SessionService();
var sessionOptions = new SessionCreateOptions
{
Mode = "payment",
SuccessUrl = successUrl,
CancelUrl = cancelUrl,
LineItems = new List<SessionLineItemOptions>
{
new SessionLineItemOptions
{
Quantity = 1,
PriceData = new SessionLineItemPriceDataOptions
{
UnitAmountDecimal = amount * 100, // Stripe는 센트 단위 사용
Currency = currency,
ProductData = new SessionLineItemPriceDataProductDataOptions
{
Name = "Sample Product"
}
}
}
}
};
var session = await service.CreateAsync(sessionOptions);
return session.Url; // Redirect URL 반환
}
public Task<object?> HandleWebhookAsync(string json, string stripeSignatureHeader)
{
var stripeEvent = EventUtility.ConstructEvent(
json,
stripeSignatureHeader,
_options.WebhookSecret
);
// TODO. stripeEvent.Type에 따라 비즈니스 로직 처리
return Task.FromResult<object?>(stripeEvent);
}
}
}
설명.
- Stripe는 금액을 센트 단위로 받기 때문에
amount * 100처리를 합니다. - Checkout Session을 생성하면 Stripe 호스팅 결제창 URL을 반환합니다.
- Webhook은 Stripe → 서버로 결제 결과를 보내는 구조입니다.
5. Program.cs에서 서비스 등록
DI 컨테이너에 Stripe 서비스를 등록합니다.
using Azunt.Web.Payments.Stripe;
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<StripeOptions>(
builder.Configuration.GetSection("Stripe"));
builder.Services.AddScoped<IStripeService, StripeService>();
builder.Services.AddControllersWithViews();
var app = builder.Build();
app.MapDefaultControllerRoute();
app.Run();
6. Stripe 전용 컨트롤러 생성 (StripePaymentsController.cs)
Stripe 연동을 담당하는 컨트롤러를 생성합니다.
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Azunt.Web.Payments.Stripe;
namespace Azunt.Web.Controllers
{
public class StripePaymentsController : Controller
{
private readonly IStripeService _stripeService;
public StripePaymentsController(IStripeService stripeService)
{
_stripeService = stripeService;
}
public IActionResult Checkout()
{
return View();
}
[HttpPost]
public async Task<IActionResult> CreateSession(decimal amount)
{
var url = await _stripeService.CreateCheckoutSessionAsync(
amount,
"usd",
successUrl: Url.Action("Success", "StripePayments", null, Request.Scheme),
cancelUrl: Url.Action("Cancel", "StripePayments", null, Request.Scheme));
return Redirect(url);
}
public IActionResult Success()
{
return View();
}
public IActionResult Cancel()
{
return View();
}
[HttpPost]
public async Task<IActionResult> Webhook()
{
var json = await new StreamReader(HttpContext.Request.Body).ReadToEndAsync();
var signature = Request.Headers["Stripe-Signature"];
var result = await _stripeService.HandleWebhookAsync(json, signature);
return Ok();
}
}
}
이 컨트롤러는 다음 기능을 포함합니다.
- Checkout Session 생성
- Stripe 결제창으로 리디렉션
- 성공/취소 페이지 처리
- Webhook 엔드포인트 처리
7. 실행 흐름 요약
- 사용자가
/StripePayments/Checkout페이지를 엽니다. - 결제 금액을 입력하고 “결제” 버튼을 누릅니다.
- 서버는 Checkout Session을 생성하고 Stripe 결제창 URL로 리디렉션합니다.
- 사용자는 Stripe 호스팅 UI에서 결제를 완료합니다.
- Stripe는 서버의
/StripePayments/Webhook엔드포인트로 결과를 전달합니다. - 결과에 따라 비즈니스 로직을 처리합니다.
마무리
이 문서에서 설명한 구조는 Stripe 결제를 도입하기 위한 최소한의 기본 뼈대입니다. 이 구조 위에 다음 기능을 손쉽게 확장할 수 있습니다.
- Stripe Billing 정기결제(Subscriptions)
- Customer Portal
- Payment Intents 기반 카드 결제
- Multi-tenant Stripe 구독 구조
- Invoice 생성 및 자동 이메일 발송
추천 자료: ASP.NET Core 인증 및 권한 부여
추천 자료: .NET Blazor에 대해 알아보시겠어요? .NET Blazor 알아보기를 확인해보세요!