ASP.NET Core MVC에서 Stripe 결제 서비스 뼈대 구축하기

  • 5 minutes to read

이 문서는 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. 실행 흐름 요약

  1. 사용자가 /StripePayments/Checkout 페이지를 엽니다.
  2. 결제 금액을 입력하고 “결제” 버튼을 누릅니다.
  3. 서버는 Checkout Session을 생성하고 Stripe 결제창 URL로 리디렉션합니다.
  4. 사용자는 Stripe 호스팅 UI에서 결제를 완료합니다.
  5. Stripe는 서버의 /StripePayments/Webhook 엔드포인트로 결과를 전달합니다.
  6. 결과에 따라 비즈니스 로직을 처리합니다.

마무리

이 문서에서 설명한 구조는 Stripe 결제를 도입하기 위한 최소한의 기본 뼈대입니다. 이 구조 위에 다음 기능을 손쉽게 확장할 수 있습니다.

  • Stripe Billing 정기결제(Subscriptions)
  • Customer Portal
  • Payment Intents 기반 카드 결제
  • Multi-tenant Stripe 구독 구조
  • Invoice 생성 및 자동 이메일 발송
더 깊이 공부하고 싶다면
DevLec에서는 실무 중심의 C#, .NET, ASP.NET Core, Blazor, 데이터 액세스 강좌를 단계별로 제공합니다. 현재 수강 가능한 강좌 외에도 더 많은 과정이 준비되어 있습니다.
DevLec.com에서 자세한 커리큘럼을 확인해 보세요.
DevLec 공식 강의
C# Programming
C# 프로그래밍 입문
프로그래밍을 처음 시작하는 입문자를 위한 C# 기본기 완성 과정입니다.
ASP.NET Core 10.0
ASP.NET Core 10.0 시작하기 MVC Fundamentals Part 1 MVC Fundamentals Part 2
웹 애플리케이션의 구조와 MVC 패턴을 ASP.NET Core로 실습하며 익힐 수 있습니다.
Blazor Server
풀스택 웹개발자 과정 Part 1 풀스택 웹개발자 과정 Part 2 풀스택 웹개발자 과정 Part 3
실무에서 바로 활용 가능한 Blazor Server 기반 관리자·포털 프로젝트를 만들어 봅니다.
Data & APIs
Entity Framework Core 시작하기 ADO.NET Fundamentals Blazor Server Fundamentals Minimal APIs
데이터 액세스와 Web API를 함께 이해하면 실무 .NET 백엔드 개발에 큰 도움이 됩니다.
VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com