코딩 노트

결제01 - (카카오페이 api) + 카멜케이스 변환 본문

Spring

결제01 - (카카오페이 api) + 카멜케이스 변환

newbyeol 2023. 10. 24. 11:21

WebSocket은 꼭 채팅만이 아닌 알림이나 다른 경우에도 사용할 수 있다.

결제

spring21pay 프로젝트 생성 후 pom.xml(jsp 의존성)과 properties(이전 패키지에서 설정 가져오기) 수정

21pay project
사용자 입장에서 봤을 때 결제
결제 준비 과정

https://developers.kakao.com/docs/latest/ko/kakaopay/single-payment

어느 주소에서 들어온 건지 알 수 있다. (어디서 많이 경로를 타고 들어오는지)

test 프로젝트에 Test01Ready 파일 생성

@Slf4j

@SpringBootTest

public class Test01Ready {

 

@Test

public void test() throws URISyntaxException {

//웹서버에서 PG사(제 3의 서버)로 요청을 보내기 위해선 다음 둘 중 하나가 필요

//- [1] RestTemplate를 이용해서 처리

//- [2] WebClient를 이용해서 처리(함수형 프로그램에 대한 이해 필요)

 

// 전송 도구 생성

RestTemplate template = new RestTemplate();

 

// 주소 설정

URI uri = new URI("요청을 보내고 싶은 주소"); //페이지만 url이라 부르고 페이지를 포함한 여러가지 리소스 즉 넓은 의미로 쓰이는 것이 uri

 

// 헤더 설정

HttpHeaders headers = new HttpHeaders(); //springframework를 import 해야함

headers.add("key", "value");

 

// 바디 설정

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

body.add("key", "value");

 

// 요청 발송

//HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(body, headers); //원형

HttpEntity entity = new HttpEntity(body, headers);

 

}

 

}

${}는 변수를 말한다. 저 곳에는 내 어드민 키를 넣는 것

Test01Ready 수정

@Slf4j

@SpringBootTest

public class Test01Ready {

 

@Test

public void test() throws URISyntaxException {

//웹서버에서 PG사(제 3의 서버)로 요청을 보내기 위해선 다음 둘 중 하나가 필요

//- [1] RestTemplate를 이용해서 처리

//- [2] WebClient를 이용해서 처리(함수형 프로그램에 대한 이해 필요)

 

// 전송 도구 생성

RestTemplate template = new RestTemplate();

 

// 주소 설정

URI uri = new URI("https://kapi.kakao.com/v1/payment/ready"); //페이지만 url이라 부르고 페이지를 포함한 여러가지 리소스 즉 넓은 의미로 쓰이는 것이 uri

 

// 헤더 설정

HttpHeaders headers = new HttpHeaders(); //springframework를 import 해야함

headers.add("Authorization", "KakaoAK 2~...");

headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");

 

// 바디 설정

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

body.add("cid", "TC0ONETIME"); //개발자용 가맹점 코드

body.add("partner_order_id", UUID.randomUUID().toString()); //가맹점 주문번호

body.add("partner_user_id", "testuser1"); //가맹점 회원아이디

body.add("item_name", "아이스 아메리카노 T"); //상품명(전체 주문 수 - 1)

body.add("quantity", "1"); //상품수량(무조건 1이라 쓰고 실제 구매수량은 DB에서 관리

body.add("total_amount", "3000"); //판매금액

body.add("tax_free_amount", "0"); //상품 비과세 금액

body.add("approval_url", "http://localhost:8080/pay/success"); //부가세

body.add("cancel_url", "http://localhost:8080/pay/cancel");

body.add("fail_url", "http://localhost:8080/pay/fail");

 

// 요청 발송

//HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(body, headers); //원형

HttpEntity entity = new HttpEntity(body, headers);

 

Map response = template.postForObject(uri, entity, Map.class);

//log.debug("response = {}", response);

log.debug("url = {}", response.get("next_redirect_pc_url"));


}

 

}

Test02Ready 파일 생성

변수로 뽑아봄

@Slf4j

@SpringBootTest

