결제는 됐는데 권한이 안 열리거나 두 번 청구될 때
결제 성공 화면만 보고 권한을 열었다가, 웹훅·환불·중복 클릭에서 사고가 나는 상황을 막습니다.
한 줄 결론
결제는 PG·세금·환불·약관·테스트 모드가 한 번에 맞아야 하며, 샌드박스에서 끝까지 한 번 돌려 본 뒤에만 실결제를 켭니다.
아래 내용은 초보 바이브코더를 위한 일반 안내입니다. 서비스·지역·약관에 따라 달라질 수 있으며, 실제 사업화·운영 전에는 해당 분야 전문가 확인이 필요합니다.
먼저 용어부터 — 그다음 실행 프롬프트
- webhook
- 결제사가 우리 서버로 ‘결제됐다’고 보내는 알림
- test mode
- 가짜 카드로 돈 안 나가게 테스트하는 모드
Webhook
이건 webhook입니다
결제사·외부 서비스가 ‘이벤트 생겼어’라고 우리 서버에 보내는 알림 URL입니다.
- 테스트 모드와 라이브 키를 섞지 않습니다
- 서명(signing secret)으로 위조 요청을 거릅니다
- 같은 알림이 두 번 와도 한 번만 처리합니다
이런 곳에 · Stripe/토스 결제 · 자동화 알림 · /ai/guides 결제 가이드
지금 할 일 · 테스트 webhook URL 등록 → 테스트 결제 1회 → 로그에 이벤트 확인
비용·주의 · 테스트는 무료. 라이브 키로 실결제·수수료 주의.
AI 프롬프트 보기
Stripe(또는 토스) webhook 테스트. test key, signing secret, idempotent 처리, 실패 시 재시도 주의.
API Key
이건 API Key입니다
AI 서비스에 ‘나’라고 증명하는 비밀번호 문자열입니다. 브라우저·GitHub에 올리면 남의 과금이 됩니다.
- 서버 환경 변수에만 저장합니다
- NEXT_PUBLIC_ 접두사에 키를 넣지 않습니다
- 유출되면 즉시 rotate(재발급)합니다
이런 곳에 · OpenAI·DeepSeek·Gemini·Anthropic 모든 API 호출
지금 할 일 · .env.local에 KEY=... → .gitignore 확인 → 서버 route에서만 읽기
비용·주의 · 키 유출 = 타인 사용량 과금. 한도·알림을 먼저 켭니다.
AI 프롬프트 보기
Next.js에서 API Key가 클라이언트 번들에 안 나가게 점검. .env 규칙, git grep 패턴, rotate 순서.
바로 실행 — AI 프롬프트
Stripe(또는 토스) 결제 전 webhook 테스트 흐름. test key·webhook URL·로컬 stripe listen·성공/실패 이벤트 처리 순서.
막히면 다시 넣을 프롬프트
결제 webhook 400. payload: [요약], signing secret 위치: [ ]. idempotent 처리 여부.
럭키스팟 해석은 원출처를 바탕으로 한 실전 안내입니다. 요금·약관·라이선스는 제공자 페이지 최신 조건을 결제·배포 전에 대조하세요. 실제 사업화 전에는 해당 분야 전문가 확인이 필요할 수 있습니다.
초보자 한 줄 설명
결제가 끝났다는 신호는 브라우저가 아니라 PG→내 서버 웹훅으로 오는 경우가 많습니다. 그걸 검증하지 않으면 돈은 받았는데 권한은 안 열립니다.
먼저 AI 에이전트에게 붙여넣을 프롬프트
Stripe(또는 [PG]) 샌드박스로 결제+웹훅을 붙이고 싶다. 스택: Next.js. 1) checkout 또는 payment intent 최소 흐름 2) webhook 서명 검증 필수 이유 3) idempotency key/unique constraint 예시 설명 4) 환불 테스트 순서 5) live 전환 체크리스트 8항 코드는 파일별 최소, 실패 케이스 표 포함.
AI가 해줄 수 있는 일
- 결제 시작·완료 처리 코드·DB 주문 상태 흐름
- 외부 PG가 우리 서버에 알려주는 주소(webhook) 검증 코드
- 중복 결제 막는 idempotency 설명·샘플
사람이 직접 해야 하는 외부 설정
- PG 개발자센터에서 샌드박스 키·webhook URL 등록
- ngrok 등으로 로컬 webhook 공개 URL 만들기(테스트 시)
- 샌드박스에서 성공·실패·환불 각각 직접 결제 테스트
외부 설정 경로
- Stripe → Developers → API keys / Webhooks
- Toss Payments → 개발자센터 → API 키 / Webhook
- Vercel → Project → Settings → Environment Variables
제대로 됐는지 확인하는 방법
- 샌드박스 결제 후 DB에 paid 반영되는지
- 같은 결제 ID 두 번 webhook 와도 한 번만 반영되는지
- 환불 테스트 후 사용자 권한이 회수되는지
실행 순서
- 1샌드박스 결제 성공
- 2웹훅 수신·서명 검증
- 3DB 상태 전이
- 4실패·환불 시나리오
- 5live 키·약관 링크 확인
막히면 다시 AI에게 줄 프롬프트
결제는 됐는데 [웹훅 401 / DB 미반영 / 중복 paid]. PG: [Stripe/Toss/...], webhook 로그: [붙여넣기], DB 상태: [ ]. 서명 검증·raw body·unique payment_id 순서.
막히는 지점
- 웹훅 서명 검증 누락
- 같은 결제 두 번 반영
- 환불 UI 없음
- 프론트 금액만 신뢰
비용·보안·저작권·약관 주의
- 카드 정보 자체 저장 금지
- 전자상거래·통신판매 요건은 사업 형태별 전문가 확인
- 실결제 전환 시 키 혼선·중복 과금. 수수료·환불 정책은 PG·약관 확인.
대안 도구
Lemon Squeezy · Paddle · 국내 PG
럭키스팟 판단
샌드박스에서 성공·실패·환불·중복 클릭 네 가지를 끝까지 돌려 본 뒤 live를 켜세요.
이런 사람이 보면 좋음
- 유료 구독·일회성 결제를 처음 넣는 바이브코더
- 테스트는 됐는데 실결제 전에 막막한 사람
- 환불·취소·웹훅 실패를 아직 안 해 본 사람
초보자가 보통 착각하는 지점
- 테스트 카드로 성공하면 실서비스도 같은 코드로 바로 된다고 봅니다. 웹훅·세금·영수증은 별도입니다.
- 결제 금액을 프론트에서만 계산하고, 서버에서 최종 금액을 다시 검증하지 않습니다.
- 환불·구독 해지 UI 없이 결제만 먼저 붙입니다.
- 사업자 등록·통신판매·전자금융 요건을 나중에 채우면 된다고 미룹니다.
실제 점검 체크리스트
- Toss Payments → 개발자센터 → API 키 / Webhook 또는 Stripe → Developers → Webhooks에서 샌드박스 테스트를 각각 돌렸는지 확인합니다.
- 최종 결제 금액·상품 ID를 서버에서 검증하고, 화면이 보낸 가격만 믿지 않습니다.
- 외부 PG가 우리 서버에 보내는 알림(webhook) 서명 검증·중복 결제 방지 처리를 넣었는지 확인합니다.
- 구독이면 갱신·실패·해지 흐름을 문서화했는지 확인합니다.
- 이용약관·환불 정책 링크를 결제 전에 보여 줍니다.
- 실결제 전환 시 API 키·webhook URL을 live 모드로 바꿨는지 체크리스트로 확인합니다.
실패했을 때 보는 순서
- 1PG 대시보드에서 결제 상태(pending·paid·failed)와 웹훅 전달 로그를 봅니다.
- 2웹훅이 401·타임아웃·잘못된 서명으로 거절되지 않는지 확인합니다.
- 3DB에 주문 상태와 PG 상태가 어긋난 건을 찾아 수동 대조합니다.
- 4중복 결제 건은 idempotency key·unique constraint로 막았는지 확인합니다.
- 5환불 API를 샌드박스에서 다시 호출해 잔액·구독 상태가 맞는지 봅니다.
- 6사업자·약관 미비로 막히는 항목은 전문가 상담 일정을 잡습니다.
배포 전 확인 항목
- live 키는 환경 변수에만 있고, 테스트 키와 섞이지 않았습니다.
- 결제 완료 후 사용자에게 보이는 상태(이메일·마이페이지)가 맞습니다.
- 에러 시 카드 정보가 로그에 남지 않습니다.
- 약관·환불 정책 URL이 실제 접근 가능합니다.
보안·법적 주의
- 결제·개인정보·전자상거래 관련 법규는 국가·사업 형태마다 다릅니다. 본 가이드는 일반 정보이며, 실제 사업화 전 변호사·세무사·PG 심사 요건을 확인하세요.
- 카드 번호·CVV를 자체 서버에 저장하지 마세요. PCI 범위를 최소화하세요.
- 미성년자·금융·의료 등 규제 업종은 별도 제한이 있을 수 있습니다.
- 허위 할인·가격 표시는 표시광고·전자상거래 규정 위반 소지가 있을 수 있습니다.