결제 API 추가하기
결제 API 추가하기
이제 결제 API를 만들어 보겠습니다. 이 API는 Stripe 토큰과 사용자가 저장하려는 노트의 개수를 받습니다.
결제 Lambda 추가하기
먼저 Stripe NPM 패키지를 설치합니다. 프로젝트 루트에서 다음 명령어를 실행하세요.
$ npm install --save stripe
billing.js
라는 새 파일을 만들고 다음 코드를 추가합니다.
import stripePackage from "stripe";
import handler from "./libs/handler-lib";
import { calculateCost } from "./libs/billing-lib";
export const main = handler(async (event, context) => {
const { storage, source } = JSON.parse(event.body);
const amount = calculateCost(storage);
const description = "Scratch charge";
// 환경 변수에서 시크릿 키를 불러옵니다.
const stripe = stripePackage(process.env.stripeSecretKey);
await stripe.charges.create({
source,
amount,
description,
currency: "usd",
});
return { status: true };
});
대부분의 코드는 직관적이지만, 간단히 살펴보겠습니다:
-
요청 본문에서
storage
와source
를 가져옵니다.storage
는 사용자가 계정에 저장하려는 노트의 수이고,source
는 결제할 카드의 Stripe 토큰입니다. -
calculateCost(storage)
함수를 사용하여 저장할 노트 수에 따라 사용자에게 청구할 금액을 계산합니다. 이 함수는 곧 추가할 예정입니다. -
Stripe 시크릿 키를 사용해 새로운 Stripe 객체를 생성합니다. 이 키는 환경 변수로 가져옵니다. 시크릿 키를 코드에 직접 넣고 Git에 커밋하는 것은 보안 문제가 있기 때문입니다.
-
마지막으로
stripe.charges.create
메서드를 사용해 사용자에게 결제를 요청하고, 모든 과정이 성공적으로 완료되면 요청에 응답합니다.
참고로, 인도에서 테스트하는 경우 배송 정보도 추가해야 합니다. 포럼의 세부 내용을 확인하세요.
비즈니스 로직 추가하기
이제 calculateCost
메서드를 구현해 보겠습니다. 이 부분이 주로 비즈니스 로직에 해당합니다.
libs/billing-lib.js
파일을 생성하고 다음 코드를 추가합니다.
export function calculateCost(storage) {
const rate = storage <= 10
? 4
: storage <= 100
? 2
: 1;
return rate * storage * 100;
}
이 코드는 사용자가 10개 이하의 노트를 저장하려면 노트당 $4를 청구하고, 11개에서 100개 사이의 노트는 노트당 $2, 100개를 초과하면 노트당 $1을 청구한다는 의미입니다. Stripe는 금액을 페니(통화의 가장 작은 단위)로 제공할 것을 요구하므로 결과에 100을 곱합니다. 서버리스 인프라는 저렴할 수 있지만, 우리 서비스는 그렇지 않네요!
API 엔드포인트 설정
새로운 API와 Lambda 함수를 참조하도록 설정해 보겠습니다.
serverless.yml
파일을 열고 다음 내용을 추가합니다.
billing:
# billing.js의 main 함수를 호출하는 HTTP API 엔드포인트 정의
# - path: URL 경로는 /billing
# - method: POST 요청
handler: billing.main
events:
- http:
path: billing
cors: true
method: post
authorizer: aws_iam
이 블록이 functions
블록 아래에 올바르게 들여쓰기되었는지 확인하세요.
이제 API를 테스트하기 전에 Stripe 비밀 키를 환경 변수에 로드해야 합니다.
For help and discussion
Comments on this chapter