public class Test02Ready {

 

@Test

public void test() throws URISyntaxException {

//변하는 정보와 중요한 정보들을 분리하여 모듈로 개발

 

//결제시마다 변하는 정보 - 상품명, 상품가격, 주문번호, 구매자ID

String partnerOrderId = UUID.randomUUID().toString();

String partnerUserId = "testuser1";

String itemName = "슈퍼 울트라 노트북";

int itemPrice = 999990;

 

// 전송 도구 생성

RestTemplate template = new RestTemplate();

 

// 주소 설정

URI uri = new URI("https://kapi.kakao.com/v1/payment/ready"); //페이지만 url이라 부르고 페이지를 포함한 여러가지 리소스 즉 넓은 의미로 쓰이는 것이 uri

 

// 헤더 설정

HttpHeaders headers = new HttpHeaders(); //springframework를 import 해야함

headers.add("Authorization", "KakaoAK 2~...");

headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");

 

// 바디 설정

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

body.add("cid", "TC0ONETIME"); //개발자용 가맹점 코드

body.add("partner_order_id", partnerOrderId); //가맹점 주문번호

body.add("partner_user_id", partnerUserId); //가맹점 회원아이디

body.add("item_name", itemName); //상품명(전체 주문 수 - 1)

body.add("quantity", "1"); //상품수량(무조건 1이라 쓰고 실제 구매수량은 DB에서 관리

body.add("total_amount", String.valueOf(itemPrice)); //판매금액

body.add("tax_free_amount", "0"); //상품 비과세 금액

body.add("approval_url", "http://localhost:8080/pay/success"); //부가세

body.add("cancel_url", "http://localhost:8080/pay/cancel");

body.add("fail_url", "http://localhost:8080/pay/fail");

 

// 요청 발송

//HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(body, headers); //원형

HttpEntity entity = new HttpEntity(body, headers);

 

Map response = template.postForObject(uri, entity, Map.class);

//log.debug("response = {}", response);

log.debug("url = {}", response.get("next_redirect_pc_url"));

}

 

}

vo 패키지 생성 후 KakaoPayReadyRequestVO 클래스 생성

@Data @NoArgsConstructor @AllArgsConstructor @Builder

public class KakaoPayReadyRequestVO {

private String partnerOrderId;

private String partnerUserId;

private String itemName;

private int itemPrice;

}

Test03Ready 파일 생성

클래스로 만듬

@Slf4j

@SpringBootTest

public class Test03Ready {

 

@Test

public void test() throws URISyntaxException {

//변하는 정보와 중요한 정보들을 분리하여 모듈로 개발

 

//결제 준비 요청 정보를 클래스로 모듈화 (KakaoPayReadyRequestVO)

KakaoPayReadyRequestVO request = KakaoPayReadyRequestVO.builder()

.partnerOrderId(UUID.randomUUID().toString())

.partnerUserId("testuser1")

.itemName("초코파이 1box")

.itemPrice(3500)

.build();

String partnerOrderId = UUID.randomUUID().toString();

String partnerUserId = "testuser1";

String itemName = "슈퍼 울트라 노트북";

int itemPrice = 999990;

 

// 전송 도구 생성

RestTemplate template = new RestTemplate();

 

// 주소 설정

URI uri = new URI("https://kapi.kakao.com/v1/payment/ready"); //페이지만 url이라 부르고 페이지를 포함한 여러가지 리소스 즉 넓은 의미로 쓰이는 것이 uri

 

// 헤더 설정

HttpHeaders headers = new HttpHeaders(); //springframework를 import 해야함

headers.add("Authorization", "KakaoAK 2~...");

headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");

 

// 바디 설정

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

body.add("cid", "TC0ONETIME"); //개발자용 가맹점 코드

body.add("partner_order_id", request.getPartnerOrderId()); //가맹점 주문번호

body.add("partner_user_id", request.getPartnerUserId()); //가맹점 회원아이디

body.add("item_name", request.getItemName()); //상품명(전체 주문 수 - 1)

body.add("quantity", "1"); //상품수량(무조건 1이라 쓰고 실제 구매수량은 DB에서 관리

body.add("total_amount", String.valueOf(request.getItemPrice())); //판매금액

body.add("tax_free_amount", "0"); //상품 비과세 금액

body.add("approval_url", "http://localhost:8080/pay/success"); //부가세

body.add("cancel_url", "http://localhost:8080/pay/cancel");

body.add("fail_url", "http://localhost:8080/pay/fail");

 

// 요청 발송

//HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(body, headers); //원형

HttpEntity entity = new HttpEntity(body, headers);

 

Map response = template.postForObject(uri, entity, Map.class);

//log.debug("response = {}", response);

log.debug("url = {}", response.get("next_redirect_pc_url"));

}

 

}

 

