코딩 노트
결제01 - (카카오페이 api) + 카멜케이스 변환 본문
WebSocket은 꼭 채팅만이 아닌 알림이나 다른 경우에도 사용할 수 있다.
결제
spring21pay 프로젝트 생성 후 pom.xml(jsp 의존성)과 properties(이전 패키지에서 설정 가져오기) 수정
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 |