제품 소개 · 랜딩

법정화폐로 충전하고, QR로 바로 결제하세요

OnPay는 소비자·가맹점 앱이 PG와 온램프를 따로 붙이지 않아도 되게, 충전 → 웹훅 반영 → 내부 잔액 → QR 승인을 한 코어에 묶습니다. 이 페이지는 마케팅·온보딩용이고, 실제 지갑·결제는 별도 dApp에서 경험합니다.

  • 한 번 충전 · 어디서나 결제
  • 가맹점 QR · 소비자 승인
  • 개발자용 허브 API
  • 1 허브 온램프 · 웹훅 · 잔액 · QR
  • 2 경로 랜딩 소개 · dApp 체험
  • API REST · 멱등 · 메트릭
소비자 · 체험

OnPay dApp 열기

Privy 로그인, 잔액·가맹점 결제·충전 UI. 프로덕션 배포 URL로 바로 이동합니다.

개발자 · API

배포된 코어 확인

payment-core 메타·헬스·OpenAPI. 파트너 앱은 /v1/… REST로 연동합니다.

배포된 API가 있으면 주소 끝에 / 를 붙인 URL로 ?api=https://…/ 를 붙이면 «배포 가이드» 버튼이 API 루트 열기로 바뀝니다. (예: Railway https://<서비스>.up.railway.app/ — 실제 호스트는 GET / JSON의 링크를 참고.) 커뮤니티는 ?discord=초대URL&telegram=https://t.me/… 로 연결합니다.

이용 시나리오

실사용자가 겪는 하루

OnPay는 충전 → 잔액 → 결제를 한 흐름으로 묶습니다. 랜딩에서 제품을 이해하고, dApp에서 직접 체험하세요.

01

충전

원화로 잔액을 채웁니다. 카드 정보는 온램프 파트너 창에만 남고, OnPay 코어는 웹훅으로 입금만 확인합니다.

02

가맹점 결제

매장 QR을 스캔하거나 코드를 입력해 승인합니다. 잔액이 부족하면 충전 후 이어서 결제할 수 있습니다.

03

내 결제 코드

소비자 QR을 띄우면 가맹점 단말이 스캔합니다. 유효 시간이 지나면 새 코드를 발급하세요.

🔒 서명된 웹훅 ♻️ 멱등 처리 📱 모바일 우선 dApp ⚡ Railway · Vercel 배포

브랜드

디자인 시스템 · 랜딩과 dApp 공통

다크 베이스에 시안 액센트민트 OK 톤으로 신뢰·가독성을 맞췄습니다. 폰트는 Pretendard, 모노스페이스는 코드·토큰 표시에 사용합니다.

Background#06090d
Panel#101820
Accent#5aa8ff
Success#3ee8b3
Violet#7c5cff
Warn#ffc14d

결제는 단순하게, 인프라는 견고하게

랜딩은 넓은 여백과 큰 타이포로 제품 스토리를 전달하고, dApp은 44px 터치 타깃·하단 네비로 모바일 사용성을 우선합니다.

GET /v1/payments · Idempotency-Key · HMAC webhook

전체 스펙: DESIGN_SYSTEM.md

경험 나누기

랜딩 · dApp · API — 역할이 다릅니다

실사용자·파트너가 어디까지가 가벼운 소개이고 어디부터가 운영 백엔드인지 한눈에 보이도록 나눴습니다. 여기는 읽기·스크롤 중심이고, 결제·지갑 UI는 이 HTML에 없습니다.

지금 보고 있는 곳

랜딩 · 제품 안내

캐주얼하게 훑어보는 정적 한 장입니다. 다크 톤·큰 제목·여백으로 가독성을 맞춰 두었고, GitHub·문서로만 이동합니다. 보통 Vercel 등에 public/만 올립니다.

로그인·승인·영수증 화면은 포함하지 않습니다. 디자인은 마케팅/온보딩 용도입니다.

별도 호스트

API 코어 · 팀이 만든 앱

payment-core(Nest)는 Railway 등 다른 URL에서 돌아갑니다. 소비자·가맹점이 쓰는 모바일/POS·운영 대시보드는 이 레포 밖의 앱에서 /v1/… REST를 호출합니다. 참고용 UI는 레포의 consumer-web (Vite·React — Privy 로그인, Vercel 별도 배포). 쿼리 ?app=https://… 로 링크를 덮어씁니다.

