나이스 페이 API - naiseu pei API

- Wechat Pay 선거래 API

  • 1) 아래의 요청 필드들을 HTML Form 필드에 설정 한 후 tenpayProcess.jsp 로 POST 로 Submit 합니다.

  • 2) NICE 에서는 가맹점 정보를 검증한 후 가맹점 요청 데이터에 따라 WeChat Pay 결제 URL 정보를 생성 후 가맹점의 ReturnURL 로 Submit 합니다.

  • 3) 응답 받은 가맹점은 응답 결과가 ‘0000’ 정상 인 경우 WXPayPayURL 필드 내의 URL 을 Submit 하거나 QRCode 로 표현 합니다.

요청URL:

  • https://web.nicepay.co.kr/lite/tenpay/tenpayProcess.jsp

연동방식:

  • <span style="color:red;">Form Submit</span>

파라미터:

필드명(EN)필드명(KR)필드타입길이필수여부설명
TransCl 거래구분 AN 2 O “2” 고정
OnOffCl 온 오프구분 AN 2 O “0” 고정
GoodsCode 상품코드 AN 4 O 가맹점 구매 대표상품 코드
InterfaceType 인터페이스타입 AN 2 O PW : PC웹</br> MW : 모바일웹 (WeChat H5 전용)
PaygateCode PGID AN 3 O CNW : WeChatPay</br> CNQ : QQ Pay
TID 거래번호 AN 30 O 모든 거래에서 유일해야 함.생성 규칙은 매뉴얼 내 7.1번 거래 아이디 생성 규칙 참고
MID 가맹점ID AN 10 O NICE 에서 발급 받은 가맹점 ID
EncodeKey 상점키 AN 90 O 가맹점 MID 에 따른 상점 키 (NICE에서 발급)
GoodsName 상품명 AN 40 O 구매 대표상품 명(영문)
GoodsGroup 상품분류 AN 200 O 상품분류명과 개수,</br>Ex) - 상품분류명1^갯수 &Iota; 상품분류명2^갯수 상품분류명 입력 불가능 시에는 9999^갯수 로 하나만 입력
Amt 상품가격 N 12 O USD : cent 단위까지 표시 10센트인 경우 10 세팅
Moid 주문번호 AN 64 X 가맹점 주문번호
BuyerName 구매자명 AN 30 O 구매자 명(영문 또는 중문)
BuyerEmail 구매자이메일 AN 60 O 구매자 이메일
BuyerTel 구매자전화번호 AN 40 O 구매자 휴대폰 번호
ReturnURL 결제인증 요청 결과URL (Front-end) AN 200 O Front-end URL WeChat pay일 경우 QR code 생성
RetryURL 결제결과URL (Back-end) AN 200 O Back-end URL
ResultURL 가맹점 결제완료 URL AN 200 O Front-end URL 최종 결제완료 결과표시 URL
closeURL 가맹점</br>결제실패 및 결제</br> 중단 URL AN 200 O Front-end URL 최종 결제실패 or 결과중단 표시 URL
imgURL 가맹점</br>로고 이미지 AN 200 X 위챗 앱 결제요청 페이지 내</br> 가맹점 로고 이미지 (868 x 147)
MallIP 가맹점 서버 IP AN 20 O 형식 : xxx.xxx.xxx.xxx
UserIP 구매자 IP AN 20 O 형식 : xxx.xxx.xxx.xxx</br>WECHAT PAY 경우 구매자의 접속 IP 를 추가로 요구 하고 있어, 필수로 설정 바랍니다.
ExchangeRate 환율 AN 8 O
ExchangeAmt 환율적용금액 AN 14 O 환율이 반영된 원화 액수
Currency 통화코드 AN 3 O KRW, USD
CharSet 캐릭터셋 AN 10 X Ex) UTF-8, EUC-KR</br>가맹점에서 받는 결제 인증요청</br> 결과데이터 문자형식 지정

