에러 케이스별 가이드
결제 연동 시 자주 발생하는 에러와 해결 방법을 안내합니다.
대부분의 에러는 아래 항목을 점검하면 해결됩니다.
- 개발/운영 환경 설정이 올바른가? (
env,mxId,passKey) callHash생성 시 파라미터 순서와 값이 정확한가?- 취소/환불 시 원거래 정보(
mxIssueNo,mxIssueDate)를 그대로 사용했는가?
9010 Hash 데이터 검증 실패
가장 빈번하게 발생하는 오류입니다. 해시(Hash) 생성 시 파라미터가 잘못 구성된 경우 발생합니다.
- 해시 생성에 사용하는 파라미터 순서가 잘못됨
passKey값이 환경(개발/운영)과 맞지 않음passKey에 공백이 포함됨passKey에 대소문자 구분 없이 모두 소문자나 대문자로 변환됨
해결 방법
- 파라미터 순서가 연동 가이드와 일치하는지 확인
- passKey가 환경(개발/운영)에 맞는지 확인
- passKey에 공백이 포함되지 않았는지 확인
- passKey가 대소문자 변환 없이 원본 그대로인지 확인
Hash 생성 순서 참고
| 기능 | Hash 생성 순서 |
|---|---|
| 일반 결제창 화면 호출, 일반/정기 결제 취소 API, 환불요청 API, 가상계좌 발급 요청 | mxId + mxIssueNo + mxIssueDate + amount + passKey |
| 일반 승인 요청, 에스크로 배송 등록 요청 | mxId + mxIssueNo + passKey |
| 빌키 등록 화면 호출 | mxId + custNo + passKey |
| 정기 결제 승인 요청 | mxId + mxIssueNo + amount + passKey |
| 빌키 삭제 요청 | mxId + billKey + passKey |
이외의 기능들은 연동 가이드에서 확인해주세요.
passKey는 개발/운영 환경별로 각각 다른 값이 발급됩니다. 혼용하지 않도록 주의하세요.
해시 생성이 의심된다면 개발 환경에서 raw 문자열을 출력해 확인하세요.
9713 중복 주문번호
동일한 주문번호로 결제가 두 번 이상 요청됐을 때 발생합니다.
- 같은
mxIssueNo로 재요청 - 사용자가 페이지를 새로고침하여 요청이 중복 전송됨
- 결제 실패 후 동일한 주문번호로 재시도
해결 방법
- 주문번호를 요청마다 고유하게 생성
// 방법 1: 타임스탬프 사용
const mxIssueNo = `ORDER_${Date.now()}`;
// 방법 2: UUID 사용 (권장)
import { v4 as uuidv4 } from 'uuid';
const mxIssueNo = `ORDER_${uuidv4()}`;9013 결제 시간 초과
결제 요청 또는 인증 후 일정 시간이 초과되면 발생합니다.
- 결제 요청 후 30분이 경과
- 인증 완료 후 24시간 이내에 승인 요청을 보내지 않음
해결 방법
- 결제창 표시 후 30분 이내에 결제 진행
- 인증 완료 후 24시간 이내에 승인 요청
- 유효시간 초과 시 새로운 결제 시작 안내
| 단계 | 유효시간 | 초과 시 조치 |
|---|---|---|
| 결제창 표시 | 30분 | 결제창 재호출 |
| 인증 완료 후 승인 | 24시간 | 새로운 결제 시작 |
P502 원거래 없음
결제 취소 또는 환불 요청 시, 원래 승인 거래를 찾지 못할 때 발생합니다.
취소/환불 요청에 사용한 mxId, mxIssueNo, mxIssueDate 중 하나라도 승인 시 사용한 값과 다른 경우입니다.
가장 흔한 실수: mxIssueDate를 승인 당시의 시간이 아닌 취소 요청 시점의 시간으로 전송
해결 방법
- 취소/환불 요청 시 승인 시점의
mxId,mxIssueNo,mxIssueDate값 사용
| key | 타입 | 필수 | 설명 |
|---|---|---|---|
mxId | String | 가맹점 ID (승인 시 사용한 값) | |
mxIssueNo | String | 주문번호 (승인 시 사용한 값) | |
mxIssueDate | String | 주문일시 (승인 시 사용한 값, 취소 요청 시점 X) |
// 잘못된 예 - 취소 요청 시점의 시간 사용
String mxIssueDate = LocalDateTime.now().format(formatter); // X
// 올바른 예 - 원거래의 주문일시 사용
Payment originalPayment = paymentRepository.findByOrderId(orderId);
String mxIssueDate = originalPayment.getMxIssueDate(); // O9003 기초정보 확인 중 오류
가맹점 정보 또는 환경 설정이 잘못 구성된 경우 발생합니다.
- SDK 호출 시
env파라미터 누락 (운영 환경에서 개발 서버로 요청됨) - 개발용 MID를 운영 환경에서 사용 (또는 그 반대)
- 개발용/운영용
passKey혼용 - 해당 MID에 요청한 결제수단(LPAY, 가상계좌 등)이 등록되지 않음
해결 방법
- 환경 변수
env가 올바르게 설정되어 있는지 확인 - MID와 passKey가 동일한 환경(개발/운영)에 속하는지 확인
- 요청한 결제수단이 해당 MID에 등록되어 있는지 확인
// 환경별 설정 분리 예시
const config = {
development: {
env: 'develop',
mxId: 'testcorp',
passKey: process.env.DEV_PASS_KEY,
endpoint: 'https://dev.firstpay.co.kr'
},
production: {
env: 'product',
mxId: 'yourcorp',
passKey: process.env.PROD_PASS_KEY,
endpoint: 'https://api.firstpay.co.kr'
}
};
const currentConfig = config[process.env.NODE_ENV];사용하고자 하는 결제수단이 노출되지 않은 경우 영업팀에 문의해주시기 바랍니다.
P798 가맹점 정보 오류
존재하지 않는 가맹점 정보로 요청하거나, 서비스가 중지된 MID를 사용할 때 발생합니다.
- MID가 유효하지 않음
- MID가 서비스 중지 상태
- 가맹점 계약이 만료됨
해결 방법
- MID가 유효한지 영업 담당자에게 확인
- 가맹점 계약 상태 확인
9704 거래 내역 없음
가상계좌 강제 입금 처리 시, 해당 거래 건을 DB에서 찾지 못할 때 발생합니다.
- 요청한 거래 정보가 승인 거래 정보와 불일치
- 운영 환경에서 승인된 거래를 개발 환경 DB에서 조회
- 개발 환경에서 승인된 거래를 운영 환경 DB에서 조회
해결 방법
- 개발 환경에서 테스트한 거래 건인지 확인
- 요청 거래 정보가 승인 당시와 동일한지 확인
- 환경(개발/운영)이 일치하는지 확인
8873 / 8373 미등록 가맹점 / 하위사업자몰 오류
MID의 서브몰 심사가 완료되지 않았거나, 특정 카드사에 등록되지 않은 경우 발생합니다.
해결 방법
- 다른 카드사로 결제 시도
- 여러 카드사에서 동일 오류 발생 시 영업팀에 문의
카카오페이, 토스페이, 네이버페이, 페이코 등 간편결제에서 카드로 결제할 때도 동일하게 적용됩니다.
P520 빌키 중복 등록
정기결제용 빌키(Bill Key) 등록 시, 이미 등록된 회원번호와 중복될 때 발생합니다.
동일한 custNo(회원번호)로 빌키가 이미 등록되어 있습니다. 회원번호당 하나의 카드만 등록할 수 있습니다.
해결 방법
- 기존 빌키 삭제 후 재등록 (권장)
- 또는 서로 다른
custNo사용
추가 도움말
위 내용으로 해결되지 않는 경우 아래 리소스를 참고해주세요.