주문은 100건인데 정산은 98건이다 · 취소와 환불 · 이론
취소와 환불 — 되돌리는 방법은 하나가 아니다
한 줄 요약
취소는 한 가지 일이 아니라 매입 전의 승인취소와 매입 후의 매입취소로 갈리고, 환불은 "원래 낸 수단으로 돌려준다" 는 원칙이 성립하지 않는 경우가 늘 일정 비율로 생긴다.
왜 이게 필요했나
주문 취소 화면은 단추 하나지만, 그 단추가 부르는 일은 매입 전인지 후인지에 따라 완전히 다릅니다. 매입 전이면 카드사에 잡아 둔 한도를 푸는 것으로 끝납니다. 우리 매출에 올라간 적이 없으니 정산 파일에는 아무 흔적도 남지 않고, 고객 카드 명세에서도 곧 사라집니다. 매입 후면 이미 청구한 금액을 되돌리는 것이라 매출과 취소가 둘 다 기록에 남습니다. 이 둘을 한 덩어리로 "취소 N건" 이라고 세면, 정산 대사에서 짝을 찾지 못하는 건이 우수수 나옵니다.
더 중요한 차이가 하나 있습니다. 승인취소는 쪼갤 수 없습니다. 카드사에 잡아 둔 한도는 통째로 풀거나 그대로 두는 것뿐입니다. 그래서 매입 전 주문에 "이 품목만 빼 주세요" 가 들어오면 시스템이 할 수 있는 일은 둘뿐입니다 — 전부 취소하고 다시 주문을 받거나, 매입까지 기다렸다가 부분 취소하거나. 요구사항 회의에서 "부분 취소도 되게 해 주세요" 라는 말이 나왔을 때 먼저 물어야 하는 것이 "매입 전입니까 후입니까" 인 이유입니다.
어떻게 동작하나
취소 요청 하나를 처리하는 판단은 대체로 이런 순서입니다.
1) 이 주문이 이미 전체 취소됐는가 → 중복 요청. 새 취소가 아니다2) 매입 전인가 + 부분 요청인가 → 거절. 승인취소는 쪼갤 수 없다3) 매입 전인가 → 승인취소(void)4) 매입 후인가 → 매입취소(refund), 전체·부분 모두 가능그다음은 "얼마를" 입니다. 부분 취소는 그 품목에 해당하는 금액이고, 전체 취소는 결제 금액 전부가 아니라 아직 취소되지 않고 남아 있는 금액 입니다. 앞서 부분 취소가 있었던 주문을 나중에 전체 취소할 때 결제 금액 전액을 돌려주면 같은 돈을 두 번 내보내게 됩니다. 그래서 취소 처리는 요청이 들어온 순서대로 해야 하고, 접수 시각을 초 단위까지 저장해 두어야 순서를 복원할 수 있습니다.
마지막이 "무엇으로" 입니다. 원칙은 원결제 수단 복귀지만, 현실에서는 세 가지 이유로 자주 깨집니다. 포인트나 적립금으로 낸 몫은 현금으로 나갈 수 없어 포인트로 돌려줘야 합니다. 가상계좌로 받은 돈은 애초에 "원래 결제한 수단" 이라는 것이 없어서 고객의 환불 계좌로 이체해야 하고, 계좌를 모르면 그 자리에서 멈춥니다. 카드 매입취소도 시간이 지나면 원카드로 돌아가지 못해 다른 수단을 찾아야 합니다. 이 멈춘 건들은 저절로 사라지지 않고, 목록으로 뽑아내지 못하면 고객이 먼저 전화를 겁니다. 취소·환불 처리는 같은 요청이 두 번 들어와도 결과가 한 번만 반영돼야 하므로, 요청에 멱등 키를 붙이는 [RFC 9110 의 멱등 개념](https://www.rfc-editor.org/rfc/rfc9110#name-idempotent-methods) 이 결제 연동 규약에도 그대로 쓰입니다.
현장에서 만나는 모습
가장 흔한 문의는 "취소했는데 돈이 안 들어왔어요" 입니다. 원인은 거의 언제나 셋 중 하나입니다. 승인취소라 애초에 빠져나간 돈이 없었는데 고객은 명세서에 잡힌 금액을 보고 결제됐다고 알고 있는 경우, 가상계좌라 이체 대상이고 계좌를 못 받아 멈춰 있는 경우, 카드사 쪽 처리가 며칠 걸리는 경우입니다. 세 경우의 답변이 전혀 다르므로, 상담 화면에는 "취소 완료" 한 줄이 아니라 어떤 취소였고 어떤 수단으로 나갔으며 지금 어디까지 왔는가 가 보여야 합니다.
또 하나는 거절과 중복입니다. 금액이 0원이라 로그에 남기지 않는 팀이 많은데, 고객 화면에는 "취소 접수" 로 보였을 수 있습니다. 사유를 남기지 않으면 같은 문의가 반복해서 들어오고, 나중에 감사에서 "이 요청은 왜 처리되지 않았습니까" 에 답할 근거가 없습니다. 소비자에게 안내해야 할 내용과 기록해야 할 범위는 [전자상거래 등에서의 소비자보호에 관한 법률](https://www.law.go.kr/%EB%B2%95%EB%A0%B9/%EC%A0%84%EC%9E%90%EC%83%81%EA%B1%B0%EB%9E%98%EB%93%B1%EC%97%90%EC%84%9C%EC%9D%98%EC%86%8C%EB%B9%84%EC%9E%90%EB%B3%B4%ED%98%B8%EC%97%90%EA%B4%80%ED%95%9C%EB%B2%95%EB%A5%A0) 이 정하고 있으니, 보존 기간과 안내 문구는 반드시 원문과 법무 검토로 확인하고 적으십시오.
세 번째로 자주 보는 것은 배송비입니다. 상품을 일부만 취소했을 때 배송비를 돌려줄지 말지는 업무 규칙이지 기술 문제가 아닌데, 규칙이 문서에 없으면 개발자가 그 자리에서 정해 버립니다. 그렇게 정해진 규칙은 어디에도 적혀 있지 않으므로 반년 뒤에 아무도 이유를 모르고, 정산 담당자가 손으로 맞추기 시작합니다. 배송비·쿠폰·포인트처럼 주문 단위로 붙는 금액은 "부분 취소일 때 어떻게 되는가" 를 상품 정책서에 한 줄로 못 박아 두어야 합니다. 그 한 줄이 없으면 시스템은 반드시 틀린 금액을 내보냅니다.
다음 실습에서 할 것
취소 요청 20건을 접수 시각 순으로 처리하면서 승인취소·매입취소·거절·중복으로 가르고, 부분 취소가 먼저 있었던 주문의 전체 취소 금액을 계산합니다. 포인트분과 현금분을 나누고, 원결제 수단으로 돌아가지 못해 멈춘 건을 사유별로 뽑아냅니다.