<%@ 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" %>
<%@ page import="java.util.StringTokenizer" %>
<%@ page import="javax.crypto.Cipher" %>
<%@ page import="javax.crypto.spec.SecretKeySpec" %>
<%
request.setCharacterEncoding("euc-kr");
/*
****************************************************************************************
* (요청 값 정보)
* 아래 파라미터에 요청할 값을 알맞게 입력합니다.
****************************************************************************************
*/
String MID = "nictest04m"; // 가맹점 ID
String Moid = ""; // 주문번호
String Amt = ""; // 결제금액
String GoodsName = ""; // 상품명
String CardInterest = ""; // 무이자여부
String CardQuota = ""; // 할부개월
String CardNo = ""; // 카드번호
String CardExpire = ""; // 유효기간(년/월)
String BuyerAuthNum = ""; // 생년월일/사업자번호
String CardPwd = ""; // 카드비밀번호
// 요청할 거래번호(TID)를 생성합니다.
String TID = makeTID(MID, "01", "01");
// 결과 코드와 메세지를 저장할 변수를 미리 선언합니다.
String ResultCode = "";
String ResultMsg = "";
/*
*******************************************************
* (위변조 검증값 암호화 - 수정하지 마세요)
* SHA-256 해쉬 암호화는 거래 위변조를 막기 위한 방법입니다.
*******************************************************
*/
DataEncrypt sha256Enc = new DataEncrypt();
String ediDate = getyyyyMMddHHmmss();
String SignData = sha256Enc.encrypt(MID + Amt + ediDate + Moid + merchantKey);
/*
*******************************************************
* (카드 정보 암호화 - 수정하지 마세요)
* AES 암호화는 결제 카드정보를 암호화 하기 위한 방법입니다.
* Key=Value 형태의 Plain-Text로 카드정보를 나열합니다.
* BuyerAuthNum과 CardPwd는 MID에 설정된 인증방식에 따라 필수 여부가 결정됩니다.
*******************************************************
*/
StringBuffer EncDataBuf = new StringBuffer();
EncDataBuf.append("CardNo=").append(CardNo).append("&");
EncDataBuf.append("CardExpire=").append(CardExpire).append("&");
EncDataBuf.append("BuyerAuthNum=").append(BuyerAuthNum).append("&");
EncDataBuf.append("CardPwd=").append(CardPwd);
String EncData = encryptAES(EncDataBuf.toString(), merchantKey.substring(0,16));
/*
****************************************************************************************
* <승인 요청>
* 승인에 필요한 데이터 생성 후 server to server 통신을 통해 승인 처리 합니다.
* 명세서를 참고하여 필요에 따라 파라미터와 값을 Key=Value 형태로 추가해주세요.
****************************************************************************************
*/
StringBuffer requestData = new StringBuffer();
requestData.append("TID=").append(TID).append("&");
requestData.append("MID=").append(MID).append("&");
requestData.append("Moid=").append(Moid).append("&");
requestData.append("Amt=").append(Amt).append("&");
requestData.append("GoodsName=").append(URLEncoder.encode(GoodsName, "euc-kr")).append("&");
requestData.append("CardInterest=").append(CardInterest).append("&");
requestData.append("CardQuota=").append(CardQuota).append("&");
requestData.append("SignData=").append(SignData).append("&");
requestData.append("EncData=").append(EncData);
//API 호출, 결과 데이터가 resultJsonStr 변수에 저장됩니다.
String resultJsonStr = connectToServer(requestData.toString(), "https://webapi.nicepay.co.kr/webapi/card_keyin.jsp");
//결과 데이터를 HashMap 형태로 변환합니다.
HashMap resultData = new HashMap();
resultData = jsonStringToHashMap(resultJsonStr);
ResultCode = (String)resultData.get("ResultCode");
ResultMsg = (String)resultData.get("ResultMsg");
%>
<!DOCTYPE html>
<html>
<head>
<title>NICEPAY KEY-IN SAMPLE</title>
<meta charset="euc-kr">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=yes, target-densitydpi=medium-dpi" />
<link rel="stylesheet" type="text/css" href="../css/import.css"/>
</head>
<body>
<div class="payfin_area">
<div class="top">신용카드 KEY-IN 결과</div>
<div class="conwrap">
<div class="con">
<div class="tabletypea">
<table>
<colgroup><col width="200px"/><col width="*"/></colgroup>
<tr>
<th><span>신용카드 KEY-IN 결과 내용</span></th>
<td>[<%=ResultCode%>]<%=ResultMsg%></td>
</tr>
<tr>
<th><span>신용카드 KEY-IN 데이터</span></th>
<td><%=resultJsonStr%></td>
</tr>
</table>
</div>
</div>
<p>*테스트 아이디인경우 당일 오후 11시 30분에 취소됩니다.</p>
</div>
</div>
</body>
</html>
<%!
// 중요!. 가맹점 MID에 맞는 key값을 설정하세요.
static final String merchantKey = "b+zhZ4yOZ7FsH8pm5lhDfHZEb79tIwnjsdA0FBXh86yLc6BJeFVrZFXhAoJ3gEWgrWwN+lJMV0W4hvDdbe4Sjw=="; //nictest04m의 상점키
// yyyyMMddHHmmss 형식 date 생성 함수
public final synchronized String getyyyyMMddHHmmss(){
SimpleDateFormat yyyyMMddHHmmss = new SimpleDateFormat("yyyyMMddHHmmss");
return yyyyMMddHHmmss.format(new Date());
}
// SHA-256 형식으로 암호화
public static 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);
}
}
/*
* 대외 통신 샘플.
* 외부 기관과 URL 통신하는 샘플 함수입니다.
* 샘플소스는 서비스 안정성을 보장하지 않으므로, 가맹점 환경에 맞게 구현 바랍니다.
* 샘플소스 이용에 따른 이슈 발생시 NICEPAY에서 책임지지 않습니다.
*/
public static 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(15000);
conn.setReadTimeout(25000);
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("ERROR");
}
return recvBuffer.toString().trim();
}catch (Exception e){
return "ERROR";
}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 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;
}
//hex aes 암호화 샘플 (카드 정보를 암호화할 때 사용합니다.)
public static String encryptAES(String input, String key) {
byte[] crypted = null;
try {
SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skey);
crypted = cipher.doFinal(input.getBytes());
StringBuffer sb = new StringBuffer();
for (int i = 0; i < crypted.length; i++) {
String hex = Integer.toHexString(crypted[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* TID 생성샘플.
* makeTID() 함수는 데이터의 유일성을 보장하지 않습니다.
* 반드시 가맹점환경에 맞게 unique한 값을 생성할 수 있도록 구현 바랍니다.
* 샘플소스 이용에 따른 이슈 발생시 NICEPAY에서 책임지지 않습니다.
*/
public static String makeTID(String mid, String svcCd, String prdtCd){
SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmss");
String yyMMddHHmmss = sdf.format(new Date());
StringBuffer sb = new StringBuffer(mid);
sb.append(svcCd);
sb.append(prdtCd);
sb.append(yyMMddHHmmss);
sb.append(String.valueOf(Math.random()).substring(2, 6));
return sb.toString();
}
%>
<?php
header("Content-Type:text/html; charset=euc-kr;");
// 키인 결제(승인) API 요청 URL
$postURL = "https://webapi.nicepay.co.kr/webapi/card_keyin.jsp";
/*
****************************************************************************************
* <요청 값 정보>
* 아래 파라미터에 요청할 값을 알맞게 입력합니다.
****************************************************************************************
*/
$tid = ""; // 거래번호
$mid = ""; // 가맹점 아이디
$moid = ""; // 가맹점 주문번호
$amt = ""; // 금액
$goodsName = ""; // 상품명
$cardInterest = ""; // 무이자 여부
$cardQuota = ""; // 할부 개월
$cardNo = ""; // 카드번호
$cardExpire = ""; // 유효기간(YYMM)
$buyerAuthNum = ""; // 생년월일 / 사업자번호
$cardPwd = ""; // 카드 비밀번호 앞 2자리
// Key=Value 형태의 Plain-Text로 카드정보를 나열합니다.
// BuyerAuthNum과 CardPwd는 MID에 설정된 인증방식에 따라 필수 여부가 결정됩니다.
$plainText = "CardNo=".$cardNo."&CardExpire=".$cardExpire."&BuyerAuthNum=".$buyerAuthNum."&CardPwd=".$cardPwd;
// 결과 데이터를 저장할 변수를 미리 선언합니다.
$response = "";
/*
****************************************************************************************
* (위변조 검증값 및 카드 정보 암호화 - 수정하지 마세요)
* SHA-256 해쉬 암호화는 거래 위변조를 막기 위한 방법입니다.
****************************************************************************************
*/
$ediDate = date("YmdHis"); // API 요청 전문 생성일시
$merchantKey = "b+zhZ4yOZ7FsH8pm5lhDfHZEb79tIwnjsdA0FBXh86yLc6BJeFVrZFXhAoJ3gEWgrWwN+lJMV0W4hvDdbe4Sjw=="; // 가맹점 키
$encData = bin2hex(aesEncryptSSL($plainText, substr($merchantKey, 0, 16))); // 카드정보 암호화
$signData = bin2hex(hash('sha256', $mid . $amt . $ediDate . $moid . $merchantKey, true)); // 위변조 데이터 검증 값 암호화
/*
****************************************************************************************
* (API 요청부)
* 명세서를 참고하여 필요에 따라 파라미터와 값을 'key'=>'value' 형태로 추가해주세요
****************************************************************************************
*/
$data = Array(
'TID' => $tid,
'MID' => $mid,
'EdiDate' => $ediDate,
'Moid' => $moid,
'Amt' => $amt,
'GoodsName' => $goodsName,
'SignData' => $signData,
'CardInterest' => $cardInterest,
'CardQuota' => $cardQuota
);
$response = reqPost($data, $postURL); //API 호출, 결과 데이터가 $response 변수에 저장됩니다.
jsonRespDump($response); //결과 데이터를 브라우저에 노출합니다.
// 카드 정보를 암호화할 때 사용하는 AES 암호화 (opnessl) 함수입니다.
function aesEncryptSSL($data, $key){
$iv = openssl_random_pseudo_bytes(16);
$encdata = @openssl_encrypt($data, "AES-128-ECB", $key, true, $iv);
return $encdata;
}
// json으로 응답된 결과 데이터를 배열 형태로 변환하여 출력하는 함수입니다.
// 응답 데이터 출력을 위한 예시로 테스트 이후 가맹점 상황에 맞게 변경합니다.
function jsonRespDump($resp){
$resp_utf = iconv("EUC-KR", "UTF-8", $resp);
$respArr = json_decode($resp_utf);
foreach ( $respArr as $key => $value ){
echo "$key=". iconv("UTF-8", "EUC-KR", $value)."
";
}
}
// API를 POST 형태로 호출하는 함수입니다.
function reqPost(Array $data, $url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); //connection timeout 15
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); //POST data
curl_setopt($ch, CURLOPT_POST, true);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
?>
const express = require('express')
const axios = require('axios')
const app = express()
const port = 3000
const iconv = require('iconv-lite')
const bodyParser = require('body-parser')
const crypto = require('crypto')
const CryptoJS = require('crypto-js')
const format = require('date-format');
const fs = require('fs')
const ejs = require('ejs')
/*
****************************************************************************************
* 가맹점관리자 페이지(npg.nicepay.co.kr) 로그인 > 가맹점 정보 > Key관리
* 상기 경로를 통해서 가맹점 아이디인 MID와 가맹점 키 값을 확인하여
* 아래 merchantID, merchantKey 파라미터에 각각 입력합니다.
****************************************************************************************
*/
const merchantID = 'nictest04m'; // 가맹점 ID
const merchantKey = 'b+zhZ4yOZ7FsH8pm5lhDfHZEb79tIwnjsdA0FBXh86yLc6BJeFVrZFXhAoJ3gEWgrWwN+lJMV0W4hvDdbe4Sjw=='; // 가맹점 Key
// API 요청 전문 생성 시 시간 정보를 저장합니다.
const ediDate = format.asString('yyyyMMddhhmmss', new Date());
// 요청할 거래번호(TID)를 생성합니다.
const ranNum = Math.floor(Math.random()*(9999-1000+1)) + 1000;
const transactionID = merchantID + "0101" + ediDate.substr(2,12) + ranNum;
// 아래 파라미터에 요청할 값을 알맞게 입력합니다.
const moid = ''; // 가맹점 주문번호
const amt = ''; // 금액
const goodsName = ''; // 상품명
const cardInterest = ''; // 무이자 여부
const cardQuota = ''; // 할부 개월 수
const cardNo = ''; // 카드번호
const cardExpire = ''; // 카드 유효기간(YYMM)
const buyerAuthNum = ''; // 생년월일 또는 사업자번호
const cardPwd = ''; // 카드 비밀번호 앞 2자리
app.use(express.static('public'))
app.use(bodyParser.urlencoded({ extended: false }))
app.post(/keyin, async function(req, res){
// Key=Value 형태의 Plain-Text로 카드정보를 나열합니다.
const aesString = 'CardNo=' + cardNo + '&CardExpire=' + cardExpire + '&BuyerAuthNum=' + buyerAuthNum + '&CardPwd=' + cardPwd;
// 데이터 위변조 검증값을 생성합니다. (거래 위변조를 막기 위한 방법입니다. 수정을 금지합니다.)
const signData = getSignData(merchantID + amt + ediDate + moid + merchantKey).toString();
// 키인 결제(승인) API 요청 후 응답을 받아 console과 브라우저에 출력합니다.
const response = await axios({
url: 'https://webapi.nicepay.co.kr/webapi/card_keyin.jsp',
method: 'POST',
headers: {
'User-Agent': 'Super Agent/0.0.1',
'Content-Type': 'application/x-www-form-urlencoded; charset=euc-kr',
},
data: {
TID: transactionID,
MID: merchantID,
EdiDate: ediDate,
Moid: moid,
Amt: amt,
GoodsName: goodsName,
EncData: getAES(aesString, merchantKey),
SignData: signData,
CardInterest: cardInterest,
CardQuota: cardQuota,
CharSet: 'utf-8'
}
});
console.log('승인 결과:', response.data);
res.json(response.data);
})
//위변조 검증을 위한 SHA-256 암호화 방식입니다.
function getSignData(str) {
const encrypted = CryptoJS.SHA256(str);
return encrypted;
}
//카드 정보를 암호화하기 위한 AES-128-ECB 암호화 함수입니다.
function getAES(text, key){
const encKey = key.substr(0,16);
const cipher = crypto.createCipheriv('aes-128-ecb', encKey, Buffer.alloc(0));
const ciphertext = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]).toString('hex');
return ciphertext;
}
app.listen(port, () => console.log('**\n\nPAYMENT TEST URL:: localhost:3000/keyin\n\n**'))
import os
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers import Cipher
from cryptography.hazmat.primitives.ciphers import algorithms
from cryptography.hazmat.primitives.ciphers import modes
from cryptography.hazmat.primitives.padding import PKCS7
import crypto
import sys
sys.modules['Crypto']=crypto
from flask import Flask, render_template, request
from datetime import datetime
import hashlib, requests, sys, json
from base64 import b64encode, b64decode
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes
import random
app = Flask(__name__)
# 카드 정보를 암호화하기 위한 AES-128-ECB 암호화 함수입니다.
class AES128:
def __init__(self, key: bytes):
self.key = key
self.backend = default_backend()
def encrypt(self, data: bytes) -> bytes:
padder = PKCS7(128).padder()
encryptor = Cipher(algorithm=algorithms.AES(self.key), mode=modes.ECB(), backend=self.backend).encryptor()
padded_data = padder.update(data) + padder.finalize()
EncData = encryptor.update(padded_data) + encryptor.finalize()
return EncData
# 위변조 검증을 위한 SHA-256 암호화 함수입니다.
def getSignData(str):
encoded_str = str.encode()
SignData = hashlib.sha256(encoded_str).hexdigest()
return SignData
# API 요청 전문 생성 시 시간 정보를 저장합니다.
def getEdiDate():
YYYYmmddHHMMSS = datetime.today().strftime("%Y%m%d%H%M%S")
return str(YYYYmmddHHMMSS)
# API 요청을 위한 Header 정보를 세팅 후 실제 API를 호출하고 결과값을 출력하는 함수입니다.
def authRequest(url, data):
headers = {
'Content-type' : 'application/x-www-form-urlencoded', 'charset': 'euc-kr'
}
response = requests.post(
url=url,
data=data,
headers=headers
)
resDict = json.loads(response.text)
print(resDict)
return resDict
# TID 생성 규칙에 맞게 거래일시(YYMMDDHHMISS)를 함수입니다.
def TIME():
YYmmddHHMMSS = datetime.today().strftime("%y%m%d%H%M%S")
return str(YYmmddHHMMSS)
# TID 생성 규칙에 맞게 뒤 랜덤 4자리를 생성하는 함수입니다.
def RANDOM():
a = [random.randint(0,9), random.randint(0,9),random.randint(0,9),random.randint(0,9)]
s = str("".join(map(str,a)))
return str(s)
# 가맹점관리자 페이지(npg.nicepay.co.kr) 로그인 > 가맹점 정보 > Key관리
# 상기 경로를 통해서 가맹점 아이디인 MID와 가맹점 키 값을 확인하여
# 아래 merchantID, merchantKey 파라미터에 각각 입력합니다.
MID = "nictest04m" # 가맹점 아이디(MID)
MerchantKey = "b+zhZ4yOZ7FsH8pm5lhDfHZEb79tIwnjsdA0FBXh86yLc6BJeFVrZFXhAoJ3gEWgrWwN+lJMV0W4hvDdbe4Sjw==" # 가맹점 키
key = "b+zhZ4yOZ7FsH8pm" # 가맹점 키 앞 16자리 - 카드정보 암호화 시 사용되는 Key값
# TIME(), RANDOM() 함수를 통해 생성한 시간 정보와 랜덤 4자리 값을 가져와 API 요청에 필요한 거래번호(TID)를 생성합니다.
# 가맹점 환경에 맞게 TID를 unique하게 생성할 수 있도록 별도 구현하는 것을 권장합니다.
time = TIME() # TID 생성규칙 - 거래 날짜
random = RANDOM() # TID 생성규칙 - 랜덤4자리
TID = MID + "0101" + time + random # 거래번호
plainText = ""
# 아래 파라미터에 요청할 값을 알맞게 입력합니다.
Moid = "" # 상품주문번호
Amt = "" # 결제상품금액
GoodsName = "" # 결제상품명
CardNo = "" # 카드 번호
CardExpire = "" # 카드 유효기간(YYMM)
BuyerAuthNum = "" # 생년월일(6) 또는 사업자번호(10)
CardPwd = "" # 카드 비밀번호 앞 2자리
CardInterest = "" # 무이자 여부(0 : 유이자 / 1 : 무이자)
CardQuota = "" # 카드 할부개월 수
@app.route(methods=['POST'])
def keyInReq():
TID=TID
MID=MID
Moid=Moid
Amt=Amt
GoodsName=GoodsName
CardNo=CardNo
CardExpire=CardExpire
BuyerAuthNum=BuyerAuthNum
CardPwd=CardPwd
CardInterest=CardInterest
CardQuota=CardQuota
EdiDate=getEdiDate()
# Key=Value 형태의 Plain-Text로 카드정보를 나열한 후 암호화합니다.
plainText="CardNo="+CardNo+"&CardExpire="+CardExpire+"&BuyerAuthNum="+BuyerAuthNum+"&CardPwd="+CardPwd
aes128=AES128(key=key.encode())
EncData=aes128.encrypt(data=plainText.encode()).hex()
# 데이터 위변조 검증값을 생성합니다. (거래 위변조를 막기 위한 방법입니다. 수정을 금지합니다.)
SignData=getSignData(MID + Amt + EdiDate + Moid + MerchantKey)
# 결제(승인) API 요청을 위한 Target URL 입니다.
keyInURL="https://webapi.nicepay.co.kr/webapi/card_keyin.jsp"
# 명세서를 참고하여 필요에 따라 파라미터와 값을 'key': 'value' 형태로 추가해주세요.
data = {
'TID': TID,
'MID': MID,
'EdiDate': EdiDate,
'Moid': Moid,
'Amt': Amt,
'GoodsName': GoodsName,
'CardInterest': CardInterest,
'CardQuota': CardQuota,
'EncData': EncData,
'SignData': SignData
}
# keyInURL로 data를 전달하여 API를 호출합니다.
resDict = authRequest(keyInURL, data)
# 결과를 응답받아 'result.html'에 값을 전달합니다.
return render_template(
'result.html',
result=resDict
)
if __name__ == '__main__':
app.run(debug=True)