이번에 간편결제 기능인 네이버 페이 구현을 진행했으며 작업이 모두 끝나서 이를 정리해두려 한다.
네이버페이 결제 연동 개발
네이버페이 간편결제 연동 개발은 크게 3가지로 이루어진다.
결제창 호출 -> 결제 승인 -> 결제 완료
NaverPay.html
네이버 페이는 javaScriptSDK를 제공 하고 있다. SDK를 이용하여 결제창을 쉽게 띄울 수 있다.
<!DOCTYPE html>
<html>
<head></head>
<body>
<input type="button" id="naverPayBtn" value="네이버페이 결제 버튼">
<script src="https://nsp.pay.naver.com/sdk/js/naverpay.min.js"></script>
<script>
var oPay = Naver.Pay.create({
"mode" : "production", // development or production
"clientId": "u86j4ripEt8LRfPGzQ8" // clientId
});
//직접 만드신 네이버페이 결제버튼에 click Event를 할당하세요
var elNaverPayBtn = document.getElementById("naverPayBtn");
elNaverPayBtn.addEventListener("click", function() {
oPay.open({
"merchantUserKey": "가맹점 사용자 식별키",
"merchantPayKey": "가맹점 주문 번호",
"productName": "상품명을 입력하세요",
"totalPayAmount": "1000",
"taxScopeAmount": "1000",
"taxExScopeAmount": "0",
"returnUrl": "사용자 결제 완료 후 결제 결과를 받을 URL"
});
});
</script>
</body>
</html>
NaverPay.html 설명
NaverPay javascript object 를 통해 프로그래밍할 수 있도록 지원한다.
var oPay = Naver.Pay.create();
Naver.Pay.create({sdk parameter object}) 네이버페이 객체를 생성한다.
var oPay = Naver.Pay.create({
"mode" : "development", // development or production
"payType" : "normal", // normal or recurrent
"clientId": "dQPaTGkl7UD9gyUVttF3" // clientId
});
Naver.Pay.open({Pay reserve parameter object})
네이버페이 결제 화면을 호출한다. (payType 에 따른, SDK에 따라 필요한 파라미터를 입력한다)
var oPay = Naver.Pay.open({
"merchantUserKey": "partner-userkey",
"merchantPayKey": "partnder-orderkey",
"productName": "커스텀 결제",
"totalPayAmount": 10000,
"taxScopeAmount": 10000,
"taxExScopeAmount": 0,
"productCount": 1,
"returnUrl": "http(s)://your-site-return-url",
"productItems": [{
"categoryType": "ETC",
"categoryId" : "ETC",
"uid" : "1234",
"name" : "test",
"payReferrer" : "ETC",
"count" : 1
}, {
"categoryType": "ETC",
"categoryId" : "ETC",
"uid" : "4567",
"name" : "test2",
"payReferrer" : "ETC",
"count" : 2
}]
});
Naver.Pay.close()
네이버페이 결제 화면을 닫는다.
var oPay = Naver.Pay.open({
"merchantUserKey": "partner-userkey",
"merchantPayKey": "partnder-orderkey",
"productName": "커스텀 결제",
"totalPayAmount": 10000,
"taxScopeAmount": 10000,
"taxExScopeAmount": 0,
"productCount": 1,
"returnUrl": "http(s)://your-site-return-url",
"productItems": [{
"categoryType": "ETC",
"categoryId" : "ETC",
"uid" : "1234",
"name" : "test",
"payReferrer" : "ETC",
"count" : 1
}, {
"categoryType": "ETC",
"categoryId" : "ETC",
"uid" : "4567",
"name" : "test2",
"payReferrer" : "ETC",
"count" : 2
}]
});
oPay.close(); // SPA ( Single Page Application ) 의 경우 네이버페이 결제 화면을 닫습니다.
var oPay = Naver.Pay.create({
"mode" : "development", // development or production
"clientId": "dQPaTGkl7UD9gyUVttF3", // clientId
"openType": "popup",
"onAuthorize" : function(oData) {
/*
팝업 타입을 설정하고, onAuthorize callback function 을 설정하여 결과를 callback function 으로 전달 받을 수 있도록 지원합니다.
onAuthorize callback function 을 설정하지 않은 경우는 returnUrl 로 참조 정보와 함께 redirect 됩니다.
oData 객체에는 결제 인증 결과와 전달한 returnUrl 정보가 함께 전달되며,
이 정보는 이후 승인 요청 처리를 위한 정보 (resultCode, resultMessage, returnUrl, paymentId, reserveId 등) 입니다.
전달되는 값은 https://developer.pay.naver.com/docs/v2/api#payments-payments_window 의 성공 & 실패 응답 값을 참조해주세요.
*/
if(oData.resultCode === "Success") {
// 네이버페이 결제 승인 요청 처리
} else {
// 필요 시 oData.resultMessage 에 따라 적절한 사용자 안내 처리
}
}
});
성공응답
returnUrl을 통해 네이버페이 결제번호(paymentId) 전송 및 주문 내역 생성 여부를 가맹점으로부터 확인하고, 결제 프로세스가 정상적으로 수행되었을 때 성공으로 응답합니다.
응답필드
resultCode | String | 결제 결과(Success: 성공) |
paymentId | String | 네이버페이 결제번호. 최대 50바이트 |
응답 예
Redirect: {your-returnUrl}?resultCode=Success&paymentId={네이버페이 결제번호}
실패 응답
필드명타입설명
resultCode | String | 결제 결과(Fail: 실패) |
resultMessage | String | 실패 사유 메시지 |
reserveId | String | 결제 예약 ID |
userCancel | String | 구매자 취소. 팝업으로 결제 창을 호출한 경우에는 서비스 시나리오에 따라 적절하게 창을 닫아야 합니다 |
webhookFail | String | webhookUrl 호출 응답 실패 |
paymentTimeExpire | String | 결제 시간 초과(reserveId 생성 후30분을 초과한 경우) |
OwnerAuthFail | String | 본인 카드 인증 오류(네이버 로그인 계정과 카드의 명의자가 다른 경우) |
그 외 외부 연동처의 오류는 메시지를 그대로 전달 |
응답 예
Redirect: {your-returnUrl}?resultCode=Fail&resultMessage={resultMessage}&reserveId={결제 예약 ID}
결제 승인
POST https://{API 도메인}/{파트너 ID}/naverpay/payments/v2.2/apply/payment
Content-Type: application/x-www-form-urlencoded
curl -X POST https://dev.apis.naver.com/naverpay-partner/naverpay/payments/v2.2/apply/payment \
-H X-Naver-Client-Id:{발급된 client id} \
-H X-Naver-Client-Secret:{발급된 client secret} \
-d paymentId={네이버페이가 발급한 결제 번호} \
응답 코드
Response
HTTP/1.1 200 OK
{
"code" : "Success",
"message": "detail message(optional)",
"body": {
"paymentId": "20170201NP1043587746",
"detail": {
"productName": "상품명",
"merchantId": "loginId",
"merchantName": "가맹점명",
"cardNo": "465887**********",
"admissionYmdt": "20170201151722",
"payHistId": "20170201NP1043587781",
"totalPayAmount": 1000,
"primaryPayAmount": 1000,
"npointPayAmount": 0,
"giftCardAmount": 0,
"taxScopeAmount": 1000,
"taxExScopeAmount": 0,
"primaryPayMeans": "CARD",
"merchantPayKey": "order-key",
"merchantUserKey": "jenie",
"cardCorpCode": "C0",
"paymentId": "20170201NP1043587746",
"admissionTypeCode": "01",
"settleExpectAmount": 971,
"payCommissionAmount": 29,
"admissionState": "SUCCESS",
"tradeConfirmYmdt": "20170201152510",
"cardAuthNo": "17545616",
"cardInstCount": 0,
"usedCardPoint": false,
"bankCorpCode": "",
"bankAccountNo": "",
"settleExpected": false,
"extraDeduction": false,
"useCfmYmdt" : "20180703"
}
}
}
결제 취소
POST https://{API 도메인}/{파트너 ID}/naverpay/payments/v1/cancel
Content-Type: application/x-www-form-urlencoded
요청 코드 예
curl -X POST https://dev.apis.naver.com/naverpay-partner/naverpay/payments/v1/cancel \
-H X-Naver-Client-Id:{발급된 client id} \
-H X-Naver-Client-Secret:{발급된 client secret} \
-d paymentId={결제 완료 시 전달된 paymentId} \
-d cancelAmount={취소금액} \
-d cancelReason=testCancel \
-d cancelRequester=2
거래 완료
POST https://{API 도메인}/{파트너 ID}/naverpay/payments/v1/purchase-confirm
Content-Type: application/x-www-form-urlencoded
요청 코드 예
curl -X POST https://dev.apis.naver.com/naverpay-partner/naverpay/payments/v1/purchase-confirm \
-H X-Naver-Client-Id:{발급된 client id} \
-H X-Naver-Client-Secret:{발급된 client secret} \
-d paymentId={네이버페이가 발급한 결제 번호} \
-d requester=2
API URL 형식
네이버페이 간편결제 API의 URL 형식은 다음과 같다.
https://{API 도메인}/{파트너 ID}/naverpay/payments/{API 버전}/{API명}
반드시 HTTPS로 호출해야 한다.
API 서버 도메인은 다음과 같다.
- 개발 API 서버 : dev.apis.naver.com
- 운영 API 서버 : apis.naver.com
결제 페이지
네이버페이 간편결제 API에서 사용하는 결제 페이지의 주소는 다음과 같다.
https://{네이버페이 서비스 도메인}/payments/{결제 예약 ID}
네이버페이 서비스 도메인은 다음과 같다.
- 개발용 서비스 서버 도메인
- PC 웹 : test-pay.naver.com
- 모바일 웹 : test-m.pay.naver.com
기본 응답 형식
네이버페이 간편결제 API의 기본 응답 형식은 다음과 같다.
{
"code" : "Success",
"message" : "",
"body" : {}
}
Success | String | 성공 |
RequireParameter | String | 필수 파라미터 누락 |
InvalidParameter | String | 입력값이 조건을 만족하지 않음 |
Fail | String | 기타 실패 |
참고 자료
https://developer.pay.naver.com/docs/v2/api
'Language > Java' 카테고리의 다른 글
클래스 로더 시스템 (0) | 2022.05.05 |
---|---|
JVM 구조 (0) | 2022.05.05 |
카카오 페이( Kakao pay) 기능구현 (2) | 2022.04.23 |
생성자 (0) | 2021.11.27 |
Java String Pool (0) | 2021.11.20 |