결제 성공하면 성공 설정 페이지로 감

KakaoPayReadyResponseVO 클래스 생성

@JsonIgnoreProperties

@Data @Builder @NoArgsConstructor @AllArgsConstructor

public class KakaoPayReadyResponseVO {

private String tid; //결제 고유번호

private String next_redirect_app_url; //모바일 앱용 결제 페이지 주소

private String next_redirect_mobile_url; //모바일 웹용 결제 페이지 주소

private String next_redirect_pc_url; // PC 웹용 결제 페이지 주소

private String android_app_scheme; //카카오페이 결제를 위한 안드로이드 스킴

private String ios_app_scheme; //카카오페이 결제를 위한 아이폰 스킴

private Date created_at; //결제 준비를 요청한 시각

}

Test03Ready 파일 수정

@Slf4j

@SpringBootTest

public class Test03Ready {

 

@Test

public void test() throws URISyntaxException {

//변하는 정보와 중요한 정보들을 분리하여 모듈로 개발

 

//결제 준비 요청 정보를 클래스로 모듈화 (KakaoPayReadyRequestVO)

KakaoPayReadyRequestVO request = KakaoPayReadyRequestVO.builder()

.partnerOrderId(UUID.randomUUID().toString())

.partnerUserId("testuser1")

.itemName("초코파이 1box")

.itemPrice(3500)

.build();

String partnerOrderId = UUID.randomUUID().toString();

String partnerUserId = "testuser1";

String itemName = "슈퍼 울트라 노트북";

int itemPrice = 999990;

 

// 전송 도구 생성

RestTemplate template = new RestTemplate();

 

//(+추가) SNAKE_CASE를 CAMEL_CASE로 처리하도록 추가 도구를 설정

ObjectMapper mapper = new ObjectMapper();

mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

 

MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();

converter.setObjectMapper(mapper);

 

template.getMessageConverters().add(0,converter);

 

// 주소 설정

URI uri = new URI("https://kapi.kakao.com/v1/payment/ready"); //페이지만 url이라 부르고 페이지를 포함한 여러가지 리소스 즉 넓은 의미로 쓰이는 것이 uri

 

// 헤더 설정

HttpHeaders headers = new HttpHeaders(); //springframework를 import 해야함

headers.add("Authorization", "KakaoAK 2~...");

headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");

 

// 바디 설정

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

body.add("cid", "TC0ONETIME"); //개발자용 가맹점 코드

body.add("partner_order_id", request.getPartnerOrderId()); //가맹점 주문번호

body.add("partner_user_id", request.getPartnerUserId()); //가맹점 회원아이디

body.add("item_name", request.getItemName()); //상품명(전체 주문 수 - 1)

body.add("quantity", "1"); //상품수량(무조건 1이라 쓰고 실제 구매수량은 DB에서 관리

body.add("total_amount", String.valueOf(request.getItemPrice())); //판매금액

body.add("tax_free_amount", "0"); //상품 비과세 금액

body.add("approval_url", "http://localhost:8080/pay/success"); //부가세

body.add("cancel_url", "http://localhost:8080/pay/cancel");

body.add("fail_url", "http://localhost:8080/pay/fail");

 

// 요청 발송

//HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(body, headers); //원형

HttpEntity entity = new HttpEntity(body, headers);

 

KakaoPayReadyResponseVO response =

template.postForObject(uri, entity, KakaoPayReadyResponseVO.class);

log.debug("response = {}", response);

log.debug("url = {}", response.getNextRedirectPcUrl());

}

 

}

KakaoPayReadyResponseVO 클래스 수정

@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) //가장 최신 기술

//@JsonIgnoreProperties({"tms_result"})//특정 항목만 무시하도록 지정

@JsonIgnoreProperties(ignoreUnknown = true)//모르는 항목은 무시하도록 지정

@Data @Builder @NoArgsConstructor @AllArgsConstructor

