라이브 데모

결제 게이트웨이 가이드

여행 예약 웹사이트를 위한 Razorpay API 연동

Razorpay는 카드, UPI, 인터넷 뱅킹, 월렛 결제를 루피로 받는 인도의 결제 게이트웨이입니다. 이 가이드는 항공권, 호텔, 투어 예약에서 Razorpay 결제가 어떻게 흘러가는지와 PHPTRAVELS의 정확한 지원 현황을 설명합니다. Razorpay는 현재 기본 제공 커넥터는 아니지만, 직접 보유한 소스 코드에 맞춤 연동으로 추가할 수 있습니다.

  • 카드, UPI, 인터넷 뱅킹, 월렛
  • 주문, Checkout, 매입
  • 서명 및 웹훅 검증
  • 전액 및 부분 환불

Razorpay 한눈에 보기

Razorpay란 무엇이며 PHPTRAVELS에서 어떤 위치인가

Razorpay는 인도의 결제 게이트웨이입니다. 인도 고객에게 판매하는 여행 사업자는 체크아웃에서 현지 고객이 기대하는 결제 수단, 즉 체크카드와 신용카드, UPI, 인터넷 뱅킹, 인기 월렛을 받기 위해 이를 사용합니다. 결제와 정산은 모두 인도 루피로, 가맹점 본인의 Razorpay 계정에서 이루어집니다.

PHPTRAVELS는 전체 소스 코드가 포함된 자체 호스팅 여행 예약 플랫폼입니다. 기본 제공 결제 게이트웨이는 본인의 가맹점 인증 정보로 켜는 실시간 목록에서 제공됩니다. Razorpay는 현재 그 목록에 없어서 관리자 화면에 아직 켜는 스위치가 없습니다.

그렇다고 사용할 수 없다는 뜻은 아닙니다. 코드를 직접 보유하고 있으므로 Razorpay를 맞춤형 API 연동으로 추가할 수 있으며, 인도에서는 이미 사용 가능한 기본 게이트웨이로 Cashfree가 있습니다. 지금 켤 수 있는 모든 게이트웨이는 결제 게이트웨이 연동 페이지에 정리되어 있습니다.

온라인 여행 결제 일러스트: 예약 체크아웃이 카드 결제를 결제 게이트웨이로 넘기고 다시 예약 시스템으로 돌아오는 모습

Razorpay 요약표

개요
인도 사업자를 위한 결제 게이트웨이
결제 수단
카드, UPI, 인터넷 뱅킹, 월렛
통화
INR로 결제 및 정산하며, 금액은 paise 단위로 전송
API 키
Key ID와 Key Secret, 테스트 모드와 라이브 모드가 별도
PHPTRAVELS 지원 현황
기본 제공 커넥터 아님. 포함된 소스 코드에 맞춤 연동으로 추가 가능
인도에서 지금 바로 사용 가능
Cashfree, 본인의 Cashfree 계정으로 관리자 화면에서 활성화
Cashfree 설정 가이드

결제 흐름

여행 예약의 Razorpay 결제 한 건을 단계별로

Razorpay 연동은 여행객의 브라우저와 사용자의 서버가 역할을 나눕니다. 브라우저는 Checkout을 보여 주고, 서버는 주문을 만들고 결과를 확인하며 예약을 확정할 시점을 결정합니다.

  1. 01

    사용자의 서버

    주문 생성

    여행객이 결제 버튼을 누르면 서버가 Orders API를 호출해 paise 단위 금액, 통화, 예약 번호로 설정한 receipt를 보냅니다. Razorpay는 order_id를 반환합니다.

  2. 02

    브라우저

    Razorpay Checkout 열기

    예약 페이지가 Key ID와 해당 order_id로 Checkout을 열기 때문에, 여행객은 서버가 확정한 금액 그대로 결제합니다.

  3. 03

    브라우저

    여행객 결제

    여행객이 카드, UPI, 인터넷 뱅킹, 월렛 중 하나를 고르고 은행이 요구하는 절차를 마칩니다. 이제 결제가 승인된 상태입니다.

  4. 04

    브라우저

    Checkout이 값 세 개를 반환

    성공하면 Checkout이 razorpay_payment_id, razorpay_order_id, razorpay_signature를 돌려주고, 페이지가 이를 서버로 전송합니다.

  5. 05

    사용자의 서버

    서명 검증

    서버가 Key Secret으로 order_id와 payment_id에서 서명을 다시 계산합니다. 일치하는 서명만 실제 결제로 인정합니다.

  6. 06

    사용자의 서버

    결제 매입

    자동 매입이면 Razorpay가 매입합니다. 수동 매입이면 항공사, 호텔, 투어 공급사가 확인한 뒤 서버가 매입하므로, 실패한 예약에 대해 결제가 청구되지 않습니다.

  7. 07

    사용자의 서버

    예약 확정

    예약이 결제 완료 상태로 바뀌고 항공권 또는 바우처가 발급되며, Razorpay payment_id가 예약 번호와 함께 저장됩니다.

  8. 08

    사용자의 서버서버 간 통신

    웹훅 수신

    Razorpay는 payment.captured 같은 이벤트도 웹훅 URL로 보냅니다. 페이지가 결과를 보고하기 전에 여행객이 탭을 닫은 경우에도 대응할 수 있습니다.

