logo
작성일

온라인 결제 기본 용어

Authors
  • avatar
    Name
    seren-wib
    Twitter
Contents

웹사이트에서 카드로 결제받을 때 뒤에서 무슨 일이 일어나는지 이해하는 데 필요한 용어. 예시는 Stairno 계정 센터 기준이다.

1. 누가 돈을 받나

결제사

카드사와 가게 사이에서 결제를 대신 처리해 주는 회사(PG, Payment Gateway). 작은 가게가 카드사 수십 곳과 하나하나 계약할 수는 없으니, 결제사 한 곳과 계약하면 결제사가 카드사들과 연결해 준다. 수수료는 거래마다 몇 퍼센트씩 낸다.

Stairno는 국내 결제(원화, KRW)에 토스페이먼츠, 해외 결제(달러, USD)에 PayPal을 쓴다.

결제창

카드 번호를 입력받는 결제사의 화면. 위젯이라고도 부른다. 가게 사이트 안에 떠 있는 것처럼 보이지만 결제사가 만든 화면이라, 카드 번호는 결제사로 바로 가고 가게 서버는 보지 못한다. Stairno도 카드 번호, 유효기간, CVC를 받는 코드가 아예 없다. 카드 정보를 갖지 않으면 털릴 카드 정보도 없다.

테스트 모드

돈이 실제로 오가지 않는 연습용 결제. 결제사는 테스트용 열쇠(테스트 키)를 준다. 이 키로 결제하면 과정은 진짜와 똑같지만 돈은 움직이지 않는다. PayPal에서는 같은 개념을 샌드박스(모래 놀이터)라고 부른다. 진짜 돈을 받는 라이브 키는 사업자등록과 결제사 계약을 마쳐야 나온다.

2. 결제 한 번이 일어나는 순서

결제 승인

결제사에 "이 결제 확정해 주세요"라고 요청하는 단계. 카드 결제는 두 단계다.

  1. 사용자가 결제창에서 카드를 넣고 인증한다. 아직 돈은 안 나갔다
  2. 가게 서버가 결제사에 승인을 요청한다. 이때 돈이 나간다

2단계에서 가게 서버는 금액을 다시 확인한다. 1단계는 사용자의 브라우저에서 일어나기 때문에, 누군가 브라우저를 조작해서 10,000원짜리를 100원으로 바꿔 보낼 수 있다. 서버가 "이 주문은 원래 10,000원인데 100원이 왔다"를 잡아내고 승인을 거절한다.

금액 표기

금액은 정수 최소 단위와 통화 코드 한 쌍으로 다룬다. 1,000원은 1000 KRW, 1달러는 100 USD(센트 단위)다. 컴퓨터의 소수 계산은 0.1 + 0.2가 정확히 0.3이 안 나오는 식으로 오차가 생겨서, 돈을 소수로 계산하지 않는다. 원과 달러를 섞어 더하지도 않는다.

환불

이미 승인된 결제를 취소하고 돈을 돌려주는 것. 결제사에 취소를 요청하면 결제사가 카드사를 통해 돌려준다. Stairno에서는 사용자가 환불을 요청하고, 운영자가 확인해서 승인하거나 거절한다.

3. 카드 저장과 정기 결제

빌링키

등록된 카드를 대신하는 열쇠. 카드를 한 번 등록하면 결제사가 카드 번호 대신 빌링키를 준다. 가게는 빌링키만 저장해 두고, 다음 결제 때 "이 빌링키로 1,000원 결제해 주세요"라고 요청한다. 사용자는 카드를 다시 입력하지 않고, 가게는 카드 번호를 갖지 않는다. 화면에는 카드사와 끝 4자리만 보여 준다.

구독과 갱신

정해진 기간마다 같은 금액을 자동으로 결제하는 것. 첫 결제는 구독을 시작할 때 바로 하고, 그 뒤로는 기간이 끝날 때마다 서버가 빌링키로 결제한다(갱신). 카드 한도 초과 같은 이유로 갱신이 실패하면 바로 끊지 않고 며칠 뒤 다시 시도하고, 그래도 계속 실패하면 구독을 만료시킨다. 실패할 때마다 사용자에게 "카드를 확인해 주세요" 메일을 보낸다.

