<%@ 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.URLEncoder" %>
<%@ 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 tid 					= (String)request.getParameter("TID");	// °Å·¡ ID
String cancelAmt 			= (String)request.getParameter("CancelAmt");	// Ãë¼Ò±Ý¾×
String partialCancelCode 	= (String)request.getParameter("PartialCancelCode"); 	// ºÎºÐÃë¼Ò¿©ºÎ
String mid 					= "itn180208m";	// »óÁ¡ ID
String moid					= "nicepay_api_3.0_test";	// ÁÖ¹®¹øÈ£
String cancelMsg 			= "°í°´¿äÃ»";	// Ãë¼Ò»çÀ¯


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

/*
****************************************************************************************
* <Ãë¼Ò ¿äÃ»>
* Ãë¼Ò¿¡ ÇÊ¿äÇÑ µ¥ÀÌÅÍ »ý¼º ÈÄ server to server Åë½ÅÀ» ÅëÇØ Ãë¼Ò Ã³¸® ÇÕ´Ï´Ù.
* Ãë¼Ò »çÀ¯(CancelMsg) ¿Í °°ÀÌ ÇÑ±Û ÅØ½ºÆ®°¡ ÇÊ¿äÇÑ ÆÄ¶ó¹ÌÅÍ´Â euc-kr encoding Ã³¸®°¡ ÇÊ¿äÇÕ´Ï´Ù.
****************************************************************************************
*/
StringBuffer requestData = new StringBuffer();
requestData.append("TID=").append(tid).append("&");
requestData.append("MID=").append(mid).append("&");
requestData.append("Moid=").append(moid).append("&");
requestData.append("CancelAmt=").append(cancelAmt).append("&");
requestData.append("CancelMsg=").append(URLEncoder.encode(cancelMsg, "euc-kr")).append("&");
requestData.append("PartialCancelCode=").append(partialCancelCode).append("&");
requestData.append("EdiDate=").append(ediDate).append("&");
requestData.append("SignData=").append(signData);
String resultJsonStr = connectToServer(requestData.toString(), "https://webapi.nicepay.co.kr/webapi/cancel_process.jsp");

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

if("9999".equals(resultJsonStr)){
	ResultCode 	= "9999";
	ResultMsg	= "Åë½Å½ÇÆÐ";
}else{
	HashMap resultData = jsonStringToHashMap(resultJsonStr);
	ResultCode 	= (String)resultData.get("ResultCode");	// °á°úÄÚµå (Ãë¼Ò¼º°ø: 2001, Ãë¼Ò¼º°ø(LGU °èÁÂÀÌÃ¼):2211)
	ResultMsg 	= (String)resultData.get("ResultMsg");	// °á°ú¸Þ½ÃÁö
	CancelAmt 	= (String)resultData.get("CancelAmt");	// Ãë¼Ò±Ý¾×
	CancelDate 	= (String)resultData.get("CancelDate");	// Ãë¼ÒÀÏ
	CancelTime 	= (String)resultData.get("CancelTime");	// Ãë¼Ò½Ã°£
	TID 		= (String)resultData.get("TID");		// °Å·¡¾ÆÀÌµð TID
}
%>
<!DOCTYPE html>
<html>
<head>
<title>NICEPAY CANCEL RESULT</title>
<meta charset="euc-kr">
</head>
<body> 
	<table>
		<tr>
			<th>Ãë¼Ò °á°ú ³»¿ë</th>
			<td>[<%=ResultCode%>]<%=ResultMsg%></td>
		</tr>
		<tr>
			<th>°Å·¡ ¾ÆÀÌµð</th>
			<td><%=TID%></td>
		</tr>
		<tr>
			<th>Ãë¼Ò ±Ý¾×</th>
			<td><%=CancelAmt%></td>
		</tr>
		<tr>
			<th>Ãë¼ÒÀÏ</th>
			<td><%=CancelDate%></td>
		</tr>
		<tr>
			<th>Ãë¼Ò½Ã°£</th>
			<td><%=CancelTime%></td>
		</tr>
	</table>
</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;
}
%>