현장 노트

결제 현장에서 암호화폐 받기

결제 현장에서 암호화폐를 받는다는 것은, 계산대 앞의 고객이 스테이블코인 USDC나 BTC 같은 디지털 자산으로 결제하고, 가맹점은 유로로 입금받는다는 뜻입니다. 고객이 보내는 자산과 가맹점이 받는 돈은 서로 다르며, 결제 순간에 확정된 견적이 둘을 이어 줍니다. 가맹점의 계산대, 장부, 은행 계좌는 암호화폐가 오갔다는 사실을 전혀 알지 못합니다. 단말기에는 유로 가격이 표시되고, 고객이 코드를 스캔하면 몇 초 뒤 판매가 유로로 마감됩니다. 카드 결제였다면 올랐을 바로 그 항목입니다. 결제 현장의 암호화폐는 회계 변경이 아니라 하나의 결제 수단이며, 그 상태를 유지하는 것이 엔지니어링 과제의 전부입니다.

이 구분을 먼저 짚어 둘 필요가 있습니다. 암호화폐 결제를 둘러싼 혼란은 대부분 서로 분리해야 할 두 질문, 즉 고객이 어떻게 결제하는가와 가맹점이 어떤 통화를 보유하는가를 하나로 뭉뚱그리는 데서 나옵니다. 둘을 나누면 나머지는 자연히 따라옵니다.

실제로 풀어야 하는 문제

가맹점이 원하는 것은 매출이지 변동성이 아닙니다. 하루를 마칠 때 가치가 불확실한 자산을 떠안고 있고 싶지 않고, 경리 담당자가 갑자기 두 가지 통화를 다루기를 원하지도 않습니다. 원하는 것은 결제 시점부터 영수증까지 고정된 가격, 유로로 들어오는 돈, 다른 카드 결제일과 다를 바 없는 대사입니다. 암호화폐를 순진하게 받는 매장은 이 중 어느 것도 얻지 못합니다. 고객이 망설이는 동안에도 가격이 움직이는 자산을 받아 지갑에 묵혀 두고, 누군가 수작업으로 평가하고 환전해야 하는 두 번째 통화를 장부에 떠안게 됩니다. 그래서 설계 목표는 좁고 엄격합니다. 암호화폐는 결제 순간이라는 단 한 곳에서만 보이고, 그 밖의 모든 곳에서는 보이지 않게 하는 것입니다.

한 번의 탭: QR, 고정 견적, 유로 항목

계산대의 흐름을 따라가 보겠습니다. 계산원이 €24.00짜리 장바구니를 처리합니다. 단말기는 유로 합계를 표시하고, 요청 내용을 담은 QR 코드를 생성합니다. 코드에는 금액, 수신 주소 또는 인보이스, 유효 시간이 짧은 견적 ID가 들어 있습니다. 고객은 자신의 지갑으로 스캔해 보낼 내용을 정확히 확인한 뒤 승인합니다. 단말기는 네트워크에서 해당 전송을 감시하다가 확인되면 유로 영수증을 출력합니다. 계산원 입장에서는 합계, 제시, 승인, 영수증으로 이어지는 리듬이 카드와 똑같습니다. 계산대 쪽에서는 아무도 주소를 입력하거나 유로 이외의 잔액을 읽지 않습니다.

요청을 QR 안에 담기 때문에 낯선 사람의 휴대폰에 안전하게 건넬 수 있습니다. 금액과 수신처가 체크섬과 함께 코드에 실려 가므로, 고객이 잘못 입력해서 엉뚱한 주소나 금액으로 보낼 수 없습니다. 수금 쪽의 identity-by-construction과 같은 방식을 계산대에 적용한 것입니다. 스캔되는 코드는 올바른 코드이며, 틀릴 수 있는 자유 입력란이 없습니다.

유로로 정산해 장부가 암호화폐를 모르게

고객이 보내는 자산과 가맹점이 보유하는 유로 사이에는 환전이 있으며, 그 위치가 핵심입니다. 고객은 USDC나 BTC를 보내고, 플랫폼이 환전해 가맹점 계좌에 EUR로 입금합니다. 자산이 가맹점이 관리해야 하는 지갑에 남는 것이 아니라 플랫폼에서 환전되므로, 가맹점 원장에는 유로 입금과 유로 수수료 항목만 나타납니다. 카드 정산과 같은 형태입니다. 하루가 끝나면 장부는 처음부터 끝까지 유로입니다. 가치를 평가해야 할 코인 꾸러미도, 계정 내 두 번째 통화도, 월요일 아침에 오프램프할 것도 없습니다.