4. 결제사와 가게의 대화

웹훅

결제사가 가게 서버에 거는 전화. 평소엔 가게가 결제사에 요청하지만, "방금 결제가 완료됐다", "환불됐다"처럼 결제사 쪽에서 먼저 일이 생기면 결제사가 미리 등록해 둔 가게 주소로 알림을 보낸다. 가게는 사용자가 결제 직후 창을 닫아 버려도 웹훅으로 결과를 받을 수 있다.

서명 검증

웹훅이 진짜 결제사가 보낸 것인지 확인하는 것. 웹훅 주소는 누구나 알 수 있으니 가짜 알림("결제 완료됐음")을 보낼 수도 있다. 그래서 결제사는 알림에 서명을 붙이고, 가게는 그 서명을 확인한 알림만 믿는다. 토스는 웹훅을 받으면 결제사에 결제 상태를 다시 물어보는 방식으로, PayPal은 PayPal에 서명 검증을 요청하는 방식으로 확인한다.

멱등

같은 요청을 여러 번 받아도 결과가 한 번 받은 것과 같은 성질. 네트워크가 불안하면 결제사는 같은 웹훅을 두 번, 세 번 보낼 수 있다. 두 번 왔다고 두 번 처리하면(권한을 두 번 주거나 메일을 두 번 보내면) 사고다. 그래서 알림마다 붙은 이벤트 번호를 기록해 두고, 이미 처리한 번호면 무시한다. 엘리베이터 버튼을 여러 번 눌러도 한 번만 오는 것과 같다.

5. 결제 뒤의 일

권한

"이 사람이 이 제품을 쓸 수 있는가"라는 기록(엔타이틀먼트). 결제가 끝나면 권한이 생기고, 환불하면 권한을 회수하고(revoked), 구독이 끝나면 권한도 기한이 끝난다. 제품을 파는 사이트는 결제 내역을 직접 뒤지지 않고 API에 "이 사람 이 제품 써도 돼?"라고 권한만 묻는다.

주문 상태 기계

주문이 거칠 수 있는 상태와 그 사이를 오가는 규칙을 미리 정해 둔 것. Stairno의 주문은 이렇게 움직인다.

pending ──결제 승인──> paid ──권한 부여──> fulfilled ──환불──> refunded
   │
   ├──거절 또는 금액 불일치──> failed
   └──30분 안에 결제 안 함──> expired
상태뜻
pending주문만 만들고 결제 대기
paid돈은 받았고 권한 주기 전
fulfilled결제와 권한 부여까지 끝남
refunded환불됨
failed결제 실패
expired시간 안에 결제 안 해서 만료

paid에서 바로 refunded로 가는 길도 있다(권한을 주기 전에 환불하는 경우). 화살표가 없는 이동은 거절한다. 예를 들어 refunded에서 fulfilled로는 못 간다. 그래서 "환불했는데 권한이 살아 있는 주문" 같은 이상한 상태가 생길 수 없다.

어댑터

서로 다른 것들을 같은 모양으로 맞춰 주는 중간 부품. 해외여행 갈 때 쓰는 전원 어댑터와 같은 개념이다. 토스와 PayPal은 요청 방식이 완전히 다르지만, 어댑터가 둘을 "결제 승인", "취소", "웹훅 확인" 같은 같은 모양의 기능으로 감싼다.

  • 주문 상태 기계는 어댑터만 알고, 토스인지 PayPal인지 모른다
  • 결제사를 하나 더 붙이면 어댑터만 새로 만든다
  • 테스트할 때는 진짜 결제사 대신 가짜 어댑터를 끼운다. "다음 결제는 거절해", "결제사가 응답 없는 척해" 같은 상황을 진짜 돈 없이 마음대로 만들 수 있다

결제 스위치

결제만 끄는 설정. Stairno는 PAYMENTS_MODE라는 설정값이 off면 로그인은 그대로 되고 결제 요청만 "지금은 안 됩니다"(503)로 답한다. 결제사나 DB에 장애가 났을 때 사이트 전체를 내리지 않고 결제만 멈추려고 둔다.

6. 이 용어가 나오는 글