PG 심사 통과했는데 카드사가 거부했습니다 — 결제 라이브까지 마지막 7일
1인 개발로 AI 사업기획서 서비스 Bizketch를 만들고 있습니다. 코딩의 상당 부분은 AI한테 맡기면서요.
지난주 토요일에 첫 실결제가 찍혔습니다. 삼성카드 13,900원. 직접 결제하고, 토스에서 PAID 확인하고, 포트원에서 바로 취소했습니다.
PG 심사를 신청한 게 두 달 전입니다. 그동안 5차 리마인더까지 보냈어요. 통과 통보가 온 게 4/29 밤이었고, 그 시점부터 첫 실결제가 찍힐 때까지가 약 일주일 — 이번 로그는 그 마지막 7일 이야기입니다.
4/29 밤, 통과 메일이 한꺼번에 왔습니다
토스페이먼츠에서 MID 3건(기본결제·간편결제·빌링) 자동 발송 메일이 22:03~22:21 사이에 차례로 왔습니다. 22:05에 포트원 CS에서도 “실운영모드 설정 완료” 메일이 왔어요. 다섯 번째 리마인더를 그날 아침에 보냈는데 같은 날 밤에 통과 통보가 온 거예요. 카드사 심사가 보통 2주 걸린다고 들었는데 생각보다 빨리 끝났습니다.
다음 날 포트원 콘솔에 들어가서 라이브 채널 키 3종을 받고, 환경변수 4개를 갈아끼웠습니다. Production만. Dev·Preview는 테스트 키 그대로 둬서 로컬에서 실수로 실결제 나가는 걸 막았어요.
여기까지는 30분이면 끝날 줄 알았습니다.
그런데 카드사가 거부했습니다
테스트로 제 삼성카드를 긁어봤는데 E0:가맹점 정보 확인 요망. 케이뱅크로 다시 시도해도 같은 메시지였습니다.
토스 상점관리자에서 거래 로그를 봤더니 코드·환경설정은 정상이고, 카드사 측 가맹점 등록 동기화가 아직 안 된 상태였어요. 토스 계약은 4/29에 끝났는데, 카드사가 토스로부터 가맹점 정보를 받아 시스템에 반영하는 데 영업일 며칠이 더 걸리는 모양이었습니다.
문제는 그 시간 동안 가만히 있었던 게 아니라, 잠재된 코드 버그 4개를 발견했다는 점입니다.
한 달간 안 보였던 버그 4건
PG 심사 대기 동안에는 실결제를 시도할 일이 없으니, 코드는 멀쩡해 보였습니다. 실 채널 키로 결제를 돌리니 그제야 버그가 드러났어요.
여기서 AI 코딩의 함정을 좀 만났습니다. 카드사 거부 메시지를 그대로 AI에 넘기면 그럴듯한 가설이 한두 개씩 나옵니다. 그대로 패치하고 재배포해도 또 막혔어요. 결국 콘솔에서 환경변수 실제 값을 직접 까보고, SDK 타입 정의를 직접 읽고, 로그를 한 줄씩 들여다보는 시간이 필요했습니다. AI는 빠르지만 '어디를 파야 하는지’는 제가 잡아야 했어요.
1. 환경변수 trailing newline echo "value" | vercel env add 로 등록한 키 끝에 \n 이 붙어 있어서 PortOne SDK가 RECORD_NOT_FOUND 를 뱉었습니다. printf "value" | … 로 재등록하니 해결.
2. CSP frame-src 차단 next.config.ts 의 frame-src·connect-src에 https://*.tosspayments.com 이 빠져 있어서 결제창 자체가 안 뜨고 있었습니다. 도메인 추가.
3. PortOne v2 SDK 파라미터 키 이름 오류 간편결제 easyPay 옵션에 provider 로 넘기고 있었는데, SDK 표준은 easyPayProvider 였습니다. 키 이름에 easyPay 프리픽스가 빠져서 EASY_PAY 결제가 전부 실패했어요. AI가 처음 잡아준 코드라 의심 없이 넘겼는데, SDK 타입 정의를 직접 보니 키 이름이 달랐습니다.
4. Vercel ignoreCommand 동작 반대 docs-only 커밋만 빌드 스킵하라고 만든 ignoreCommand가, 알고 보니 반대로 작동하고 있었습니다. 코드 변경 시 빌드 스킵, docs-only 시 빌드 실행. grep -qvE invert 결과를 exit code로 그대로 쓰는 패턴에서 ! 가 빠져 있었어요. 결제 환경변수 갈아끼우는 동안 일부 배포가 안 됐던 이유였습니다.
이 4개를 그날 하루 동안 재배포를 반복하면서 잡았습니다. 카드사 동기화가 늦어진 게 오히려 다행이었어요. 동기화가 빨리 끝났다면 이 버그들과 함께 라이브로 갔을 겁니다.
5/8 토요일 오후, PAID
영업일 7일째에 다시 삼성카드를 긁었더니 PAID가 떴습니다. 토스 콘솔에서도 13,900원이 정상 처리됐고, 바로 포트원에서 전액 취소를 눌러서 실제 청구는 안 가도록 했습니다.
그 후 간편결제 3종(카카오페이·토스페이·페이코)도 Playwright로 결제창 진입까지 확인했어요. 네이버페이·애플페이는 토스에 별도 심사를 신청해뒀고, 최대 2주 걸린다고 합니다.
테스트 모드를 빠져나오는 데 두 달이 걸렸지만, 이제 Bizketch도 정식 결제가 되는 '진짜 서비스’가 됐습니다. 결제 한 번이 이렇게 의미 있을 줄 몰랐어요.
돌아보면
PG 통합에서 진짜 어려운 건 심사 대기가 아니라 실 채널 키로 처음 결제를 돌리는 그 순간이었습니다. 테스트 키로는 통과하던 모든 코드가, 실 환경에서는 한 개씩 새는 거였어요.
배운 점:
테스트 환경과 실 환경 분리는 좋지만, 실 환경 디버깅이 가능한 우회 경로(예: 본인 결제 후 즉시 환불)도 필요하다
CSP·환경변수·SDK 파라미터 같은 인프라성 버그는 정상 플로우에서는 안 잡힌다. 라이브 전 체크리스트가 따로 있어야 한다
카드사 가맹점 동기화 영업일은 PG가 알려주지 않는다. 계약 후 즉시 라이브 가능하다고 생각하면 안 된다
AI 코딩 시대에도 '내가 만든 시스템이 어떻게 돌아가는지’는 1인 개발자의 핵심 자산이다. AI가 그럴듯한 답을 내놔도 막혔을 때 원인을 짚어내려면, 결국 내가 코드 흐름을 따라가 봤어야 한다. AI에 다 맡길 수 있는 건 '실행’이지 '방향성’이 아니다
댓글
로그인 후 댓글을 남길 수 있습니다.
아직 댓글이 없습니다.