<%@ page contentType="text/html; charset=euc-kr"%>
<%@ page import="java.util.Date" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Iterator" %>
<%@ page import="java.io.PrintWriter" %>
<%@ page import="java.io.BufferedReader" %>
<%@ page import="java.io.InputStreamReader" %>
<%@ page import="java.net.URL" %>
<%@ page import="java.net.HttpURLConnection" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.security.MessageDigest" %>
<%@ page import="org.json.simple.JSONObject" %>
<%@ page import="org.json.simple.parser.JSONParser" %>
<%@ page import="org.apache.commons.codec.binary.Hex" %>
<%
request.setCharacterEncoding("euc-kr"); 
/*
****************************************************************************************
* <ÀÎÁõ °á°ú ÆÄ¶ó¹ÌÅÍ>
****************************************************************************************
*/
String authResultCode 	= (String)request.getParameter("AuthResultCode"); 	// ÀÎÁõ°á°ú : 0000(¼º°ø)
String authResultMsg 	= (String)request.getParameter("AuthResultMsg"); 	// ÀÎÁõ°á°ú ¸Þ½ÃÁö
String nextAppURL 		= (String)request.getParameter("NextAppURL"); 		// ½ÂÀÎ ¿äÃ» URL
String txTid 			= (String)request.getParameter("TxTid"); 			// °Å·¡ ID
String authToken 		= (String)request.getParameter("AuthToken"); 		// ÀÎÁõ TOKEN
String payMethod 		= (String)request.getParameter("PayMethod"); 		// °áÁ¦¼ö´Ü
String mid 				= (String)request.getParameter("MID"); 				// »óÁ¡ ¾ÆÀÌµð
String moid 			= (String)request.getParameter("Moid"); 			// »óÁ¡ ÁÖ¹®¹øÈ£
String amt 				= (String)request.getParameter("Amt"); 				// °áÁ¦ ±Ý¾×
String reqReserved 		= (String)request.getParameter("ReqReserved"); 		// »óÁ¡ ¿¹¾àÇÊµå
String netCancelURL 	= (String)request.getParameter("NetCancelURL"); 	// ¸ÁÃë¼Ò ¿äÃ» URL

/*
****************************************************************************************
* <½ÂÀÎ °á°ú ÆÄ¶ó¹ÌÅÍ Á¤ÀÇ>
* »ùÇÃÆäÀÌÁö¿¡¼­´Â ½ÂÀÎ °á°ú ÆÄ¶ó¹ÌÅÍ Áß ÀÏºÎ¸¸ ¿¹½ÃµÇ¾î ÀÖÀ¸¸ç, 
* Ãß°¡ÀûÀ¸·Î »ç¿ëÇÏ½Ç ÆÄ¶ó¹ÌÅÍ´Â ¿¬µ¿¸Þ´º¾óÀ» Âü°íÇÏ¼¼¿ä.
****************************************************************************************
*/
String ResultCode 	= ""; String ResultMsg 	= ""; String PayMethod 	= "";
String GoodsName 	= ""; String Amt 		= ""; String TID 		= "";