사용방식:

  • java

    try {
            Document doc = Jsoup.connect(url).data(params).post();
            String resCd = doc.select(&quot;input[name=ResultCode]&quot;).first().val();
            String resMsg = doc.select(&quot;input[name=ResultMsg]&quot;).first().val();
            if(!StringUtils.equals(&quot;0000&quot; , resCd )){
                //error
            }
    
            String appId = doc.select(&quot;input[name=appId]&quot;).first().val();
            String timeStamp = doc.select(&quot;input[name=timeStamp]&quot;).first().val();
            String nonceStr = doc.select(&quot;input[name=nonceStr]&quot;).first().val();
            String packageStr = doc.select(&quot;input[name=packageStr]&quot;).first().val();
            String signType = doc.select(&quot;input[name=signType]&quot;).first().val();
            String paySign = doc.select(&quot;input[name=paySign]&quot;).first().val();
    
            Map&lt;String, Object&gt; info = new HashMap&lt;&gt;();
    
            info.put(&quot;appId&quot; , appId);
            info.put(&quot;timeStamp&quot; , timeStamp);
            info.put(&quot;nonceStr&quot; , nonceStr);
            info.put(&quot;packageStr&quot; , packageStr);
            info.put(&quot;signType&quot; , signType);
            info.put(&quot;paySign&quot; , paySign);
    
        } catch (Exception e) {
            //error
        }
  • 미니 프로그램
wx.requestPayment({
                timeStamp: info.timeStamp,
                nonceStr: info.nonceStr,
                package: info.packageStr,
                signType: info.signType,
                paySign: info.paySign
                , success: function (res) {
                        //결제 성공
                }, fail: function (e) {
                        //결제 실패
                }
            }

요청 응답 설명

필드명(EN)필드명(KR)필드타입길이설명
ResultCode 결과코드 AN 10 “0000”만 성공, 그 외 실패 처리
ResultMsg 결과메시지 AN 100 결과 메시지
WXPayPayURL 인증URL AN 1200 성공 시만 응답</br>WeChat Pay 인 경우 구매자 브라우저에 QRCODE 로 표현,
PaygateCode PGID AN 3 CNW : WeChatPay
NICEResType 나이스응답유형 AN 4 AUTH : 결제인증 URL 응답
TID 거래번호 AN 30 요청 시 사용된 TID
MID 가맹점ID AN 10 요청 시 사용된 MID

- 결제 결과(Back-end) 응답 전문

  • 지불 성공 시만 결제 인증 URL 요청 시 설정한 RetryURL 로 응답됩니다. </br>(응답 실패 시 1-2분 주기로 재 전송. 최대 10번 재 전송.)

  • 응답 시 DB 처리를 포함 가맹점 주문 프로세서 가 모두 완료 된 경우 “OK” (대문자) 문자열을 리턴 하는 경우 처리가 완료 된 것으로 인지하여</br>더 이상 URL 을 호출 하지 않습니다.
  • 예) ASP/ PHP/JSP 경우 Response.write(“OK”);

  • 그 외 실패 인 경우 OK 제외한 문자열을 리턴 합니다.

파라미터:

필드명(EN)필드명(KR)필드타입길이설명
AuthDate 승인일자 AN 12 yymmddhhmmss
AuthCode 승인번호 AN 32 WeChat 승인번호
StateCd 거래상태 AN 2 0: 승인 / 그 외 취소
MID 가맹점ID AN 10 요청 시 사용된 MID
TID 거래번호 AN 30 요청 시 사용된 TID
ResultCode 결과코드 AN 4 0000 : 성공 , 그 외 실패</br>결과코드가 “0000 이고 거래상태가 “0” 인 경우 만</br> 거래 성공 상태 처리 합니다.
ResultMsg 결과메시지 AH 100 결과에 대한 메시지
WXPayEdiNo 위챗주문번호 AN 32 WeChat으로 전송된 거래번호
WXPayAppDate 위챗승인일자 AN 8 WeChat 승인일자(베이징 타임)
WXPayAppTime 위챗승인시각 AN 6 WeChat 승인시간(베이징 타임)

