Language/Java

네이버 페이 (Naver Pay) 기능구현

JUNGKEUNG 2022. 4. 24. 12:27
반응형

이번에 간편결제 기능인 네이버 페이 구현을 진행했으며 작업이 모두 끝나서 이를 정리해두려 한다.  

 

 

네이버페이 결제 연동 개발

네이버페이 간편결제 연동 개발은 크게 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 ) 의 경우 네이버페이 결제 화면을 닫습니다.

Popup 사용 시 callback Function 구현 Example 팝업 구현
callback function 사용 예제
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}

 

 

결제 승인

URL
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

 

네이버페이 개발자센터

응답 예 Response HTTP/1.1 200 OK { "code": "Success", "message": "", "body": { "businessNo": "2208162517", "differenceResults": [{ "differenceRequestId": "DR201810300000008013", "payHistId": "20181113NP1000488732", "orderNo": "TEST001", "sequence": "00"

developer.pay.naver.com

 

'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