diff --git a/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/TosspayException.kt b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/TosspayException.kt new file mode 100644 index 00000000..45fa12e0 --- /dev/null +++ b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/TosspayException.kt @@ -0,0 +1,8 @@ +package com.sangdol.tosspaymock.exception + +import com.sangdol.tosspaymock.exception.code.TosspayErrorCode + +class TosspayException( + val errorCode: TosspayErrorCode, + override val message: String = errorCode.message +) : RuntimeException(message) \ No newline at end of file diff --git a/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/code/TosspayCancelErrorCode.kt b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/code/TosspayCancelErrorCode.kt new file mode 100644 index 00000000..ed1fb31d --- /dev/null +++ b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/code/TosspayCancelErrorCode.kt @@ -0,0 +1,39 @@ +package com.sangdol.tosspaymock.exception.code + +import com.sangdol.common.types.web.HttpStatus + +enum class TosspayCancelErrorCode( + override val httpStatus: HttpStatus, + override val errorCode: String, + override val message: String +) : TosspayErrorCode { + ALREADY_CANCELED_PAYMENT(HttpStatus.BAD_REQUEST, "CO001", "이미 취소된 결제 입니다."), + INVALID_REFUND_ACCOUNT_INFO(HttpStatus.BAD_REQUEST, "CO002", "환불 계좌번호와 예금주명이 일치하지 않습니다."), + EXCEED_CANCEL_AMOUNT_DISCOUNT_AMOUNT(HttpStatus.BAD_REQUEST, "CO003", "즉시할인금액보다 적은 금액은 부분취소가 불가능합니다."), + INVALID_REQUEST(HttpStatus.BAD_REQUEST, "CO004", "잘못된 요청입니다."), + INVALID_REFUND_ACCOUNT_NUMBER(HttpStatus.BAD_REQUEST, "CO005", "잘못된 환불 계좌번호입니다."), + INVALID_BANK(HttpStatus.BAD_REQUEST, "CO006", "유효하지 않은 은행입니다."), + NOT_MATCHES_REFUNDABLE_AMOUNT(HttpStatus.BAD_REQUEST, "CO007", "잔액 결과가 일치하지 않습니다."), + PROVIDER_ERROR(HttpStatus.BAD_REQUEST, "CO008", "일시적인 오류가 발생했습니다. 잠시 후 다시 시도해주세요."), + REFUND_REJECTED(HttpStatus.BAD_REQUEST, "CO009", "환불이 거절됐습니다. 결제사에 문의 부탁드립니다."), + ALREADY_REFUND_PAYMENT(HttpStatus.BAD_REQUEST, "CO010", "이미 환불된 결제입니다."), + FORBIDDEN_BANK_REFUND_REQUEST(HttpStatus.BAD_REQUEST, "CO011", "고객 계좌가 입금이 되지 않는 상태입니다."), + UNAUTHORIZED_KEY(HttpStatus.UNAUTHORIZED, "CO012", "인증되지 않은 시크릿 키 혹은 클라이언트 키 입니다."), + NOT_CANCELABLE_AMOUNT(HttpStatus.FORBIDDEN, "CO013", "취소 할 수 없는 금액 입니다."), + FORBIDDEN_CONSECUTIVE_REQUEST(HttpStatus.FORBIDDEN, "CO014", "반복적인 요청은 허용되지 않습니다. 잠시 후 다시 시도해주세요."), + FORBIDDEN_REQUEST(HttpStatus.FORBIDDEN, "CO015", "허용되지 않은 요청입니다."), + NOT_CANCELABLE_PAYMENT(HttpStatus.FORBIDDEN, "CO016", "취소 할 수 없는 결제 입니다."), + EXCEED_MAX_REFUND_DUE(HttpStatus.FORBIDDEN, "CO017", "환불 가능한 기간이 지났습니다."), + NOT_ALLOWED_PARTIAL_REFUND_WAITING_DEPOSIT(HttpStatus.FORBIDDEN, "CO018", "입금 대기중인 결제는 부분 환불이 불가합니다."), + NOT_ALLOWED_PARTIAL_REFUND(HttpStatus.FORBIDDEN, "CO019", "에스크로 주문, 현금 카드 결제일 때는 부분 환불이 불가합니다. 이외 다른 결제 수단에서 부분 취소가 되지 않을 때는 토스페이먼츠에 문의해 주세요."), + NOT_AVAILABLE_BANK(HttpStatus.FORBIDDEN, "CO020", "은행 서비스 시간이 아닙니다."), + INCORRECT_BASIC_AUTH_FORMAT(HttpStatus.FORBIDDEN, "CO021", "잘못된 요청입니다. ':' 를 포함해 인코딩해주세요."), + NOT_CANCELABLE_PAYMENT_FOR_DORMANT_USER(HttpStatus.FORBIDDEN, "CO022", "휴면 처리된 회원의 결제는 취소할 수 없습니다."), + NOT_FOUND_PAYMENT(HttpStatus.NOT_FOUND, "CO023", "존재하지 않는 결제 정보 입니다."), + FAILED_INTERNAL_SYSTEM_PROCESSING(HttpStatus.INTERNAL_SERVER_ERROR, "CO024", "내부 시스템 처리 작업이 실패했습니다. 잠시 후 다시 시도해주세요."), + FAILED_REFUND_PROCESS(HttpStatus.INTERNAL_SERVER_ERROR, "CO025", "은행 응답시간 지연이나 일시적인 오류로 환불요청에 실패했습니다."), + FAILED_METHOD_HANDLING_CANCEL(HttpStatus.INTERNAL_SERVER_ERROR, "CO026", "취소 중 결제 시 사용한 결제 수단 처리과정에서 일시적인 오류가 발생했습니다."), + FAILED_PARTIAL_REFUND(HttpStatus.INTERNAL_SERVER_ERROR, "CO027", "은행 점검, 해약 계좌 등의 사유로 부분 환불이 실패했습니다."), + COMMON_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "CO028", "일시적인 오류가 발생했습니다. 잠시 후 다시 시도해주세요."), + FAILED_PAYMENT_INTERNAL_SYSTEM_PROCESSING(HttpStatus.INTERNAL_SERVER_ERROR, "CO029", "결제가 완료되지 않았어요. 다시 시도해주세요."); +} diff --git a/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/code/TosspayConfirmErrorCode.kt b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/code/TosspayConfirmErrorCode.kt new file mode 100644 index 00000000..253f8852 --- /dev/null +++ b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/code/TosspayConfirmErrorCode.kt @@ -0,0 +1,57 @@ +package com.sangdol.tosspaymock.exception.code + +import com.sangdol.common.types.web.HttpStatus + +enum class TosspayConfirmErrorCode( + override val httpStatus: HttpStatus, + override val errorCode: String, + override val message: String, +) : TosspayErrorCode { + ALREADY_PROCESSED_PAYMENT(HttpStatus.BAD_REQUEST, "CO001", "이미 처리된 결제 입니다."), + PROVIDER_ERROR(HttpStatus.BAD_REQUEST, "CO002", "일시적인 오류가 발생했습니다. 잠시 후 다시 시도해주세요."), + EXCEED_MAX_CARD_INSTALLMENT_PLAN(HttpStatus.BAD_REQUEST, "CO003", "설정 가능한 최대 할부 개월 수를 초과했습니다."), + INVALID_REQUEST(HttpStatus.BAD_REQUEST, "CO004", "잘못된 요청입니다."), + NOT_ALLOWED_POINT_USE(HttpStatus.BAD_REQUEST, "CO005", "포인트 사용이 불가한 카드로 카드 포인트 결제에 실패했습니다."), + INVALID_API_KEY(HttpStatus.BAD_REQUEST, "CO006", "잘못된 시크릿키 연동 정보 입니다."), + INVALID_REJECT_CARD(HttpStatus.BAD_REQUEST, "CO007", "카드 사용이 거절되었습니다. 카드사 문의가 필요합니다."), + BELOW_MINIMUM_AMOUNT(HttpStatus.BAD_REQUEST, "CO008", "신용카드는 결제금액이 100원 이상, 계좌는 200원이상부터 결제가 가능합니다."), + INVALID_CARD_EXPIRATION(HttpStatus.BAD_REQUEST, "CO009", "카드 정보를 다시 확인해주세요. (유효기간)"), + INVALID_STOPPED_CARD(HttpStatus.BAD_REQUEST, "CO010", "정지된 카드 입니다."), + EXCEED_MAX_DAILY_PAYMENT_COUNT(HttpStatus.BAD_REQUEST, "CO011", "하루 결제 가능 횟수를 초과했습니다."), + NOT_SUPPORTED_INSTALLMENT_PLAN_CARD_OR_MERCHANT(HttpStatus.BAD_REQUEST, "CO012", "할부가 지원되지 않는 카드 또는 가맹점 입니다."), + INVALID_CARD_INSTALLMENT_PLAN(HttpStatus.BAD_REQUEST, "CO013", "할부 개월 정보가 잘못되었습니다."), + NOT_SUPPORTED_MONTHLY_INSTALLMENT_PLAN(HttpStatus.BAD_REQUEST, "CO014", "할부가 지원되지 않는 카드입니다."), + EXCEED_MAX_PAYMENT_AMOUNT(HttpStatus.BAD_REQUEST, "CO015", "하루 결제 가능 금액을 초과했습니다."), + NOT_FOUND_TERMINAL_ID(HttpStatus.BAD_REQUEST, "CO016", "단말기번호(Terminal Id)가 없습니다. 토스페이먼츠로 문의 바랍니다."), + INVALID_AUTHORIZE_AUTH(HttpStatus.BAD_REQUEST, "CO017", "유효하지 않은 인증 방식입니다."), + INVALID_CARD_LOST_OR_STOLEN(HttpStatus.BAD_REQUEST, "CO018", "분실 혹은 도난 카드입니다."), + RESTRICTED_TRANSFER_ACCOUNT(HttpStatus.BAD_REQUEST, "CO019", "계좌는 등록 후 12시간 뒤부터 결제할 수 있습니다. 관련 정책은 해당 은행으로 문의해주세요."), + INVALID_CARD_NUMBER(HttpStatus.BAD_REQUEST, "CO020", "카드번호를 다시 확인해주세요."), + INVALID_UNREGISTERED_SUBMALL(HttpStatus.BAD_REQUEST, "CO021", "등록되지 않은 서브몰입니다. 서브몰이 없는 가맹점이라면 안심클릭이나 ISP 결제가 필요합니다."), + NOT_REGISTERED_BUSINESS(HttpStatus.BAD_REQUEST, "CO022", "등록되지 않은 사업자 번호입니다."), + EXCEED_MAX_ONE_DAY_WITHDRAW_AMOUNT(HttpStatus.BAD_REQUEST, "CO023", "1일 출금 한도를 초과했습니다."), + EXCEED_MAX_ONE_TIME_WITHDRAW_AMOUNT(HttpStatus.BAD_REQUEST, "CO024", "1회 출금 한도를 초과했습니다."), + CARD_PROCESSING_ERROR(HttpStatus.BAD_REQUEST, "CO025", "카드사에서 오류가 발생했습니다."), + EXCEED_MAX_AMOUNT(HttpStatus.BAD_REQUEST, "CO026", "거래금액 한도를 초과했습니다."), + INVALID_ACCOUNT_INFO_RE_REGISTER(HttpStatus.BAD_REQUEST, "CO027", "유효하지 않은 계좌입니다. 계좌 재등록 후 시도해주세요."), + NOT_AVAILABLE_PAYMENT(HttpStatus.BAD_REQUEST, "CO028", "결제가 불가능한 시간대입니다."), + UNAPPROVED_ORDER_ID(HttpStatus.BAD_REQUEST, "CO029", "아직 승인되지 않은 주문번호입니다."), + EXCEED_MAX_MONTHLY_PAYMENT_AMOUNT(HttpStatus.BAD_REQUEST, "CO030", "당월 결제 가능금액인 1,000,000원을 초과 하셨습니다."), + UNAUTHORIZED_KEY(HttpStatus.UNAUTHORIZED, "CO031", "인증되지 않은 시크릿 키 혹은 클라이언트 키 입니다."), + REJECT_ACCOUNT_PAYMENT(HttpStatus.FORBIDDEN, "CO032", "잔액부족으로 결제에 실패했습니다."), + REJECT_CARD_PAYMENT(HttpStatus.FORBIDDEN, "CO033", "한도초과 혹은 잔액부족으로 결제에 실패했습니다."), + REJECT_CARD_COMPANY(HttpStatus.FORBIDDEN, "CO034", "결제 승인이 거절되었습니다."), + FORBIDDEN_REQUEST(HttpStatus.FORBIDDEN, "CO035", "허용되지 않은 요청입니다."), + REJECT_TOSSPAY_INVALID_ACCOUNT(HttpStatus.FORBIDDEN, "CO036", "선택하신 출금 계좌가 출금이체 등록이 되어 있지 않아요. 계좌를 다시 등록해 주세요."), + EXCEED_MAX_AUTH_COUNT(HttpStatus.FORBIDDEN, "CO037", "최대 인증 횟수를 초과했습니다. 카드사로 문의해주세요."), + EXCEED_MAX_ONE_DAY_AMOUNT(HttpStatus.FORBIDDEN, "CO038", "일일 한도를 초과했습니다."), + NOT_AVAILABLE_BANK(HttpStatus.FORBIDDEN, "CO039", "은행 서비스 시간이 아닙니다."), + INVALID_PASSWORD(HttpStatus.FORBIDDEN, "CO040", "결제 비밀번호가 일치하지 않습니다."), + INCORRECT_BASIC_AUTH_FORMAT(HttpStatus.FORBIDDEN, "CO041", "잘못된 요청입니다. ':' 를 포함해 인코딩해주세요."), + FDS_ERROR(HttpStatus.FORBIDDEN, "CO042", "[토스페이먼츠] 위험거래가 감지되어 결제가 제한됩니다. 발송된 문자에 포함된 링크를 통해 본인인증 후 결제가 가능합니다. (고객센터: 1644-8051)"), + NOT_FOUND_PAYMENT(HttpStatus.NOT_FOUND, "CO043", "존재하지 않는 결제 정보 입니다."), + NOT_FOUND_PAYMENT_SESSION(HttpStatus.NOT_FOUND, "CO044", "결제 시간이 만료되어 결제 진행 데이터가 존재하지 않습니다."), + FAILED_PAYMENT_INTERNAL_SYSTEM_PROCESSING(HttpStatus.INTERNAL_SERVER_ERROR, "CO045", "결제가 완료되지 않았어요. 다시 시도해주세요."), + FAILED_INTERNAL_SYSTEM_PROCESSING(HttpStatus.INTERNAL_SERVER_ERROR, "CO046", "내부 시스템 처리 작업이 실패했습니다. 잠시 후 다시 시도해주세요."), + UNKNOWN_PAYMENT_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "CO047", "결제에 실패했어요. 같은 문제가 반복된다면 은행이나 카드사로 문의해주세요."); +} diff --git a/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/code/TosspayErrorCode.kt b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/code/TosspayErrorCode.kt new file mode 100644 index 00000000..485cc9bd --- /dev/null +++ b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/exception/code/TosspayErrorCode.kt @@ -0,0 +1,9 @@ +package com.sangdol.tosspaymock.exception.code + +import com.sangdol.common.types.web.HttpStatus + +interface TosspayErrorCode { + val httpStatus: HttpStatus + val errorCode: String + val message: String +}