카카오페이 API 사용하기 (단건결제 - 결제 승인 요청하기)
1 단계 : 결제 승인하기 기본 정보 확인하기
결제 준비하기 요청과 마찬가지다. post방식으로 url 헤더에 Authorization과 Content-Type을 보내고,
body에는 본문에 요구되는 정보를 보내면 된다. body에 들어갈 정보는 필수에 표시된 것만 보내도 된다.
2 단계 : 응답 클래스 작성하기
@ToString
@Getter @Setter
public class KakaoApproveResponse {
private String aid; //요청 고유번호
private String tid; //결제 고유번호
private String cid; //가맹점 코드
private String sid; //정기결제용 id
private String partner_order_id; //가맹점 주문번호
private String partner_user_id; //가맹점 회원 id
private String payment_method_type; //결제수단
private Amount amount; //결제금액 정보
private CardInfo card_info; //결제 상세 정보
private String item_name; //상품이름
private String item_code; //상품 코드
private Long quantity; //상품 수량
private String created_at; //결제 준비 요청 시각
private String approved_at; //결제 승인 시간
private String payload; //결제 승인 요청에 대한 저장 값
}
카카오페이 api에 나와있는 정보들 중 각자 필요한 정보만으로 클래를 다르게 구성해도 상관 없다.
만약 관련된 정보가 필요하다면 Amount, CardInfo 등의 클래스를 생성해 응답을 받아야 한다.
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을 담는다.
4 단계 : 결제 준비하기 Service 작성
public KakaoApproveResponse ApproveResponse(@RequestBody KaKaoApproveReqDto kaKaoApproveReqDto){
MultiValueMap<String, String> parameterValue = new LinkedMultiValueMap<>();
parameterValue.add("cid", cid);
parameterValue.add("tid", "결제 고유번호");
parameterValue.add("partner_order_id", "가맹점 주문번호");
parameterValue.add("partner_user_id", "가맹점 회원 id");
parameterValue.add("pg_token", "결제 승인요청을 인증하는 토큰");
HttpEntity<MultiValueMap<String,String>> requestEntity = new HttpEntity<>(parameterValue, this.getHeaders());
//외부에 보낼 url
RestTemplate resetTemplate = new RestTemplate();
//api 요청
KakaoApproveResponse approveResponse = resetTemplate.postForObject(
"https://kapi.kakao.com/v1/payment/approve",
requestEntity,
KakaoApproveResponse.class
);
return approveResponse;
}
1. MultiValueMap 타입인 parameterValue를 생성 후 body에 들어갈 값을 채운다.
2. tid는 결제 고유번호로, 값은 는 '결제 준비하기' 요청에 대한 응답에 담겨있다.
3. pg_token은 사용자가 결제를 완료하면 결제 성공시 이동하는 url에 파라미터로 값이 담겨있다.
4. restTemplate를 활용하여 카카오페이 서버에 요청을 보낸다.
5. approveResponse로 응답을 받은 후 반환한다.
4 단계 : 결제 준비하기 Controller 작성
@Controller
@RequestMapping("/payment")
@RequiredArgsConstructor
public class KakaoPayController {
private final KakaoPayService kakaoPayService;
@PostMapping("/success") //결제승인요청
public ResponseEntity afterPayRequest(@RequestBody KaKaoApproveReqDto kaKaoApproveReqDto){
KakaoApproveResponse approveResponse = kakaoPayService.ApproveResponse(kaKaoApproveReqDto);
return new ResponseEntity(approveResponse, HttpStatus.OK);
}
}
- 카카오페이 API 사용하기 (단건결제 - 결제 취소하기)
1 단계 : 결제 취하기 기본 정보 확인하기
결제 준비하기 요청과 마찬가지이며, post방식으로 url 헤더에 Authorization과 Content-Type을 보내고,
body에는 본문에 요구되는 정보를 보내면 된다. body에 들어갈 정보는 필수에 표시된 것만 보내도 된다.
2 단계 : 응답 클래스 작성하기
@ToString
@Getter @Setter
public class KakaoCancelResponse {
private String aid; //요청 고유 번호
private String tid; //결제 고유 번호
private String cid; //가맹점 코드
private String status; //결제 상태
private String partner_order_id; //가맹점 주문번호
private String partner_user_id; //가맹점 회원 id
private String payment_method_type; //결제 수단
private Amount amount; //결제 금액 정보
private ApprovedCancelAmount approved_cancel_amount; //취소된 금액
private CanceledAmount canceled_amount; //누계 취소 금액
private CancelAvailableAmount cancel_available_amount; //남은 취소 가능 금액
private String name; //상품 이름
private String item_code; //상품 코드
private int quantity; //상품 수량
private String created_at; //결제 준비 요청 시각
private String approved_at; //결제 승인 시각
private String canceled_at; //결제 취소 시각
private String payload; //취소 요청시 전달한 값
}
카카오페이 api에 나와있는 정보들 중 각자 필요한 정보만으로 클래를 다르게 구성해도 상관 없다.
만약 관련된 정보가 필요하다면 Amount, CardInfo 등의 클래스를 생성해 응답을 받아야 한다.
3단계 : 카카오페이 api 요청 헤더 준비하기 (결제 준비하기/승인 요청하기와 동일)
4 단계 : 결제 준비하기 Service 작성
public KakaoCancelResponse kakaoPayCancel(@RequestBody KakaoCancleReqDto kakaoCancleReqDto){
MultiValueMap<String, String> parameterValue = new LinkedMultiValueMap<>();
parameterValue.add("cid", cid);
parameterValue.add("tid", "결제 고유번호");
parameterValue.add("cancel_amount", "결제 취소 금액");
parameterValue.add("cancel_tax_free_amount", "취소 비과세 금액");
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(parameterValue, this.getHeaders());
//외부에 보낼 url
RestTemplate restTemplate = new RestTemplate();
KakaoCancelResponse cancelResponse = restTemplate.postForObject(
"https://kapi.kakao.com/v1/payment/cancel",
requestEntity,
KakaoCancelResponse.class
);
return cancelResponse;
}
1. MultiValueMap 타입인 parameterValue를 생성 후 body에 들어갈 값을 채운다.
2. tid는 결제 고유번호로, 값은 는 '결제 준비하기' 요청에 대한 응답에 담겨있다.
3. restTemplate를 활용하여 카카오페이 서버에 요청을 보낸다.
4. cancelResponse로 응답을 받은 후 반환한다.
4 단계 : 결제 준비하기 Controller 작성
@Controller
@RequestMapping("/payment")
@RequiredArgsConstructor
public class KakaoPayController {
private final KakaoPayService kakaoPayService;
@PostMapping("/cancel") //결제취소요청
public ResponseEntity cancelPayRequest(@RequestBody KakaoCancleReqDto kakaoCancleReqDto){
KakaoCancelResponse cancelResponse = kakaoPayService.kakaoPayCancel(kakaoCancleReqDto);
return new ResponseEntity(cancelResponse, HttpStatus.OK);
}
}
(/≧▽≦)/
카카오페이 api 사용하기 1탄 - 카카오페이 api 이해하기, 결제 준비하기
[SpringBoot] 카카오페이 API SpringBoot에 적용하기 (1 - 결제 준비하기)
- 카카오페이 API 사전 설명 카카오페이 API는 다른 API와 달리 서버에서 통신을 해야 한다. 그 이유는 cors 정책 때문인데, 카카오페이는 보안과 관련하여 cors를 닫아놓아서 서버에서 우회하여 요청
zhddkfxks1-coding.tistory.com
'백엔드' 카테고리의 다른 글
[Spring JPA] @ModelAttribute 사용 시 nullException 해결 (0) | 2023.11.21 |
---|---|
[SpringBoot] 카카오페이 API SpringBoot에 적용하기 (1 - 결제 준비하기) (0) | 2023.08.20 |
[Spring] RestTemplate이란? (0) | 2023.08.15 |
[Spring] MultiValueMap이란 무엇일까? (0) | 2023.07.26 |
[Spring JPA] 스프링 데이터 JPA 쿼리 메서드 기능 (0) | 2023.07.23 |