고객의 일은 가진 자산으로 결제하는 것이고, 가맹점의 일은 장부를 한 가지 통화로 유지하는 것입니다. 암호화폐를 유로로 정산하는 POS는 이 두 사실이 서로 만나지 않게 해 주는 기계일 뿐입니다.
— Protocore · 결제 엔지니어링

환율은 쫓는 것이 아니라 고정하는 것

걱정거리는 변동성이고, 해답은 카운트다운이 있는 고정 견적입니다. 단말기가 유로 가격을 표시할 때 몇 초 정도의 명시된 유효 시간으로 견적도 함께 확정합니다. 고객은 그 시간 안에 해당 견적으로 결제하며, 가맹점에 입금되는 유로는 지갑이 로딩되는 동안 시장이 어떻게 움직였든 화면에 표시된 금액 그대로입니다. 고객이 확인하기 전에 시간이 지나면 단말기가 다시 견적을 냅니다. 새 코드, 새 카운트다운, 명시적인 새 가격이며 조용히 달라지는 일은 없습니다. 가맹점은 탭부터 확인까지의 가격 변동에 노출되지 않습니다. 그 위험은 견적을 확정한 쪽이 지며, 커피 한 잔을 팔고 싶었을 뿐인 가게 주인이 지지 않습니다.

고객이 느리거나 단말기가 오프라인일 때

네트워크는 멈추고 매장은 연결을 잃기도 하므로, 오프라인 동작은 일부러 단순해야 합니다. 경우는 두 가지입니다. 고객이 느린 경우에는 견적이 만료되어 다시 견적을 냅니다. 결제는 제한 시간 안에 확인되거나 아예 일어나지 않으며, 되돌려야 할 반쯤 끝난 판매는 없습니다. 단말기 자체가 오프라인이 되면 금액이 정해진 요청은 표시할 수 있지만 새 견적을 확정하거나 정산을 확인할 수는 없습니다. 그래서 성공한 척하지 않고 판매를 보류 상태로 두었다가 재연결되면 대사합니다. 원칙은 영수증이 기대가 아니라 확인 시점에 출력된다는 것입니다. 유로 영수증이 있으면 그 유로는 회계에 반영된 것이고, 단말기가 확인하지 못한 판매는 조용히 사라지지 않고 운영자 콘솔에 열린 채로 보입니다.

단말기와 Gateway가 만나는 곳

계산대는 온라인에서 돌아가는 것과 같은 수납 스택의 대면 접점입니다. 카드 제시 방식의 암호화폐 탭과 pay-by-link 체크아웃은 내부적으로 같은 사건, 즉 요청, 결제, 유로 정산, 영수증이며 단지 표시되는 화면이 다를 뿐입니다. 따라서 가맹점은 매장 내 암호화폐 결제와 온라인 주문을 한곳에서, 유로로, 같은 수수료 항목과 같은 내보내기 형식으로 대사할 수 있습니다. 월말에 두 장부를 이어 붙일 필요가 없습니다. 단말기는 /products/pos에, 같은 레일의 온라인 쪽은 /products/gateway에 있으며, 견적, 정산, 매입사, 대사 같은 용어는 /glossary에 정의되어 있습니다.

솔직한 경계

계산대에서 암호화폐로 결제하려는 사람이 없다면, 암호화폐 단말기는 없는 문제를 푸는 해결책입니다. 카드를 받고 넘어가면 됩니다. 이 단말기가 제 몫을 하는 곳은 고객 중 상당수가 이미 디지털 자산을 보유하고 있고 먼저 오프램프하기보다 바로 쓰고 싶어 하는 곳입니다. 특정 여행 경로, 온라인 중심 고객층, 스테이블코인이 곧 쓸 수 있는 돈의 보유 방식인 일부 지역이 그렇습니다. 그런 곳에서 탭을 거절하는 것은 매출을 거절하는 것입니다. 위에서 설명한 QR, 고정 견적, 유로 정산, 확인 후 영수증 원칙이 있기에 변동성도, 두 번째 통화도, 장부 정리 프로젝트도 떠안지 않고 그 매출을 받을 수 있습니다. 암호화폐는 고객의 몫이고, 유로는 가맹점의 몫입니다.

구축할 시스템이 있으신가요?

문제를 알려 주세요. 아키텍처와 실행 계획으로 답해 드리겠습니다.