1. 네이버페이 API 결제 프로세스
* 네이버페이는 javascripts SDK와 api요청 방식이 있는데, 여기서는 api요청 방식을 사용한다.
네이버페이 결제를 이용하기 위해서는 크게 "결제예약" / "결제승인" 단계가 필요하다.
먼저, 결제 전 "결제예약" 단계의 request 요청을 통해 상품명, 상품가격, 가맹점키 등의 파라미터를 통해 결제 예약ID를 응답받아야 한다.
결제 준비 요청 단계에서 응답 받은 결제예약ID를 통해 결제창을 호출한다.
결제창에서 결제 수단을 선택하면 페이먼트ID라는 응답값을 받게 되고, 이 응답값을 통해 최종 결제를 요청한다.
네이버 페이 간편결제 도메인
네이버페이 개발 서버(dev-service-server)
- PC 웹 : test-pay.naver.com
- 모바일 웹 : test-m.pay.naver.com
네이버페이 운영 서버(dev-service-server)
- PC 웹 : pay.naver.com
- 모바일 웹 : m.pay.naver.com
2. 네이버페이 API
1. 결제예약 api 호출
사용자가 네이버페이 결제 버튼을 클릭하였을 때 ajax를 통해 네이버페이 결제예약ID를 받아와 결제창을 호출하여 준다.
$("#naverbtn").click(function (){
/**
* 결제 버튼 클릭 시
* 이름 / 배송지 등등.. 필수정보 입력 유효성 체크
* 여기서는 생략
*/
/**
* @ data 화면에서 입력받을 수 있는 기본 결제 정보만 넘겨주기 (나머지는 뒤에서 처리)
* @ return 카카오톡 결제요청 페이지
*/
$.ajax({
type:'get',
url:'/pay/naver',
data:{
productName : "아이폰 14 pro",
productCount : "1",
totalPayAmount : "1400000",
taxScopeAmount : "1400000",
taxExScopeAmount : "0"
},
success:function(res){
console.log(res);
location.href = "https://test-pay.naver.com/payments/" + res.body.reserveId;
}
})
});
컨트롤러
@GetMapping("/pay/naver")
public @ResponseBody Map<String, Object> naverPay(@RequestParam Map<String, Object> params){
Map<String, Object> res = payService.naverPay(params);
return res;
}
서비스
public Map<String, Object> naverPay(Map<String, Object> params){
HttpHeaders headers = new HttpHeaders();
headers.set("X-Naver-Client-Id", clientId);
headers.set("X-Naver-Client-Secret", secret);
headers.set("Content-Type", "application/json");
Map<String, Object> payParams = new HashMap<String, Object>();
payParams.put("merchantPayKey", "KAO20230318002");
payParams.put("merchantUserKey", "사용자하나둘셋");
payParams.put("productName", params.get("productName"));
payParams.put("productCount", params.get("productCount"));
payParams.put("totalPayAmount", params.get("totalPayAmount"));
payParams.put("taxScopeAmount", params.get("taxScopeAmount"));
payParams.put("taxExScopeAmount", params.get("taxExScopeAmount"));
payParams.put("returnUrl", "http://localhost:8080/pay/success");
//상품관련정보'
List<Map<String, Object>> items = new ArrayList<Map<String, Object>>();
Map<String, Object> item = new HashMap<String, Object>();
item.put("categoryType", "PRODUCT");
item.put("categoryId", "GENERAL");
item.put("uid", "iphone");
item.put("name", "아이폰");
item.put("count", 1);
items.add(item);
payParams.put("productItems", items);
JSONObject jObj = new JSONObject(payParams);
//네이버페이 결제준비 api 요청
HttpEntity<?> request = new HttpEntity<>(jObj.toString(), headers);
RestTemplate template = new RestTemplate();
String url = "https://dev.apis.naver.com/" + partnerId + "/naverpay/payments/v2/reserve";
//요청결과
Map<String, Object> res = template.postForObject(url, request, Map.class);
return res;
}
이제 네이버페이 버튼을 클릭하면 결제창이 오픈된다.
해당 결제창에서 결제를 완료하면, 아래와 같이 페이지가 이동된다.
Redirect: {your-returnUrl}?resultCode=Success&paymentId={네이버페이 결제번호}
2. 결제승인 api 호출
결제창에서 결제 완료 후 응답으로 온 네이버페이 결제번호를 통해 결제 승인 api를 호출한다.
컨트롤러
@GetMapping("/pay/success")
public String NaverpaySuccess(@RequestParam("resultCode") String code, @RequestParam("paymentId") String paymentId) {
Map<String, Object> res = payService.naverPayApprove(paymentId);
/*
* 요청 결과에 대해서 데이터 베이스에 저장할 로직 추가
* */
return "/pay/success";
}
서비스
public Map<String, Object> naverPayApprove(String paymentId){
HttpHeaders headers = new HttpHeaders();
headers.set("X-Naver-Client-Id", clientId);
headers.set("X-Naver-Client-Secret", secret);
MultiValueMap<String, Object> payParams = new LinkedMultiValueMap<String, Object>();
payParams.add("paymentId", paymentId);
//네이버페이 결제승인 api 요청
HttpEntity<?> request = new HttpEntity<>(payParams, headers);
RestTemplate template = new RestTemplate();
String url = "https://dev.apis.naver.com/" + partnerId + "/naverpay/payments/v2/apply/payment";
//요청결과
Map<String, Object> res = template.postForObject(url, request, Map.class);
return res;
}
데이터베이스에 저장하는 로직이랑,
사용자번호/상품번호 관련된 로직 등 추가해서 다듬으면 얼추 될 것 같다.
네이버페이는 카카오페이와는 다르게 가맹점 신청을 해서 파트너ID를 실제로 받아야만,
테스트를 진행할 수 있다는 점이 매우 아쉽다..
https://developer.pay.naver.com/docs/v1/api/payments
네이버페이 개발자센터
응답 예 Response HTTP/1.1 200 OK { "code" : "Success", "message": "detail message(optional)", "body": { "responseCount": 1, "totalCount": 1, "totalPageCount": 1, "currentPageNumber": 1, "list": [ { "cardAuthNo": "00000000", "bankAccountNo": "", "bankCor
developer.pay.naver.com
'Web Application > Spring boot' 카테고리의 다른 글
[spring] Spring Security + JWT로 인증/인가 기능 구현하기(1) (0) | 2023.03.28 |
---|---|
[spring] Oauth2 (1) - 네이버 로그인 SDK를 사용하여 로그인 기능 구현(네아로) (0) | 2023.03.22 |
[spring] 간편결제 - 카카오페이(kakao pay) 결제 api (1) 단건결제 기능 구현 (3) | 2023.03.18 |
[spring] 2. spring boot + Thymeleaf 템플릿 구조 및 사용 (0) | 2023.03.14 |
[spring] 1. IntelliJ를 이용하여 Spring boot 프로젝트 생성 (0) | 2023.03.05 |