하... 이 문제로 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도 해보고 온갓것을 해봐도 안된다..
문제 해결:
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"));
}
이런식으로 교체하면됨.
댓글