백엔드

[SpringBoot] 카카오페이 API SpringBoot에 적용하기 (1 - 결제 준비하기)

콩지연 2023. 8. 20. 00:55

- 카카오페이 API 사전 설명

카카오페이 API는 다른 API와 달리 서버에서 통신을 해야 한다.

그 이유는 cors 정책 때문인데, 카카오페이는 보안과 관련하여 cors를 닫아놓아서 서버에서 우회하여 요청을 보내야 한다. 

1 단계 : 클라이언트가 백엔드 서버에게 결제 요청

2 단계 : 백엔드 서버 단에서 결제 요청 정보를 카카오페이 서버에 전달

3 단계 : 카카오페이 서버에서 사용자 정보를 받아 사용자 인증

4 단계 : 백엔드 서버 단에서 사용자 인증 후 결제 승인 정보를 카카오페이 서버에 전달

5 단계 : 카카오페이 서버에서 최종 결제 처리 완료

6 단계 : 서버가 카카오페이 서버로부터 받은 응답을 클라이언트에게 전달

 

 

카카오페이 API 시작하기


1 단계 : 카카오페이 api 페이지 접속

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

사이트에 접속 후 로그인을 한다.

 

 

2 단계 : 내 어플리케이션에 들어간 후 어플리케이션 추가하기 선택

앱 이름과 사업자 명을 작성하고 어플리케이션을 추가한다.

카카오페이 api를 실제 사업장에서 사용하는 것이 아닌 테스트 용도라면, 아무 이름이나 적어도 되며 이미지는 상관없다.

 

 

3 단계 : 왼쪽 목록에 플랫폼 선택 후 url/도메인 작성

web에서만 사용할 것이라면, web만 등록하는 것이 가능하며, 모바일에서도 사용할 시 모바일 플랫폼 등록을 하면 된다.

web 사이트 도메인은 결제 요청, 승인, 취소의 화면을 띄울 도메인을 작성하는데, 대부분 localhost:3000으로 하지만,

나는 배포를 했기 때문에 배포 당시 url을 작성했다.

 

 

카카오페이 API 사용하기 (단건결제 - 결제 준비하기)


1 단계 : 결제 준비하기기본 정보 확인하기

api에 나와있는 것처럼 서버단에서 post방식으로 url 헤더에  Authorization과 Content-Type을 보내고,

body에는 본문에 요구되는 정보를 보내면 된다. body에 들어갈 정보는 필수에 표시된 것만 보내도 된다.

 

 

2 단계 : 응답 클래스 작성하기

@ToString
@Getter @Setter
public class KakaoReadyResponse {
    private String tid;                     	//결제 고유번호
    private String next_redirect_pc_url;     	//클라이언트가 웹일 경우 결제 페이지 url
    private String created_at;             	//결제 준비 요청 시간
}

카카오페이 api에 나와있는 정보들 중  각자 필요한 정보만으로 클래를 다르게 구성해도 상관 없다.

 

 

3단계 : 카카오페이 api 요청 헤더 준비하기

@Service
@Transactional
@RequiredArgsConstructor
public class KakaoPayService {

    static final String cid = "TC0ONETIME";                         //TEST 가맹점 코드
    static final String adminKey = "자신의 adminkey 입력";          //admin 코드

    //카카오 요구 헤더값
    private HttpHeaders getHeaders() {
        HttpHeaders httpHeaders = new HttpHeaders();

        String auth = "KakaoAK " + adminKey;
        String contentType = "application/x-www-form-urlencoded;charset=utf-8";

        httpHeaders.add("Authorization", auth);
        httpHeaders.add("Content-type", contentType);

        return httpHeaders;
    }
    
}

1. cid는 가맹점 코드를 의미하며, 만약 사업자 등록이 되지 않은 사이트에 카카오페이 시스템을 적용하고 싶다면, "TC0ONETIME"로 카카오페이에서 제공하는 테스트 가맹점 코드로 카카오페이 시스템을 구현할 수 있다.

2. adminKey는 권한 값으로 , 내 어플리케이션 > 개요 > 앱정보 > 앱 키를 선택하면 AdminKey를 확인할 수 있다.3. 카카오페이에서 요구하는 값을 httpHeader에 Authorization와 Content-type을 담는다.

 

 

3 단계 : 결제 준비하기 Service 작성

@Service
@Transactional
@RequiredArgsConstructor
public class KakaoPayService {

    static final String cid = "TC0ONETIME";                              //TEST 가맹점 코드
    static final String adminKey = "자신의 adminkey 입력";   		 //admin 코드

    private KakaoReadyResponse readyResponse;				//결제 준비하기 응답 클래스

    //카카오페이 결제 준비 요청
    public KakaoReadyResponse kakaoPayReady(KaKaoReadyReqDto kaKaoReadyReqDto) {

        MultiValueMap<String, String> parameterValue = new LinkedMultiValueMap<>();

        parameterValue.add("cid", cid);
        parameterValue.add("partner_order_id", "가맹점 주문번호");                        
        parameterValue.add("partner_user_id", "가맹점 회원 id");              
        parameterValue.add("item_name", "상품 이름");                                  
        parameterValue.add("quantity", "상품 수량");                                          
        parameterValue.add("total_amount", "상품 총액");      
        parameterValue.add("tax_free_amount", "상품 비과세 금액");                                      
        parameterValue.add("approval_url", "결제 성공시 이동할 url");     
        parameterValue.add("cancel_url", "결제 취소 시 이동할 url");           
        parameterValue.add("fail_url", "결제 실패시 이동할 url");               

        //파라미터, 헤더
        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(parameterValue, this.getHeaders());

        //카카오에게 보낼 url
        RestTemplate restTemplate = new RestTemplate();

        //api 요청
        readyResponse = restTemplate.postForObject(
                "https://kapi.kakao.com/v1/payment/ready",  	//url
                    requestEntity,                              //본문
                    KakaoReadyResponse.class                    //응답 클래스
        );

        return readyResponse;
    }
}

1. MultiValueMap 타입인 parameterValue를 생성 후 body에 들어갈 값을 채운다.

2. requestEntity에 header와 body를 넣은 후

3. restTemplate를 활용하여 카카오페이 서버에 요청을 보낸다.

4. readyResponse로 응답을 받은 후 반환한다.

 

 

4 단계 : 결제 준비하기 Controller 작성

@Controller
@RequestMapping("/payment")
@RequiredArgsConstructor
public class KakaoPayController {

    private final KakaoPayService kakaoPayService;

    @PostMapping("/ready")  //결제준비요청
    public ResponseEntity<?> readyToKakaoPay(@RequestBody KaKaoReadyReqDto kaKaoReadyReqDto){
        KakaoReadyResponse readyResponse = kakaoPayService.kakaoPayReady(kaKaoReadyReqDto);
        return new ResponseEntity<>(readyResponse, HttpStatus.OK);
    }

}

 

 

 

(/≧▽≦)/

카카오페이 api 사용하기 2탄 - 결제 승인하기, 결제 취소하기

 

[SpringBoot] 카카오페이 API SpringBoot에 적용하기 (2 - 결제 승인하기, 취소하기)

- 카카오페이 API 사용하기 (단건결제 - 결제 승인 요청하기) 1 단계 : 결제 승인하기 기본 정보 확인하기 결제 준비하기 요청과 마찬가지이며, post방식으로 url 헤더에 Authorization과 Content-Type을 보

zhddkfxks1-coding.tistory.com