
KakaoPayConfig에 작성한 Admin Key, CID의 설정이 KakaoPayReadyAction에 제대로 넘어오고 있는 것을 확인했다
BufferedReader br;
if(conn.getResponseCode() == 200) {
br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
} else {
br = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
}
StringBuilder sb = new StringBuilder();
String line;
while((line = br.readLine()) != null) {
sb.append(line); // 줄바꿈 없이 연결
}
br.close();
System.out.println("응답 JSON: " + sb.toString());
JsonObject json = JsonParser.parseString(sb.toString()).getAsJsonObject();
이 코드를 KakaoPayConfig에 추가하여 응답 JSON을 확인해보았다

카카오페이에서 준 에러 메시지이다
{"msg":"appKeyType is REST_API_KEY. but expected [ADMIN_KEY]","code":-401}
- 에러 코드 -401 → 키 타입 오류
- 해결 → REST API Key → Admin Key 교체
뜻: 지금 사용한 키가 REST_API_KEY인데, 이 API는 ADMIN_KEY만 허용한다는 뜻으로
지금 Ready API 요청 시 잘못된 키를 사용한 상태라고 한다
어제 바꾸라고 해서 바꿨는데 착각을 했나보다
그래서 페이디벨로퍼에 가서 Secret key(dev)를 가져왔다
이번에는

Admin Key 형식이 잘못됐다고 카카오페이가 알려주고 있다
지금 사용한 키를 KakaoAK 헤더에 그대로 쓰면 안 된다는 뜻
이거저거 해보다가KakaoPayConfig
에 선언했던 ADMIN_KEY를 public static final String SECRET_KEY_DEV 로 변경하고 Ready에서
conn.setRequestProperty("Authorization", "KakaoAK " + KakaoPayConfig.SECRET_KEY_DEV);
이렇게 호출해보았다
키 형식 오류 발생
카카오페이 서버에서 입력한 키가 올바른 형식이 아니다 라고 인식한다
Secret Key(dev)는 맞지만, 현재 상태에서는 테스트 환경용 Admin Key로 인식되지 않는다
그래서 Ready API 호출도 되지 않는다
키 인증 실패가 응답에 tid가 없는 것으로 이어지기 때문이다
if(json.has("tid") && json.has("next_redirect_pc_url")) {
String tid = json.get("tid").getAsString();
String redirectUrl = json.get("next_redirect_pc_url").getAsString();
session.setAttribute("tid", tid);
forward.setPath(redirectUrl);
forward.setRedirect(true);
} else {
System.out.println("<<로그>> Ready API 호출 실패: " + json.toString());
forward.setPath(KakaoPayConfig.FAIL_URL);
forward.setRedirect(true);
}
이 코드를 넣어 일단 빨간 에러는 해결하였다
로그만 뜨는 상황이다
또 이거저거 로그 확인하면서 코드를 수정하다가
카카오 API 단건 결제 테스트 환경 기준을 다시 읽고

핵심 원인은 기존 코드와 카카오페이 Open API의 인증 방식이 달랐기 때문이다
엔드포인트 문제라고 하는데
기존에 사용한 엔드포인트
https://kapi.kakao.com/v1/payment/ready
OpenAPI 기준 엔드포인트
public static final String READY_URL = "https://kapi.kakaopay.com/v1/payment/ready";
kapi.kakao.com은 구 API용이며, 지금은 접속이 안되거나 Sevret Key를 지원하지 않아 에러가 발생했던 것 같다
문제의 원인
- 구 API 엔드포인트 사용 → open-api.kakaopay.com으로 변경 필요
- 요청 방식 차이 → JSON Body + Content-Type: application/json 필요

이렇게 화면이 나타났다 😸😸
참고로 엔드포인트(endpoint)
통신에서의 끝점: 네트워크 상에서 데이터를 주고받는 접점이나 주소를 의미
EX) 예: https://open-api.kakaopay.com/online/v1/payment/ready
→ 클라이언트가 요청을 보내고 서버가 응답을 주는 끝점 URL
API에서의 의미: 특정 기능을 제공하는 웹 주소(URL)를 가리킵니다.
카카오페이 Open API 기준 단건 결제 엔드포인트
결제 준비 (READY)
POST https://open-api.kakaopay.com/online/v1/payment/ready
결제 승인 (APPROVE)
POST https://open-api.kakaopay.com/online/v1/payment/approve
결제 취소 (CANCEL)
POST https://open-api.kakaopay.com/online/v1/payment/cancel
- 모든 요청은 Authorization: SECRET_KEY <Secret Key> 헤더를 사용합니다.
- 요청 본문은 JSON 형식이어야 하고, 단건 결제용 CID(TC0ONETIME)를 사용합니다.
- 로컬 테스트 시 approval_url, cancel_url, fail_url은 로컬 주소(http://localhost:8088/...)로 지정하면 됩니다.
이 엔드포인트를 바꾸면서 KakaoPayReady.java 코드도 수정이 되었다
기존 코드
// 카카오페이 READY API 호출
String ctx = request.getContextPath(); // 예: "/BugSandwichOrnamentMall"
String approvalUrl = URLEncoder.encode(ctx + "/kakaoPaySuccess.do", "UTF-8");
String cancelUrl = URLEncoder.encode(ctx + "/kakaoPayCancel.do", "UTF-8");
String failUrl = URLEncoder.encode(ctx + "/kakaoPayFail.do", "UTF-8");
String params = "cid=" + URLEncoder.encode(KakaoPayConfig.CID, "UTF-8")
+ "&partner_order_id=" + orderPk
+ "&partner_user_id=" + accountPk
+ "&item_name=" + URLEncoder.encode("ORNABLY_ORDER", "UTF-8")
+ "&quantity=1"
+ "&total_amount=" + totalAmount
+ "&tax_free_amount=0"
+ "&approval_url=" + approvalUrl
+ "&cancel_url=" + cancelUrl
+ "&fail_url=" + failUrl;
변경 코드
// Open API JSON Body 생성
JsonObject body = new JsonObject();
body.addProperty("cid", KakaoPayConfig.CID);
body.addProperty("partner_order_id", orderPk);
body.addProperty("partner_user_id", accountPk);
body.addProperty("item_name", "ORNABLY_ORDER");
body.addProperty("quantity", 1);
body.addProperty("total_amount", totalAmount);
body.addProperty("tax_free_amount", 0);
body.addProperty("approval_url", KakaoPayConfig.BASE_URL + "/kakaoPaySuccess.do");
body.addProperty("cancel_url", KakaoPayConfig.BASE_URL + "/kakaoPayCancel.do");
body.addProperty("fail_url", KakaoPayConfig.BASE_URL + "/kakaoPayFail.do");
// Open API 호출
URL url = new URL("https://open-api.kakaopay.com/online/v1/payment/ready");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Authorization", "SECRET_KEY " + KakaoPayConfig.SECRET_KEY_DEV);
conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
conn.setDoOutput(true);'에러&문제해결' 카테고리의 다른 글
| eclipse 톰캣 경로 (다른 컴퓨터에서 톰캣 에러 날 때) (0) | 2026.01.02 |
|---|---|
| 세션에 없는 값 : "javax.servlet.http.HttpSession.getAttribute(String)" is null (0) | 2025.12.31 |
| HTTP 401 Unauthorized - 카카오페이 서버 (0) | 2025.12.31 |
| Filter 생성 안됨 (0) | 2025.12.27 |
| 이클립스 Marketplace solutions available (0) | 2025.12.13 |