/*
****************************************************************************************
* <ÀÎÁõ °á°ú ¼º°ø½Ã ½ÂÀÎ ÁøÇà>
****************************************************************************************
*/
String resultJsonStr = "";
if(authResultCode.equals("0000")){
	/*
	****************************************************************************************
	* <ÇØ½¬¾ÏÈ£È­> (¼öÁ¤ÇÏÁö ¸¶¼¼¿ä)
	* SHA-256 ÇØ½¬¾ÏÈ£È­´Â °Å·¡ À§º¯Á¶¸¦ ¸·±âÀ§ÇÑ ¹æ¹ýÀÔ´Ï´Ù. 
	****************************************************************************************
	*/
	DataEncrypt sha256Enc 	= new DataEncrypt();
	String merchantKey 		= "7wnkxZbHvIA7FoCc6jF8IcXU+Wd3sn5BcMHuWJROe53AjRKnC6CistVdVZwrUKCCdaF+dAx230bwHSQ/E29RWA=="; // »óÁ¡Å°
	String ediDate			= getyyyyMMddHHmmss();
	String signData 		= sha256Enc.encrypt(authToken + mid + amt + ediDate + merchantKey);

	/*
	****************************************************************************************
	* <½ÂÀÎ ¿äÃ»>
	* ½ÂÀÎ¿¡ ÇÊ¿äÇÑ µ¥ÀÌÅÍ »ý¼º ÈÄ server to server Åë½ÅÀ» ÅëÇØ ½ÂÀÎ Ã³¸® ÇÕ´Ï´Ù.
	****************************************************************************************
	*/
	StringBuffer requestData = new StringBuffer();
	requestData.append("TID=").append(txTid).append("&");
	requestData.append("AuthToken=").append(authToken).append("&");
	requestData.append("MID=").append(mid).append("&");
	requestData.append("Amt=").append(amt).append("&");
	requestData.append("EdiDate=").append(ediDate).append("&");
	requestData.append("SignData=").append(signData);

	resultJsonStr = connectToServer(requestData.toString(), nextAppURL);

	HashMap resultData = new HashMap();
	boolean paySuccess = false;
	if("9999".equals(resultJsonStr)){
		/*
		*************************************************************************************
		* <¸ÁÃë¼Ò ¿äÃ»>
		* ½ÂÀÎ Åë½ÅÁß¿¡ Exception ¹ß»ý½Ã ¸ÁÃë¼Ò Ã³¸®¸¦ ±Ç°íÇÕ´Ï´Ù.
		*************************************************************************************
		*/
		StringBuffer netCancelData = new StringBuffer();
		requestData.append("&").append("NetCancel=").append("1");
		String cancelResultJsonStr = connectToServer(requestData.toString(), netCancelURL);
		
		HashMap cancelResultData = jsonStringToHashMap(cancelResultJsonStr);
		ResultCode = (String)cancelResultData.get("ResultCode");
		ResultMsg = (String)cancelResultData.get("ResultMsg");
	}else{
		resultData = jsonStringToHashMap(resultJsonStr);
		ResultCode 	= (String)resultData.get("ResultCode");	// °á°úÄÚµå (Á¤»ó °á°úÄÚµå:3001)
		ResultMsg 	= (String)resultData.get("ResultMsg");	// °á°ú¸Þ½ÃÁö
		PayMethod 	= (String)resultData.get("PayMethod");	// °áÁ¦¼ö´Ü
		GoodsName   = (String)resultData.get("GoodsName");	// »óÇ°¸í
		Amt       	= (String)resultData.get("Amt");		// °áÁ¦ ±Ý¾×
		TID       	= (String)resultData.get("TID");		// °Å·¡¹øÈ£
		
		/*
		*************************************************************************************
		* <°áÁ¦ ¼º°ø ¿©ºÎ È®ÀÎ>
		*************************************************************************************
		*/
		if(PayMethod != null){
			if(PayMethod.equals("CARD")){
				if(ResultCode.equals("3001")) paySuccess = true; // ½Å¿ëÄ«µå(Á¤»ó °á°úÄÚµå:3001)       	
			}else if(PayMethod.equals("BANK")){
				if(ResultCode.equals("4000")) paySuccess = true; // °èÁÂÀÌÃ¼(Á¤»ó °á°úÄÚµå:4000)	
			}else if(PayMethod.equals("CELLPHONE")){
				if(ResultCode.equals("A000")) paySuccess = true; // ÈÞ´ëÆù(Á¤»ó °á°úÄÚµå:A000)	
			}else if(PayMethod.equals("VBANK")){
				if(ResultCode.equals("4100")) paySuccess = true; // °¡»ó°èÁÂ(Á¤»ó °á°úÄÚµå:4100)
			}else if(PayMethod.equals("SSG_BANK")){
				if(ResultCode.equals("0000")) paySuccess = true; // SSGÀºÇà°èÁÂ(Á¤»ó °á°úÄÚµå:0000)
			}else if(PayMethod.equals("CMS_BANK")){
				if(ResultCode.equals("0000")) paySuccess = true; // °èÁÂ°£Æí°áÁ¦(Á¤»ó °á°úÄÚµå:0000)
			}
		}
	}
}else{
	ResultCode 	= authResultCode; 	
	ResultMsg 	= authResultMsg;
}
%>
<!DOCTYPE html>
<html>
<head>
<title>NICEPAY PAY RESULT</title>
<meta charset="euc-kr">
</head>
<body>
	<table>
		<%if("9999".equals(resultJsonStr)){%>
		<tr>
			<th>½ÂÀÎ Åë½Å ½ÇÆÐ·Î ÀÎÇÑ ¸ÁÃë¼Ò Ã³¸® ÁøÇà °á°ú</th>
			<td>[<%=ResultCode%>]<%=ResultMsg%></td>
		</tr>
		<%}else{%>
		<tr>
			<th>°á°ú ³»¿ë</th>
			<td>[<%=ResultCode%>]<%=ResultMsg%></td>
		</tr>
		<tr>
			<th>°áÁ¦¼ö´Ü</th>
			<td><%=PayMethod%></td>
		</tr>
		<tr>
			<th>»óÇ°¸í</th>
			<td><%=GoodsName%></td>
		</tr>
		<tr>
			<th>°áÁ¦ ±Ý¾×</th>
			<td><%=Amt%></td>
		</tr>
		<tr>
			<th>°Å·¡ ¹øÈ£</th>
			<td><%=TID%></td>
		</tr>
		<%}%>
	</table>
	<p>*Å×½ºÆ® ¾ÆÀÌµðÀÎ°æ¿ì ´çÀÏ ¿ÀÈÄ 11½Ã 30ºÐ¿¡ Ãë¼ÒµË´Ï´Ù.</p>
