ASP.NET Core MVC에서 Braintree 결제 서비스 뼈대 구축하기
이 문서는 ASP.NET Core MVC 프로젝트에서 **Braintree 결제 기능을 사용하기 위한 최소한의 기본 구조(뼈대)**를 구축하는 방법을 단계별로 안내합니다. 아직 Braintree를 실제로 사용하지 않더라도, 아래 구성은 이후 쉽게 확장 가능한 표준 패턴을 기반으로 작성되었습니다.
1. appsettings.json에 Braintree 설정 추가
프로젝트의 설정 파일인 appsettings.json에 다음과 같이 Braintree 설정 섹션을 추가합니다.
{
"Braintree": {
"Environment": "sandbox",
"MerchantId": "your-merchant-id",
"PublicKey": "your-public-key",
"PrivateKey": "your-private-key",
"ClientSideEncryptionKey": "your-client-side-encryption-key"
}
}
운영 환경에서는 "Environment": "production"으로 변경합니다.
2. Braintree 옵션 클래스 추가 (BraintreeOptions.cs)
설정 파일의 "Braintree" 섹션을 Strongly Typed 객체로 바인딩하기 위해
다음 옵션 클래스를 /Payments/Braintree/ 폴더에 생성합니다.
namespace Azunt.Web.Payments.Braintree
{
public class BraintreeOptions
{
public string Environment { get; set; } = "sandbox";
public string MerchantId { get; set; } = string.Empty;
public string PublicKey { get; set; } = string.Empty;
public string PrivateKey { get; set; } = string.Empty;
public string? ClientSideEncryptionKey { get; set; }
}
}
3. 서비스 인터페이스 추가 (IBraintreeService.cs)
Braintree 관련 기능을 추상화하기 위해 다음 인터페이스를 생성합니다.
using System.Threading.Tasks;
namespace Azunt.Web.Payments.Braintree
{
public interface IBraintreeService
{
Task<string> GenerateClientTokenAsync();
Task<object?> CreateTransactionAsync(
decimal amount,
string paymentMethodNonce,
string? orderId = null);
}
}
이 구조는 나중에 Stripe, PayPal 등 다른 PG를 추가할 때도 확장성을 높여줍니다.
4. Braintree 서비스 구현 (BraintreeService.cs)
실제 SDK와 통신하는 구현 클래스를 추가합니다.
using System.Threading.Tasks;
using Braintree;
using Microsoft.Extensions.Options;
namespace Azunt.Web.Payments.Braintree
{
public class BraintreeService : IBraintreeService
{
private readonly BraintreeGateway _gateway;
public BraintreeService(IOptions<BraintreeOptions> options)
{
var opt = options.Value;
var environment = opt.Environment?.ToLowerInvariant() switch
{
"production" => Braintree.Environment.PRODUCTION,
_ => Braintree.Environment.SANDBOX
};
_gateway = new BraintreeGateway(
environment,
opt.MerchantId,
opt.PublicKey,
opt.PrivateKey);
}
public Task<string> GenerateClientTokenAsync()
{
return _gateway.ClientToken.GenerateAsync();
}
public async Task<object?> CreateTransactionAsync(
decimal amount,
string paymentMethodNonce,
string? orderId = null)
{
var request = new TransactionRequest
{
Amount = amount,
PaymentMethodNonce = paymentMethodNonce,
OrderId = orderId,
Options = new TransactionOptionsRequest
{
SubmitForSettlement = true
}
};
var result = await _gateway.Transaction.SaleAsync(request);
return result;
}
}
}
Client Token 생성과 결제 트랜잭션 생성은 이 서비스가 담당합니다.
5. Program.cs에서 서비스 등록
다음 코드를 Program.cs에 추가하여 DI 컨테이너에 등록합니다.
using Azunt.Web.Payments.Braintree;
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<BraintreeOptions>(
builder.Configuration.GetSection("Braintree"));
builder.Services.AddScoped<IBraintreeService, BraintreeService>();
builder.Services.AddControllersWithViews();
var app = builder.Build();
app.MapDefaultControllerRoute();
app.Run();
이제 프로젝트 전역에서 IBraintreeService를 주입 받아 사용할 수 있습니다.
6. Braintree 전용 컨트롤러 생성 (BraintreePaymentsController.cs)
Braintree 연동을 담당하는 전용 컨트롤러를 생성합니다.
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Azunt.Web.Payments.Braintree;
namespace Azunt.Web.Controllers
{
public class BraintreePaymentsController : Controller
{
private readonly IBraintreeService _braintreeService;
public BraintreePaymentsController(IBraintreeService braintreeService)
{
_braintreeService = braintreeService;
}
public async Task<IActionResult> Checkout()
{
var clientToken = await _braintreeService.GenerateClientTokenAsync();
ViewBag.ClientToken = clientToken;
return View();
}
[HttpPost]
public async Task<IActionResult> Checkout(string paymentMethodNonce, decimal amount)
{
var result = await _braintreeService.CreateTransactionAsync(amount, paymentMethodNonce);
return View("Result", result);
}
}
}
이 컨트롤러는 다음 기능을 포함합니다.
- Client Token 생성
- 결제 요청 처리
7. 실행 흐름 요약
- 브라우저가
/BraintreePayments/Checkout을 요청합니다. - 서버는 Braintree로부터 Client Token을 받아 뷰로 전달합니다.
- 결제 UI가 Token을 이용하여
paymentMethodNonce를 생성합니다. - 서버는 POST 요청을 받아 결제 트랜잭션을 생성합니다.
- 결과를 화면에 표시합니다.
마무리
이 문서에서 설명한 내용은 Braintree 결제 기능을 도입하기 위한 가장 기본적인 뼈대 구조입니다. 이 구조를 기반으로 다음 기능을 쉽게 확장할 수 있습니다.
- Drop-In UI 추가
- Subscription Billing
- 웹훅(Webhook) 처리
- Multi-tenant 환경에서 PG 동적 선택 기능