KakaoPayService 클래스 정의

@Slf4j
@Service
@RequiredArgsConstructor
@Transactional
public class KakaoPayService {

    static final String cid = "TC0ONETIME";
    @Value("${kakao.ADMIN_KEY}")
    private String adminKey;
    private KakaoReadyResponse kakaoReady;

    ...
}

기술 설명

헤더 생성 메서드 (getHeaders)

private HttpHeaders getHeaders() {
    HttpHeaders headers = new HttpHeaders();
    headers.set("Authorization", "KakaoAK " + adminKey);
    headers.set("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
    return headers;
}

기능 설명

결제 준비 요청 (kakaoPayReady)

public ResponseEntity<KakaoReadyResponse> kakaoPayReady(Amount amount) {
    // 1) 요청 파라미터 세팅
    MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
    parameters.add("cid", amount.getCid());
    parameters.add("partner_order_id", amount.getPartner_order_id());
    parameters.add("partner_user_id", amount.getPartner_user_id());
    parameters.add("item_name", amount.getItem_name());
    parameters.add("quantity", String.valueOf(amount.getQuantity()));
    parameters.add("total_amount", String.valueOf(amount.getTotal()));
    parameters.add("vat_amount", String.valueOf(amount.getTax()));
    parameters.add("tax_free_amount", String.valueOf(amount.getTax_free()));

    // 2) Callback URL 설정 (로컬 개발용)
    parameters.add("approval_url", "http://localhost:8080/payment/success");
    parameters.add("cancel_url",  "http://localhost:8080/payment/cancel");
    parameters.add("fail_url",    "http://localhost:8080/payment/fail");

    // 3) HttpEntity에 파라미터 + 헤더 담기
    HttpEntity<MultiValueMap<String, String>> requestEntity =
        new HttpEntity<>(parameters, this.getHeaders());

    // 4) REST 호출
    RestTemplate restTemplate = new RestTemplate();
    kakaoReady = restTemplate.postForObject(
            "https://kapi.kakao.com/v1/payment/ready",
            requestEntity,
            KakaoReadyResponse.class
    );

    // 5) 반환값에 식별용 ID 세팅
    kakaoReady.setPartner_order_id(amount.getPartner_order_id());
    kakaoReady.setPartner_user_id(amount.getPartner_user_id());

    return ResponseEntity.ok(kakaoReady);
}

기능 설명

  1. 요청 파라미터 세팅
    • cid : 가맹점 코드
    • partner_order_id : 주문 번호(시스템에서 설정)
    • partner_user_id : 사용자 ID
    • item_name : 상품명
    • quantity : 수량
    • total_amount : 결제 금액(총액)
    • vat_amount : 부가세 금액
    • tax_free_amount : 비과세 금액
  2. Callback URL 설정 (로컬 개발 환경)
    • approval_url : 결제 승인 성공 시 카카오페이가 호출할 URL
    • cancel_url : 결제 취소 시 카카오페이가 호출할 URL
    • fail_url : 결제 실패 시 카카오페이가 호출할 URL
  3. HttpEntity 생성
    • parameters(폼 데이터)와 getHeaders()에서 생성한 헤더를 합쳐 HttpEntity에 담음.
  4. REST API 호출
    • RestTemplate restTemplate = new RestTemplate();

    • postForObject("https://kapi.kakao.com/v1/payment/ready", requestEntity, KakaoReadyResponse.class)

      → 카카오페이 /v1/payment/ready 엔드포인트에 POST 요청

    • 반환된 KakaoReadyResponse 객체(tid, next_redirect_pc_url 등 포함)를 kakaoReady 필드에 저장.

  5. 식별용 ID 세팅
    • 클라이언트 요청 시 전달했던 partner_order_id와 partner_user_id를 kakaoReady에 다시 설정하여, 이후 승인 요청 시 사용.
  6. ResponseEntity.ok(kakaoReady) 반환
    • 컨트롤러 레이어로 JSON 형태(200 OK)로 KakaoReadyResponse를 전달.