public class KakaoPayReadyResponseVO {

private String tid;//결제 고유번호

//private String next_redirect_app_url;//모바일 앱용 결제 페이지 주소

private String nextRedirectAppUrl;

//private String next_redirect_mobile_url;//모바일 웹용 결제 페이지 주소

private String nextRedirectMobileUrl;

//private String next_redirect_pc_url;//PC 웹용 결제 페이지 주소

private String nextRedirectPcUrl;

//private String android_app_scheme;//카카오페이 결제를 위한 안드로이드 스킴

private String androidAppScheme;

//private String ios_app_scheme;//카카오페이 결제를 위한 아이폰 스킴

private String iosAppScheme;

//private Date created_at;//결제 준비를 요청한 시각

private Date createdAt;

}

properties 파일 구문 추가

custom.kakaopay.cid=TC0ONETIME

custom.kakaopay.key=2~...

configuration 패키지 생성 후 KakaoPayProperties 파일 생성

@Data

@Component

@ConfigurationProperties(prefix = "custom.kakaopay")

public class KakaoPayProperties {

private String cid, key;

}

Test04Ready 파일 생성

중요 정보들을 properties 파일로 이관

@Slf4j

@SpringBootTest

public class Test04Ready {

 

@Autowired

private KakaoPayProperties kakaoPayProperties;

 

@Test

public void test() throws URISyntaxException {

//변하는 정보와 중요한 정보들을 분리하여 모듈로 개발

 

//결제 준비 요청 정보를 클래스로 모듈화 (KakaoPayReadyRequestVO)

KakaoPayReadyRequestVO request = KakaoPayReadyRequestVO.builder()

.partnerOrderId(UUID.randomUUID().toString())

.partnerUserId("testuser1")

.itemName("초코파이 1box")

.itemPrice(3500)

.build();

String partnerOrderId = UUID.randomUUID().toString();

String partnerUserId = "testuser1";

String itemName = "슈퍼 울트라 노트북";

int itemPrice = 999990;

 

// 전송 도구 생성

RestTemplate template = new RestTemplate();

 

//(+추가) SNAKE_CASE를 CAMEL_CASE로 처리하도록 추가 도구를 설정

// ObjectMapper mapper = new ObjectMapper();

// mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

//

// MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();

// converter.setObjectMapper(mapper);

//

// template.getMessageConverters().add(0,converter);

 

// 주소 설정

URI uri = new URI("https://kapi.kakao.com/v1/payment/ready"); //페이지만 url이라 부르고 페이지를 포함한 여러가지 리소스 즉 넓은 의미로 쓰이는 것이 uri

 

// 헤더 설정

HttpHeaders headers = new HttpHeaders(); //springframework를 import 해야함

headers.add("Authorization", "KakaoAK "+kakaoPayProperties.getKey());

headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");

 

// 바디 설정

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

body.add("cid", kakaoPayProperties.getCid()); //개발자용 가맹점 코드

body.add("partner_order_id", request.getPartnerOrderId()); //가맹점 주문번호

body.add("partner_user_id", request.getPartnerUserId()); //가맹점 회원아이디

body.add("item_name", request.getItemName()); //상품명(전체 주문 수 - 1)

body.add("quantity", "1"); //상품수량(무조건 1이라 쓰고 실제 구매수량은 DB에서 관리

body.add("total_amount", String.valueOf(request.getItemPrice())); //판매금액

body.add("tax_free_amount", "0"); //상품 비과세 금액

body.add("approval_url", "http://localhost:8080/pay/success"); //부가세

body.add("cancel_url", "http://localhost:8080/pay/cancel");

body.add("fail_url", "http://localhost:8080/pay/fail");

 

// 요청 발송

//HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(body, headers); //원형

HttpEntity entity = new HttpEntity(body, headers);

 

KakaoPayReadyResponseVO response =

template.postForObject(uri, entity, KakaoPayReadyResponseVO.class);

log.debug("response = {}", response);

log.debug("url = {}", response.getNextRedirectPcUrl());

}

 

}

KakaoPayConfiguration 파일 생성

//카카오페이 서버와 통신을 위해 필요한 객체를 등록해두는 파일(RestTemplate, HttpHeaders)

@Configuration

public class KakaoPayConfiguration {

 

@Autowired

private KakaoPayProperties kakaoPayProperties;

 

@Bean

public RestTemplate template() {

RestTemplate template = new RestTemplate();

return template;

}

 

@Bean

public HttpHeaders headers() {

HttpHeaders headers = new HttpHeaders(); //springframework를 import 해야함

headers.add("Authorization", "KakaoAK "+kakaoPayProperties.getKey());

headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");

return headers;

}

 

}

