본문 바로가기
개발의 기록/Server

스프링 결재모듈 연동 (UTF8 -> EUC-KR -> UTF-8) 꼼수

by prographer J 2017. 6. 9.
728x90

하... 이 문제로 PG사와도 열심히 연락하고 구글링을 아무리 해봐도 답이 안나왔는데... 꼼수로 그냥 해결했다.

정석대로 해결할라니 안되네...

 

스프링에서 PG사 연동을 할 경우 문자열 때문에 결재화면의 관리자 페이지와 디비에 저장 할때 문제가 발생한다.

이유는 내서버(Spring)은 UTF-8로 되어 있는데 이놈에 PG사들은 죄다 EUC-KR로 되어 있다.

그런데 PC결재등은 정보만 보내고 결과를 받아서 상관이 없는데. 스마트폰웹에서 결재를 진행하기 위해서는 자기네 URL로 넘겨서 다시 거기서 내 유알엘로 넘겨준다;;

그렇기 때문에 거기서 EUC-KR로 전송을 하기때문에 문제가 발생한다.

 

PG사측에 문의했더니 form을 전송할 때 CharSet="UTF-8"이라고 넘기면 그렇게 변환해서 넘겨준다는데..

안넘어와 ㅋㅋㅋ 폼을 확인해보니 걍 EUC-KR로 넘어오더만 ㅡ.ㅡ;

 

아무튼 그래서 답이 없어서 꼼수로 걍 해결함.

 

다음은 문제 해결을 위한 삽질의 순서

 

1. PC결재에는 내 컨트롤러 상에서 움직이므로 별 문제 없음.

2. 스마트폰 결재 시에 문제가 발생함

   문제원인: Spring 은 UTF-8로 되어 있고, PG사의 결제 서버는 EUC-KR로 되어 있고, PG사 서버를 타고 내 서버로 들어올때 EUC-KR로 들어오기 때문에 발생하는문제.

   문제점 해결 순서: 

      1) 이 문제에 대해 PG사에 문의 했더니 자기들은 UTF-8로 변환해서 준단다...하지만 받아보면 EUC-KR;

      2) 그래서 필터도 걸어보고 new String도 해보고 온갓것을 해봐도 안된다..

          2-1) 삽질1  삽질2

   문제 해결:

      1) 그냥 PG사로 보낼때 한글로 된 필드를 추가로 만들어서 그 필드를 encodeURI을 해서 보내버림 

      2) 받을때 필드를 변경해서 다시 넘김.

 

 

대략적인 코드

 

pay.html

 

밑에 GoodsName, BuyerName은 PG사에서 결재 창을 띄울 때 사용한다 

<form name="payForm" method="post" action="/payResult" accept-charset="EUC-KR">
    <input type="hidden" name="GoodsName" th:value="${order.goodsName}">
    <input type="hidden" name="GoodsName_E" th:value="${order.goodsName}">
    <input type="hidden" name="BuyerName" th:value="${order.buyerName}">
    <input type="hidden" name="BuyerName_E" th:value="${order.buyerName}">
    <input type="hidden" name="ReturnURL" th:value="${returnUrl}">                <!-- Return URL -->
</form>
function nicepayStart() {
    document.getElementById("vExp").value = getTomorrow();

    //폰 여부 확인
    var ua = String(navigator.userAgent).toLowerCase();
    if (/android|iphone|ipad/.test(ua)) {
        document.charset = 'euc-kr';
        document.payForm.action = "https://web.nicepay.co.kr/smart/paySmart.jsp";
        document.payForm.acceptCharset = "euc-kr";
        document.payForm.BuyerName_E.value = encodeURI(document.payForm.BuyerName_E.value);
        document.payForm.GoodsName_E.value = encodeURI(document.payForm.GoodsName_E.value);
        document.payForm.submit();
    } else {
        goPay(document.payForm);
    }

}

 

payResult controller

 

여기서 다시 변환 해 주는 이유는 PG사 관리자 페이지에서도 저 글들이 보여야 하므로 변환을 한다.

이렇게 변환을 안할 경우 ???????로 보임

NicePayWebConnector connector = new NicePayWebConnector();
/**
 * Request Data 셋팅
 */
connector.setRequestData(request);
if (DeviceUtil.isMobile(request)) {
    connector.addRequestData("BuyerName", URLDecoder.decode(request.getParameter("BuyerName_E"), "UTF-8"));
    connector.addRequestData("GoodsName", URLDecoder.decode(request.getParameter("GoodsName_E"), "UTF-8"));
}

 

 

이런식으로 교체하면됨.

 

728x90

댓글