- 결제 취소

  • 결제 취소의 경우 API 형태로 요청 ASP/PHP/JSP 등의 HTTP CLIENT 등을 이용한 서버 간 통신 방식 입니다.

  • 취소 요청 시 POST 방식으로 요청 하고 응답으로 NAME=VALUE 형태의 TEXT를 리턴 합니다.

  • 이때 연결자로 파이프(“|”) 사용합니다.

  • 예) 취소 응답결과 </br>TID=nictest20m20011603071513133542| MID=nictest20m|CancelDate=20160312| CancelTime=165712

요청URL:

  • https://web.nicepay.co.kr/lite/cancelProcess.jsp

연동방식:

  • Server TO Sever (API)

파라미터:

필드명(EN)필드명(KR)필드타입길이필수여부설명
TID 거래번호 N 30 O 승인 시 발급 받은 거래번호</br>전체 취소인 경우 원 TID</br>부분 취소인 경우 부분 취소에 대한 TID
MID 가맹점ID AN 10 O 승인 시 사용된 원 MID
CancelAmt 취소 금액 N 12 O 취소 금액</br>전체 취소인 경우 원 거래 금액</br>부분 취소인 경우 개별 서브 거래 전체 금액
CancelMsg 취소 사유 AN 100 O 환불 요청 사유, 고객 단순요청은 "CR"</br> 품절(또는 판매중지)은 "SO"</br> 반품(불량/교환/상품불일치)은 "RT"</br> 구매가능시간 초과는 "TO"</br>그 외는 "ET"
CancelPwd 취소패스워드 AN 20 O 가맹점관리자(https://pg.nicepay.co.kr) 페이지에서 취소 패스워드 설정
PartialCancelCode 부분취소 여부 AN 1 O 0: 전체 취소,1: 부분 취소</br>일반 거래인 경우 전체 취소만 가능</br>장바구니 거래인 경우 전체 취소, 부분 취소 가능
Moid 주문번호 AN 64 O 가맹점 취소 주문번호
CartType 장바구니 여부 AN 1 O 0: 일반 거래인 경우</br>1: 장바구니 거래인 경우

요청 응답 설명

필드명(EN)필드명(KR)필드타입길이설명
TID 거래번호 AN 30 전체 취소인 경우 원 TID</br>부분 취소인 경우 부분 취소에 대한 서브 거래 TID
MID 가맹점ID AN 10 승인 시 사용된 원 MID
CancelAmt 취소금액 N 12 취소 금액</br>전체 취소인 경우 원 거래 금액</br>부분 취소인 경우 개별 서브 거래 전체 금액
CancelDate 취소일자 N 8 yyyymmdd
CancelTime 취소시간 N 6 hhmmss
ResultCode 결과코드 AN 10 2001 : 성공 ,</br>2002: 취소 요청 중</br><span style="color:red;">※ 2001, 2002 응답코드는 정상적으로 텐페이로 취소 요청 됐으나 취소 완료여부는 익일 거래대사를 통해서 확정해야 함</span></br>그 외 결과코드는 실패
ResultMsg 결과메시지 AH 100 결과메시지

응답 parse


String str = &quot;TID=nictest20m20011603071513133542| MID=nictest20m|CancelDate=20160312| CancelTime=165712&quot;;

String[] split = StringUtils.split( str.toString().trim() , &quot;|&quot;);

        StringBuilder sb = new StringBuilder();

        sb.append(&quot;{&quot;);

        int len = 0;

        for(String item : split ){

            String[] s = StringUtils.split( item , &quot;=&quot; );

            if(len &gt; 0){
                sb.append(&quot;,&quot;);
            }

            if(s.length &lt;= 1){

                sb.append( String.format( &quot;\&quot;%s\&quot;:\&quot;%s\&quot;&quot; , s[0] , &quot;&quot; ) );

            }else{

                if(StringUtils.equals(&quot;null&quot; , s[1] )){

                    sb.append( String.format( &quot;\&quot;%s\&quot;:\&quot;%s\&quot;&quot; , s[0] , &quot;&quot; ) );

                }else{

                    sb.append( String.format( &quot;\&quot;%s\&quot;:\&quot;%s\&quot;&quot; , s[0] , s[1] ) );

                }
            }

            len += 1;
        }

        sb.append(&quot;}&quot;);

        JSONObject json = JSONObject.fromObject(sb.toString());