service 패키지 생성 후 KakaoPayService 인터페이스 파일 생성

public interface KakaoPayService {

KakaoPayReadyResponseVO ready(KakaoPayReadyRequestVO request) throws URISyntaxException;

}

 KakaoPayServiceImpl 클래스 파일 생성

@Service

public class KakaoPayServiceImpl implements KakaoPayService {

 

@Autowired

private KakaoPayProperties kakaoPayProperties;

 

@Autowired

private RestTemplate template;

 

@Autowired

private HttpHeaders headers;

 

@Override

public KakaoPayReadyResponseVO ready(KakaoPayReadyRequestVO request) throws URISyntaxException {

// 주소 설정

URI uri = new URI("https://kapi.kakao.com/v1/payment/ready");

 

// 바디 설정

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

body.add("cid", kakaoPayProperties.getCid()); //개발자용 가맹점 코드

body.add("partner_order_id", request.getPartnerOrderId()); //가맹점 주문번호

body.add("partner_user_id", request.getPartnerUserId()); //가맹점 회원아이디

body.add("item_name", request.getItemName()); //상품명(전체 주문 수 - 1)

body.add("quantity", "1"); //상품수량(무조건 1이라 쓰고 실제 구매수량은 DB에서 관리

body.add("total_amount", String.valueOf(request.getItemPrice())); //판매금액

body.add("tax_free_amount", "0"); //상품 비과세 금액

body.add("approval_url", "http://localhost:8080/pay/success"); //부가세

body.add("cancel_url", "http://localhost:8080/pay/cancel");

body.add("fail_url", "http://localhost:8080/pay/fail");

 

// 요청 발송

HttpEntity entity = new HttpEntity(body, headers);

 

KakaoPayReadyResponseVO response =

template.postForObject(uri, entity, KakaoPayReadyResponseVO.class);

 

return response;

}

 

}

Test05Ready 파일 생성

@Slf4j

@SpringBootTest

public class Test05Ready {

 

@Autowired

private KakaoPayService kakaoPayService;

 

@Test

public void test() throws URISyntaxException {

KakaoPayReadyRequestVO request = KakaoPayReadyRequestVO.builder()

.partnerOrderId(UUID.randomUUID().toString())

.partnerUserId("testuser1")

.itemName("27인치 평면 모니터")

.itemPrice(300000)

.build();

 

KakaoPayReadyResponseVO response = kakaoPayService.ready(request);

log.debug("response = {}", response);

}

 

}

controller 패키지 생성 후 KakaoPayController 파일 생성

@Controller

@RequestMapping("/pay")

public class KakaoPayController {

 

@Autowired

private KakaoPayService kakaoPayService;

 

@GetMapping("/test1")

public String test1() {

//return "/WEB-INF/views/pay/test1.jsp";

return "pay/test1";

}

 

@PostMapping("/test1")

public String test1(@ModelAttribute KakaoPayReadyRequestVO request) throws URISyntaxException {

request.setPartnerOrderId(UUID.randomUUID().toString()); //임시로 추가

KakaoPayReadyResponseVO response = kakaoPayService.ready(request);

return "redirect:" + response.getNextRedirectPcUrl();

}

 

}

test1.jsp 파일 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

 

<h1>무식한 구매 페이지</h1>

 

<form method="post">

아이디 <input type="text" name="partnerUserId"> <br><br>

상품명 <input type="text" name="itemName"> <br><br>

판매가 <input type="text" name="itemPrice"> <br><br>

<button type="submit">구매하기</button>

</form>

KakaoPayServiceImpl 수정

//현재 페이지 주소 계산

String path = ServletUriComponentsBuilder

.fromCurrentRequestUri().toUriString();

body.add("approval_url", path+"/success"); //부가세

body.add("cancel_url", path+"/cancel");

body.add("fail_url", path+"/fail");

Test06Approve 파일 생성

@Slf4j

@SpringBootTest

