서화 2025. 12. 5. 21:12

💳결제 API 란

쇼핑몰 등 결제시스템이 필요한 서비스와 카드사와 결제대행사(PG)사 등 결제 인프라를 연결해주는 통신 인터페이스

즉  PG사와 통신하는 도로 

💻 ngork을 사용해야하는 이유

현재 내 PC 로컬서버를 카카오서버가 절대로 접근할수 없기 때문에 카카오 서버 같은 외부서버가 접근할수 있도록 임시로 인터넷에 공개 해주는 장치

실제 서비스시 카카오와 계약하여 등록된 회사 공식서버로 결제가 진행된다

💵 결제 API 동작 흐름

1. 사용자가 얼마를 어떻게 결제할지 PG사에 전달함

2. PG사에서 결제처리

3. PG사에서  API로  결제 결과 전달받음

4. 결제 검증하기

5. 검증끝나면 결제 완료

💵 결제 준비 API 호출하기

✔️결제 준비 요청 데이터 수신 및 준비하기

서버는 클라이언트로부터 상품명, 구매가격, 주문번호를 받는다. 실제 서비스에서는 주문번호를 DB 또는 자동으로 만들어진 고유 주문번호를 사용한다. 서버에서 카카오페이 Ready API의 고유 주소로 HTTP 연결을 생성하고, 결제 준비 요청을 보낼 준비를 한다.

✔️HTTP 연결 설정 및 인증 정보 지정하기

HTTP 요청 방식을 POST로 설정하고, 출력 가능 상태로 만든다. 카카오페이 인증 정보(KakaoAK)와 요청 데이터 형식을 conn(서버 통로)에 지정한다. KakaoAK는 카카오 개발자 센터에서 발급받는 카카오 API 사용 전용 비밀번호이다.

✔️ 결제 요청 파라미터 구성 및 전송하기

Ready API에 POST로 보낼 결제 요청 파라미터를 하나의 문자열로 구성되있으며, 이는 카카오 서버로 보내는 결제 주문서다.

결제 완료/취소/실패 시 이동할 URL을 설정해야 하며, 로컬 서버 접근을 위해 ngrok 주소를 사용한다. Ready API에 결제 요청 데이터를 실제로 전송하고, 버퍼에 남은 데이터까지 전송을 완료한다.

✔️  결제 준비 결과 수신 및 처리:

카카오페이가 보낸 결제 준비 결과를 JSON 파일 형태로 받아서 문자열로 만든다 JSON 응답에서 결제 고유 ID(tid)와 결제 페이지 URL(next_redirect_pc_url)을 뽑아낸다

뽑아낸 tid는 이후 결제 승인 처리에 사용하기 위해 서버 저장소(KakaoTidStorage)에 주문별로 저장한다. ActionForward 객체에 next_redirect_pc_url을 담아 FrontController에 반환한다. 사용자는 결제 페이지(next_redirect_pc_url)로 이동하여 결제를 완료하며, 완료 시 카카오페이에서 approval_url로 자동 리다이렉트된다.

📥데이터 저장방식

tid 및 Image_URL 저장해야하는데  테스트용으로 Map에 저장하여 사용한다. 실제 서비스에서는 tid는 결제 DB에, image_URL은 상품 DB에 저장하여 사용해야 한다.

사용자가 결제하기 버튼을 누르면 Ready API 요청이 발생한다. Ready API에서 tid를 발급받고 URL을 반환한다.

브라우저에서 카카오 결제 페이지(QR)에서 결제 완료 버튼을 클릭한다.카카오에서 Approval_URL을 응답하여 FrontController로 이동한다.

ActionFactory에서 KakaoPayApproveAction을 실행한다.

💵 결제승인 API 호출 준비

결제 완료 후 카카오가 보낸 PG_token과 Ready 단계에서 발급된 tid를 가져온다.

☑️ pg_token은 사용자가 결제를 완료했음을 증명하는 토큰으로, Approve API에서 tid와 함께 사용된다.

HTTP 연결 설정하기

카카오페이의 Approve API 호출을 위한 카카오 서버 URL을 준비하고, HttpURLConnection 객체를 생성하여 서버와 통신할 준비를 한다. HTTP 요청 방식을 POST로 설정하고, 서버에 데이터를 전송할 수 있도록 준비한다.

카카오 인증키(KakaoAK)와 요청 데이터 형식(Content-Type)을 연결 객체에 설정한다.

💵결제 승인 요청 및 응답 처리

✔️ 결제 승인 파라미터 구성 및 요청 보내기

Tid, pg_token, 주문 ID, 사용자 등 결제 승인에 필요한 정보를 key=value 형태의 하나의 문자열(param)로 만들어 카카오 서버에 전송 준비를 한다.

출력 스트림을 통해 이 데이터를 카카오 Approve API로 보내고, 전송이 끝나면 스트림을 닫는다.

✔️ JSON 응답 받기

Approve API의 JSON 응답을 한 줄씩 읽어 하나의 문자열로 합친 뒤, 스트림을 닫아 데이터를 확보한다.

💵 결제 검증 및 DB 저장 (핵심 보안 로직)

✔️JSON 응답 가져와서 변수에 담기

카카오페이 결제 승인 API의 JSON 응답 데이터를 가져와서 상품명, 결제금액, 결제수단, 승인시간, 주문번호를 각각 변수에 저장한다. 이는 결제 성공을 확정하고 DB에 저장하기 위함이다.

✔️  결제 검증 하기(중요포인트)

DB에 저장된 결제 요청 금액과 실제 결제 승인 금액이 다르거나, 결제 승인 시간이 없을 경우 결제를 실패 처리한다.

✔️  DB 저장 및 조회:

결제 승인 및 금액 검증이 완료된 데이터를 OrderList DTO에 세팅한 후, DAO를 통해 주문 내역 테이블에 Insert 수행 여부를 확인한다. 주문 저장이 완료된 후, 해당 주문 데이터를 다시 조회(selectOne)하여 request 객체(saveOrder)에 담아 View로 전달한다.

✔️ OrderList 페이지

결제가 완료된 후, 서버에서 전달된 주문 정보를 화면에 출력하는 JSP 페이지다

Controller로부터 전달받은 saveOrder 객체를 EL(Expression Language)로 출력하여 상품 이미지, 상품명, 결제금액, 결제시간, 주문번호를 사용자에게 보여준다.

사용자가 '구매하러 가기' 버튼을 누르면 Controller에게 요청하여 다시 구매 페이지로 이동한다.