서명과 웹훅

Razorpay 연동을 믿을 수 있게 하는 두 가지 검증

브라우저나 인터넷을 통해 도착하는 모든 것은 위조될 수 있습니다. Razorpay 연동은 서버 밖으로 나가지 않는 시크릿으로 만든 서명을 확인한 뒤에만 결제를 신뢰합니다.

verify-razorpay.php · 예시
 1// 1. After Checkout: verify the payment signature 2$orderId   = $booking["razorpay_order_id"];  // from your own record 3$paymentId = $_POST["razorpay_payment_id"]; 4$signature = $_POST["razorpay_signature"]; 5$expected  = hash_hmac("sha256", $orderId . "|" . $paymentId, $keySecret); 6if (!hash_equals($expected, $signature)) { rejectPayment(); } 7markPaid($booking["ref"], $paymentId); 8 9// 2. Webhook: verify X-Razorpay-Signature over the raw body10$body    = file_get_contents("php://input");11$header  = $_SERVER["HTTP_X_RAZORPAY_SIGNATURE"] ?? "";12$expect  = hash_hmac("sha256", $body, $webhookSecret);13if (!hash_equals($expect, $header)) { http_response_code(400); exit; }14$event = json_decode($body, true);15if (alreadyHandled($event)) exit;          // repeat delivery16switch ($event["event"]) {17  case "payment.captured": confirmBooking($event); break;18  case "refund.processed": markRefunded($event);   break;19}

로직을 보여 주기 위한 예시 의사 코드이며 그대로 쓸 수 있는 파일이 아닙니다. 정확한 호출은 Razorpay 공식 문서와 SDK를 따르세요.

  • 결제 서명

    order_id, 파이프 문자, payment_id를 Key Secret으로 HMAC SHA256 처리한 값이 razorpay_signature와 같아야 합니다. 비교에는 상수 시간 함수를 사용하세요.

  • 웹훅 서명

    각 웹훅에는 X-Razorpay-Signature 헤더가 포함됩니다. Razorpay 대시보드에서 설정한 웹훅 시크릿을 키로 원본 요청 본문에 HMAC SHA256을 적용한 값입니다.

  • 중복 전송

    웹훅은 여러 번 또는 순서가 뒤바뀌어 도착할 수 있습니다. 이벤트 ID와 결제 ID를 기록해 두고, 이미 예약에 반영한 이벤트는 무시하세요.

  • 시크릿은 서버에만

    브라우저에는 Key ID만 전달합니다. Key Secret과 웹훅 시크릿은 서버 설정에 두고, 페이지 소스나 모바일 앱에는 절대 넣지 않습니다.

환불 및 취소

여행 환불은 전액이 아닌 경우가 많습니다

취소 수수료, 노쇼 규정, 일부만 취소된 일정 때문에 여행 환불은 부분 환불인 경우가 흔합니다. Razorpay의 Refunds API는 두 경우를 모두 처리하며, 환불 금액은 예약 규칙에 따라 연동 쪽에서 정합니다.

  • 전액 환불

    무료 취소는 매입한 전체 금액을 여행객이 결제에 사용한 수단으로 돌려줍니다.

  • 부분 환불

    취소 수수료를 제외하고 서버가 남은 금액만 환불합니다. 금액은 원래 주문과 마찬가지로 paise 단위로 전송합니다.

  • 일정의 일부

    호텔 1박 또는 승객 1명만 취소하고 그 부분을 환불할 수 있으며, 매입 총액까지 추가 부분 환불이 가능합니다.

  • refund.processed

    환불 웹훅이 환불 완료 시점을 서버에 알려 주므로, 예약과 여행객에게 올바른 상태가 표시됩니다.

  • 예약에 연결해 저장

    각 환불 ID는 예약 번호 및 원래 payment_id와 함께 보관되어 회계 팀이 활용할 수 있습니다.

  • 예시: 취소 수수료가 있는 취소

    매입 금액
    ₹12,500.00 amount: 1250000
    취소 수수료
    ₹1,500.00 amount: 150000
    환불 금액
    ₹11,000.00 amount: 1100000

    예시 수치입니다. Razorpay는 최소 통화 단위로 금액을 받으므로 100 paise가 1루피입니다.

Razorpay 연결 방법

Razorpay를 쓰거나 쓰지 않고 결제를 받는 세 가지 방법