public class Test06Approve {

 

@Autowired

private RestTemplate template;

 

@Autowired

private HttpHeaders headers;

 

@Autowired

private KakaoPayProperties kakaoPayProperties;

 

@Test

public void test() throws URISyntaxException {

URI uri = new URI("https://kapi.kakao.com/v1/payment/approve");

 

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

body.add("cid", kakaoPayProperties.getCid());

body.add("tid", "T53769202b8b1abb00b0"); //거래번호

body.add("partner_order_id", "691995d1-ff2c-474c-8c66-2745381b0e80");//Test04Ready실행 시킨 후 결과 가져와서 진행

body.add("partner_user_id", "testuser1");

body.add("pg_token", "637b6195473c3f226bdb");

 

HttpEntity entity = new HttpEntity(body,headers);

 

Map response = template.postForObject(uri, entity, Map.class);

log.debug("response = {}", response);

 

}

 

}

Test06Approve 테스트를 위해 Test04Ready 파일에 이 구문을 추가해서 실행한 뒤 결제 완료 후 pg토큰과 주문번호, 거래번호를 가져와서 하기

//다음 테스트를 위해 필요한 값을 출력

log.debug("결제페이지 = {}", response.getNextRedirectAppUrl());

log.debug("tid = {}", response.getTid());

log.debug("partner_order_id = {}", request.getPartnerOrderId());

log.debug("partner_user_id = {}", request.getPartnerUserId());

KakaoPayService 에 구문 추가

public interface KakaoPayService {

KakaoPayReadyResponseVO ready(KakaoPayReadyRequestVO request) throws URISyntaxException;

KakaoPayApproveResponseVO approve(KakaoPayApproveRequestVO request) throws URISyntaxException;

// KakaoPayDetailResponseVO detail(KakaoPayDetailRequestVO request) throws URISyntaxException;

// KakaoPayCancelResponseVO cancel(KakaoPayCancelRequestVO request) throws URISyntaxException;

}

KakaoPayServiceImpl 에 구문 추가

@Override

public KakaoPayApproveResponseVO approve(KakaoPayApproveRequestVO request) throws URISyntaxException {

// TODO Auto-generated method stub

return null;

}

KakaoPayApproveRequestVO 파일 생성

@Data @Builder @NoArgsConstructor @AllArgsConstructor

public class KakaoPayApproveRequestVO {

private String cid, tid, partnerOrderId, partnerUserId, pgToken;

 

}

KakaoPayApproveResponseVO 파일 생성

@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)

@JsonIgnoreProperties(ignoreUnknown = true)

@Data @Builder @NoArgsConstructor @AllArgsConstructor

public class KakaoPayApproveResponseVO {

private String aid, tid, cid, sid; // 요청/거래/가맹점/정기결제 코드

private String partnerOrderId, partnerUserId;

private String paymentMethodType; //결제수단(CARD/MONEY)

 

private KakaoPayAmountVO amount;

private KakaoPayCardInfoVO cardInfo;

 

private String itemName, itemCode;

private int quantity; //수량

private Date createdAt, approvedAt; // 준비/승인 시각

private String payload; //메모

 

}

KakaoPayAmountVO 파일 생성

@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)

@JsonIgnoreProperties(ignoreUnknown = true)

@Data @Builder @NoArgsConstructor @AllArgsConstructor

public class KakaoPayAmountVO { //Amount라는 데이터 타입이 나오면 이거를 쓰겠다.

private int total, taxFree, vat, point, discount, greenDeposit;

}

KakaoPayCardInfoVO 파일 생성

@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)

@JsonIgnoreProperties(ignoreUnknown = true)

@Data @Builder @NoArgsConstructor @AllArgsConstructor

public class KakaoPayCardInfoVO {

private String purchaseCorp, purchaseCorpCode;

private String issuerCorp, issuerCorpCode;

private String kakaopayPurchaseCorp, kakaopayPurchaseCorpCode;

private String kakaopayIssuerCorp, kakaopayIssuerCorpCode;

private String bin;

private String cardType;

private String installMonth;

private String approvedId;

private String cardMid;

private String interestFreeInstall;

private String cardItemCode;

}

'Spring' 카테고리의 다른 글

결제03 - 수량추가 + 조회 + 단건취소  (0) 2023.10.26
결제02 - 단건결제  (0) 2023.10.25
DM을 어떻게 보내는가  (0) 2023.10.23
웹소켓 - 실시간 채팅, 반응형 디자인  (0) 2023.10.23
실시간 채팅(WebSocket)  (0) 2023.10.20