코어 주소는 배포 후 GET / JSON으로 확인하고, 위 히어로의 ?api= 안내로 이 랜딩에서 바로 API 루트를 열 수 있습니다.

허브

기술 엣지 · 온램프 형태

카드·계좌 원문은 온램프 위젯에 두고, 코어는 서명된 웹훅으로만 입금을 받아들입니다. 지갑 주소는 어댑터(Privy 등)로 주입합니다.

  • rawBody HMAC — JSON 재직렬화 레거시와 분리 가능한 검증.
  • WebhookEvent 멱등 — 리플레이·중복 이벤트에도 잔액 이중 적립 방지.
  • Redis 락(옵션) — 온램프 완료 처리 경쟁 완화.
  • 스윕·워커 — 만료 토큰·장기 AUTHORIZED 등 운영 배치.

온램프 한 사이클(위젯 → 웹훅 → 재승인)

  1. authorize — 잔액 부족 시 ONRAMP_REQUIRED + 위젯 URL.
  2. 위젯 — 사용자가 법정화폐로 결제(램프 도메인).
  3. 웹훅 — Onramper → (ingestor) → POST /v1/webhooks/onramper.
  4. 재호출 — 잔액 반영 후 다시 authorizeconfirm으로 캡처.

법적 고지: 이 페이지와 레포 문서는 제품 설명이며 법률 자문이 아닙니다. 한국에서 일반 소비자 대상 실서비스를 열려면 VASP·KYC/AML·약관 등 별도 요건이 있으며, 체크리스트 §10에서 기술 루프와 법무 게이트를 구분합니다.

이해하기

무엇을 만드는 제품인가요?

앱·POS가 직접 PG와 온램프를 각각 붙이지 않고, OnPay payment-core에 결제 의도·승인·확정과 충전 반영(웹훅)을 맡기는 구조입니다. 브랜드 앱·가맹점 터미널·운영 대시보드는 제품 측에서 완성하고, 코어는 상태·레저·멱등을 허브로 유지합니다.

소비자

충전 후 결제

잔액이 부족하면 온램프 위젯으로 충전하고, 웹훅으로 입금이 반영된 뒤 다시 승인합니다.

가맹점

QR로 요청

금액·주문 기준 QR을 띄우고, 고객 앱이 승인·캡처하면 영수증과 정산 적립 흐름으로 이어집니다.

개발자

한 저장소

Nest API, 웹훅 ingestor, 정산 워커, Prisma 스키마, POS SDK를 함께 버전 관리합니다.

구성

레포 구조

프로덕션에서는 보통 코어와 DB를 먼저 올리고, 트래픽에 맞춰 ingestor·워커를 붙입니다.

Core

payment-core

Nest REST — 결제, 온램프, 웹훅 HMAC·멱등, 잔액, 어드민 스윕, 메트릭·헬스. GET / 메타.

Edge

webhook-ingestor

온램퍼 웹훅 수신 후 코어로 프록시. 5xx 재시도·선택 DLQ.

Batch

settlement-worker

어드민 스윕 URL 주기 호출. Railway 헬스는 선택 GET /health.

커뮤니티

Discord · Telegram

정적 페이지이므로 초대 링크는 URL 쿼리로 넣습니다. 예시는 아래 박스를 참고하세요. Vercel 커스텀 도메인에서 북마크·리다이렉트로 고정해도 됩니다.

아직 쿼리가 없으면 Discord·Telegram 버튼은 이 섹션으로 스크롤합니다. 연결 예: ?discord=https://discord.gg/초대코드&telegram=https://t.me/채널

쿼리로 Discord·Telegram 링크가 적용되었습니다. 상단 아이콘에서도 이동할 수 있습니다.

문서

바로가기

운영·보안·기여 정책은 문서에 정리되어 있습니다.

시작

GUIDE.md

메인 가이드 — 빠른 시작·환경·배포 요약.

출시 전

체크리스트

PRODUCTION_CHECKLIST.md

기여

CONTRIBUTING · SECURITY

CONTRIBUTING · SECURITY