올바른 Razorpay 결제 흐름 (간단히 설명)
Source: Dev.to
많은 결제 통합 문제는 개발자들이 Razorpay 결제 라이프사이클을 오해해서 발생합니다. 올바른 흐름을 따르면 안전한 거래, 적절한 검증, 그리고 프로덕션에서의 버그를 줄일 수 있습니다.
아래는 단계별로 설명된 권장 Razorpay 결제 흐름입니다.
1. 사용자 “Pay” 버튼 클릭
사용자가 Pay 버튼을 클릭하면 프론트엔드에서 결제 프로세스가 시작됩니다.
이 시점에서 프론트엔드는 직접 결제를 처리하려고 시도해서는 안 됩니다. 대신 백엔드에 결제 주문을 생성하도록 API 요청을 트리거해야 합니다.
2. 백엔드가 주문 생성
백엔드는 Razorpay API와 통신하여 주문을 생성합니다. 이 단계에서 결제 금액을 정의하고 order ID를 생성합니다. 이 ID는 이후 체크아웃에서 사용됩니다.
const order = await razorpay.orders.create({
amount: 10000, // Amount in paise (₹100)
currency: "INR",
receipt: "order_rcptid_11"
});
응답에는 다음과 같은 중요한 세부 정보가 포함됩니다:
order.idorder.amountorder.currency
이 주문 ID는 Razorpay가 거래를 추적하는 데 필수적입니다.
3. 프론트엔드가 Razorpay 체크아웃 열기
백엔드가 주문 세부 정보를 반환하면 프론트엔드는 주문 ID를 사용해 Razorpay 체크아웃을 초기화합니다.
var options = {
key: "RAZORPAY_KEY_ID",
amount: order.amount,
order_id: order.id
};
이렇게 하면 사용자가 UPI, 카드, 인터넷 뱅킹 또는 지갑을 통해 거래를 완료할 수 있는 Razorpay 결제 인터페이스가 열립니다.
4. 사용자가 결제 완료
결제가 성공적으로 완료되면 Razorpay는 다음 값을 프론트엔드에 반환합니다:
razorpay_payment_id
razorpay_order_id
razorpay_signature
이 값들은 Razorpay가 생성한 결제 세부 정보를 나타냅니다. 하지만 이것만으로는 결제를 신뢰해서는 안 됩니다.
5. 백엔드가 서명 검증 (핵심 단계)
프론트엔드는 반환된 결제 데이터를 백엔드로 전송해야 합니다.
백엔드는 Razorpay 비밀 키를 사용해 서명을 생성함으로써 결제의 진위 여부를 검증합니다.
const crypto = require('crypto');
const generatedSignature = crypto
.createHmac('sha256', secret)
.update(`${razorpay_order_id}|${razorpay_payment_id}`)
.digest('hex');
백엔드는 생성된 서명을 Razorpay가 반환한 razorpay_signature와 비교합니다.
- 서명이 일치하면 결제가 유효합니다.
- 서명이 일치하지 않으면 결제를 거부해야 합니다.
이 검증 단계는 결제 변조나 사기로부터 시스템을 보호합니다.
6. 결제 정보를 데이터베이스에 저장
검증이 성공한 후에만 결제 정보를 데이터베이스에 저장합니다.
일반적으로 저장하는 필드 예시:
payment_idorder_idamountstatususer_idtimestamp
검증된 결제 기록을 저장하면 정확한 회계 처리가 가능하고, 추후 환불이나 분쟁 해결에도 도움이 됩니다.
7. 주문 이행
결제가 검증되고 저장된 후에는 안전하게 주문 이행을 진행할 수 있습니다. 예시:
- 디지털 제품에 대한 접근 권한 부여
- 구독 활성화
- 주문 확인
- 영수증 또는 확인 이메일 전송
이 단계에서 거래는 완전히 완료된 것으로 간주됩니다.
최종 생각
신뢰할 수 있는 Razorpay 통합은 올바른 라이프사이클을 따르는 것에 달려 있습니다:
- 사용자가 결제 시작
- 백엔드가 주문 생성
- 프론트엔드가 체크아웃 실행
- 사용자가 결제 완료
- 백엔드가 서명 검증
- 검증된 결제 저장
- 주문 이행
특히 서명 검증 단계를 정확히 구현하면 대부분의 Razorpay 결제 버그와 보안 문제를 피할 수 있습니다.