팀과 출시 일정에 맞는 방법을 고르세요. 세 가지 모두 돈은 본인의 가맹점 계정에 들어가며, PHPTRAVELS는 정산 과정에 관여하지 않습니다.

  1. 옵션 1

    자체 개발자가 추가

    PHPTRAVELS에는 전체 소스 코드가 포함되어 있어, 자체 개발자가 기존 게이트웨이 옆에 Razorpay를 새 게이트웨이로 추가할 수 있습니다. 주문 생성, 결제 단계의 Checkout, 서명 검증, 매입, 웹훅, 환불까지 구현합니다.

    • Razorpay 테스트 모드 키로 개발 및 테스트
    • 예약 번호를 주문 receipt로 재사용
    • 테스트 예약이 통과하면 라이브 키로 전환
  2. 옵션 2

    PHPTRAVELS가 개발

    저희 개발자가 맞춤형 API 연동으로 Razorpay 커넥터를 대신 만들어 드립니다. 요구 사항을 보내 주시면 작업 시작 전에 비용과 일정을 안내하고, 완료 후 테스트를 마친 소스 코드를 전달합니다.

    • 작업 시작 전 견적 제공
    • Razorpay 테스트 모드 기준으로 개발
    • 직접 소유하는 소스 코드로 납품
  3. 옵션 3

    기본 게이트웨이를 지금 사용

    먼저 출시해야 한다면 플랫폼에 이미 있는 게이트웨이를 켜세요. 인도에서는 Cashfree입니다. 현재 사용 가능한 기본 게이트웨이는 다음과 같습니다.

기본 게이트웨이

지금 바로 켤 수 있는 결제 게이트웨이

이 목록은 PHPTRAVELS 게이트웨이 디렉터리에서 실시간으로 가져옵니다. 각 게이트웨이는 본인의 계정과 키로 관리자 화면에서 활성화합니다.

각 게이트웨이 뒤에서 일어나는 호출이 궁금하다면 결제 게이트웨이 API 가이드를 읽어 보세요. Stripe 결제와 PayPal 결제 가이드를 비교하거나, B2B 포털에서 에이전트가 B2B 에이전트 지갑로 결제하는 방식도 확인할 수 있습니다.

Razorpay 질문

Razorpay와 PHPTRAVELS, 질문과 답변

영업팀 문의

기본 제공 커넥터로는 지원하지 않습니다. Razorpay는 현재 PHPTRAVELS 게이트웨이 목록에 없어 관리자 화면에서 켤 수 없습니다. 전체 소스 코드가 포함되어 있으므로 자체 개발자나 저희 개발자가 맞춤 결제 게이트웨이 연동으로 추가할 수 있습니다.

Cashfree는 PHPTRAVELS의 기본 게이트웨이이며 docs.phptravels.com/payments/cashfree에 설정 가이드가 있습니다. 본인의 Cashfree 계정으로 관리자 화면에서 켜면 됩니다. Stripe, PayPal 등 다른 기본 게이트웨이는 결제 게이트웨이 페이지에 나와 있습니다.

Razorpay는 인도 루피 결제에 대해 카드, UPI, 인터넷 뱅킹, 월렛을 지원합니다. 체크아웃에 표시되는 수단은 본인의 Razorpay 계정에서 활성화한 항목에 따라 달라집니다.

Razorpay는 최소 통화 단위로 금액을 받으므로, 루피로 된 예약 총액에 100을 곱한 뒤 주문을 만듭니다. 환불 금액도 같은 방식으로 보냅니다.

Checkout이 결제 ID, 주문 ID, 서명을 반환합니다. 서버가 Key Secret으로 주문 ID와 결제 ID의 HMAC SHA256을 계산하고, 결과가 서명과 일치할 때만 결제를 수락합니다.

자동 매입이 더 간단합니다. 수동 매입은 항공사, 호텔, 투어 공급사가 예약을 확인한 뒤에만 매입하므로, 실패한 예약은 환불 대신 취소 처리할 수 있습니다. 상품과 공급사에 따라 선택하세요.

네. Razorpay의 Refunds API는 전액 환불과 부분 환불을 지원하므로, 취소 수수료는 유지하고 나머지를 돌려줄 수 있습니다. refund.processed 웹훅이 환불 완료 시점을 서버에 알려 줍니다.

네. 가맹점 계정, Key ID와 Key Secret, 정산은 모두 사용자의 것입니다. PHPTRAVELS는 게이트웨이 인증 정보를 제공하지 않으며 자금도 다루지 않습니다. 테스트 모드 키로 개발하고 출시할 때 라이브 키로 전환하세요.

체크아웃, 수동 매입, 환불, 에이전트 결제 등 필요한 범위에 따라 다릅니다. PHPTRAVELS는 맞춤 작업을 시작하기 전에 견적을 드립니다. 플랫폼 자체는 부터 시작하는 일회성 라이선스입니다.