</body>
</html>
<%!
public final synchronized String getyyyyMMddHHmmss(){
	SimpleDateFormat yyyyMMddHHmmss = new SimpleDateFormat("yyyyMMddHHmmss");
	return yyyyMMddHHmmss.format(new Date());
}

// SHA-256 Çü½ÄÀ¸·Î ¾ÏÈ£È­
public class DataEncrypt{
	MessageDigest md;
	String strSRCData = "";
	String strENCData = "";
	String strOUTData = "";
	
	public DataEncrypt(){ }
	public String encrypt(String strData){
		String passACL = null;
		MessageDigest md = null;
		try{
			md = MessageDigest.getInstance("SHA-256");
			md.reset();
			md.update(strData.getBytes());
			byte[] raw = md.digest();
			passACL = encodeHex(raw);
		}catch(Exception e){
			System.out.print("¾ÏÈ£È­ ¿¡·¯" + e.toString());
		}
		return passACL;
	}
	
	public String encodeHex(byte [] b){
		char [] c = Hex.encodeHex(b);
		return new String(c);
	}
}

//server to server Åë½Å
public String connectToServer(String data, String reqUrl) throws Exception{
	HttpURLConnection conn 		= null;
	BufferedReader resultReader = null;
	PrintWriter pw 				= null;
	URL url 					= null;
	
	int statusCode = 0;
	StringBuffer recvBuffer = new StringBuffer();
	try{
		url = new URL(reqUrl);
		conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod("POST");
		conn.setConnectTimeout(3000);
		conn.setReadTimeout(5000);
		conn.setDoOutput(true);
		
		pw = new PrintWriter(conn.getOutputStream());
		pw.write(data);
		pw.flush();
		
		statusCode = conn.getResponseCode();
		resultReader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "euc-kr"));
		for(String temp; (temp = resultReader.readLine()) != null;){
			recvBuffer.append(temp).append("\n");
		}
		
		if(!(statusCode == HttpURLConnection.HTTP_OK)){
			throw new Exception();
		}
		
		return recvBuffer.toString().trim();
	}catch (Exception e){
		return "9999";
	}finally{
		recvBuffer.setLength(0);
		
		try{
			if(resultReader != null){
				resultReader.close();
			}
		}catch(Exception ex){
			resultReader = null;
		}
		
		try{
			if(pw != null) {
				pw.close();
			}
		}catch(Exception ex){
			pw = null;
		}
		
		try{
			if(conn != null) {
				conn.disconnect();
			}
		}catch(Exception ex){
			conn = null;
		}
	}
}

//JSON String -> HashMap º¯È¯
private static HashMap jsonStringToHashMap(String str) throws Exception{
	HashMap dataMap = new HashMap();
	JSONParser parser = new JSONParser();
	try{
		Object obj = parser.parse(str);
		JSONObject jsonObject = (JSONObject)obj;

		Iterator<String> keyStr = jsonObject.keySet().iterator();
		while(keyStr.hasNext()){
			String key = keyStr.next();
			Object value = jsonObject.get(key);
			
			dataMap.put(key, value);
		}
	}catch(Exception e){
		
	}
	return dataMap;
}
%>