· JSP
지원 언어 :
언어를 선택하세요
JSP
PHP
ASP
Node
Python
String url = "https://tapproval.smartropay.co.kr/payment/approval/approvalUnionBill.do"; // 테스트
// String url = "https://approval.smartropay.co.kr/payment/approval/approvalUnionBill.do"; // 운영
JSONObject body = new JSONObject();
JSONObject paramData = new JSONObject();
String merchantKey = ""; // 발급받은 테스트 상점키 설정(Real 전환 시 운영 상점키 설정)
String Mid = ""; // 발급받은 테스트 Mid 설정(Real 전환 시 운영 Mid 설정)
String EdiDate = getyyyyMMddHHmmss();
String Moid = "";
String BillTokenKey = ""; // 빌링키 발급을 통해 생성된 키
String Amt = "1004";
// 검증값 SHA256 암호화(빌링키 + Mid + 금액)
String VerifyValue = encodeSHA256Base64(BillTokenKey + Mid + Amt);
// 요청 파라미터 (각 값들은 가맹점 환경에 맞추어 설정해 주세요.)
paramData.put("UserIp" ,"10.0.0.1");
paramData.put("MallIp" ,"10.0.0.1");
paramData.put("Mid" ,Mid);
paramData.put("BillTokenKey" ,BillTokenKey);
paramData.put("Moid" ,Moid);
paramData.put("EdiDate" ,EdiDate);
paramData.put("BuyerName" ,"구매자명");
paramData.put("BuyerTel" ,"01022223333");
paramData.put("BuyerEmail" ,"noname@smartro.co.kr");
paramData.put("CardQuota" ,"00");
paramData.put("CardPoint" ,"0");
paramData.put("GoodsCnt" ,"1");
paramData.put("GoodsName" ,"Peach Macarong");
paramData.put("Amt" ,Amt);
paramData.put("SvcAmt" ,"");
paramData.put("VatAmt" ,"");
paramData.put("TaxAmt" ,"");
paramData.put("TaxFreeAmt" ,"");
paramData.put("MallUserId" ,"");
paramData.put("VerifyValue", VerifyValue);
// 날짜 생성 함수
public static String getyyyyMMddHHmmss() {
/** yyyyMMddHHmmss Date Format */
SimpleDateFormat yyyyMMddHHmmss = new SimpleDateFormat("yyyyMMddHHmmss");
return yyyyMMddHHmmss.format(new Date());
}
// 암호화 함수
public static final synchronized String encodeSHA256Base64(String strPW) {
String passACL = null;
MessageDigest md = null;
try {
md = MessageDigest.getInstance("SHA-256");
} catch (Exception e) {
e.printStackTrace();
}
md.update(strPW.getBytes());
byte[] raw = md.digest();
byte[] encodedBytes = Base64.encodeBase64(raw);
passACL = new String(encodedBytes);
return passACL;
}
$url = "https://tapproval.smartropay.co.kr/payment/approval/approvalUnionBill.do"; // 테스트
//$url = "https://approval.smartropay.co.kr/payment/approval/approvalUnionBill.do"; // 운영
$MerchantKey = ""; // 발급받은 테스트 상점키 설정(Real 전환 시 운영 상점키 설정)
$Mid = ""; // 발급받은 테스트 Mid 설정(Real 전환 시 운영 Mid 설정)
$EdiDate = date("YmdHis");
$Moid = "smartro_".$EdiDate;
$BillTokenKey = ""; // 발급받은 빌링키
$Amt = "1004";
// 검증값 SHA256 암호화(빌링키 + Mid + 금액)
$VerifyValue = base64_encode(hash('sha256', BillTokenKey.$Mid.$Amt, true));
// 요청 파라미터 (각 값들은 가맹점 환경에 맞추어 설정해 주세요.)
$paramData = array(
'UserIp' => '10.0.0.1',
'MallIp' => '10.0.0.1',
'Mid' => $Mid,
'BillTokenKey' => $BillTokenKey,
'Moid' => $Moid,
'EdiDate' => $EdiDate,
'BuyerName' => '구매자명',
'BuyerTel' => '01022223333',
'BuyerEmail' => 'noname@smartro.co.kr',
'CardQuota' => '00',
'CardPoint' => '0',
'GoodsCnt' => '1',
'GoodsName' => 'Peach Macarong',
'Amt' => $Amt,
'SvcAmt' => '',
'VatAmt' => '',
'TaxAmt' => '',
'TaxFreeAmt' => '',
'MallUserId' => '',
'VerifyValue' => $VerifyValue
);
url = "https://tapproval.smartropay.co.kr/payment/approval/approvalUnionBill.do" ' 테스트
'url = "https://approval.smartropay.co.kr/payment/approval/approvalUnionBill.do" ' 운영
merchantKey = "" ' 발급받은 테스트 상점키 설정(Real 전환 시 운영 상점키 설정)
Mid = "" ' 발급받은 테스트 Mid 설정(Real 전환 시 운영 Mid 설정)
EdiDate = Year(Now()) & right("0"&Month(Now()),2) & right("0"&Day(Now()),2) & right("0"&Hour(Now()),2) & right("0"&Minute(Now()),2) & right("0"&Second(Now()),2)
Moid = "smartro_" & EdiDate
BillTokenKey = "" ' 발급받은 빌링키
Amt = "1004"
' 검증값 SHA256 암호화(빌링키 + Mid + 금액)
VerifyValue = CryptoUtil.Sha256Encrypt(BillTokenKey & Mid & Amt)
' 요청 파라미터 (각 값들은 가맹점 환경에 맞추어 설정해 주세요.)
Set paramData = jsObject()
paramData("UserIp") = "10.0.0.1"
paramData("MallIp") = "10.0.0.1"
paramData("Mid") = Mid
paramData("BillTokenKey") = BillTokenKey
paramData("Moid") = Moid
paramData("EdiDate") = EdiDate
paramData("BuyerName") = "구매자명"
paramData("BuyerTel") = "01022223333"
paramData("BuyerEmail") = "noname@smartro.co.kr"
paramData("CardQuota") = "00"
paramData("CardPoint") = "0"
paramData("GoodsCnt") = "1"
paramData("GoodsName") = "Peach Macarong"
paramData("Amt") = Amt
paramData("SvcAmt") = ""
paramData("VatAmt") = ""
paramData("TaxAmt") = ""
paramData("TaxFreeAmt") = ""
paramData("MallUserId") = ""
paramData("VerifyValue") = VerifyValue
const axios = require('axios');
const crypto = require('crypto');
const domainUrl = 'https://tapproval.smartropay.co.kr/'; // 테스트 URL
// const domainUrl = 'https://approval.smartropay.co.kr/'; // 운영 URL
// SHA256 해시 생성 함수
function encodeSHA256Base64(data) {
return crypto.createHash('sha256').update(data).digest('base64');
}
// AES256 암호화 함수
function AES256Encode(data, key) {
const iv = Buffer.alloc(16, 0);
const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(key), iv);
let encrypted = cipher.update(data, 'utf8', 'base64');
encrypted += cipher.final('base64');
return encrypted;
}
// 날짜 포맷 함수 (YYYYMMDDHHMMSS)
function getyyyyMMddHHmmss() {
const now = new Date();
const year = now.getFullYear();
const month = ('0' + (now.getMonth() + 1)).slice(-2);
const day = ('0' + now.getDate()).slice(-2);
const hours = ('0' + now.getHours()).slice(-2);
const minutes = ('0' + now.getMinutes()).slice(-2);
const seconds = ('0' + now.getSeconds()).slice(-2);
return `$❴year❵$❴month❵$❴day❵$❴hours❵$❴minutes❵$❴seconds❵`;
}
// JSON 데이터로부터 SHA256 검증값 생성 함수
function createVerifyValue(billTokenKey, mid, amt) {
return encodeSHA256Base64(billTokenKey + mid + amt);
}
// 테스트 함수
async function urlCall() {
const restRequestUrl = domainUrl + 'payment/approval/approvalUnionBill.do';
const merchantKey = ''; // 발급받은 테스트 상점키 설정
const Mid = ''; // 발급받은 테스트 Mid 설정
const EdiDate = getyyyyMMddHHmmss();
const Moid = ''; // 적절한 Moid 설정
const BillTokenKey = ''; // 빌링키 발급을 통해 생성된 키
const Amt = '200';
// 검증값 SHA256 암호화
const VerifyValue = createVerifyValue(BillTokenKey, Mid, Amt);
const body = {
Mid: Mid,
BillTokenKey: BillTokenKey,
Moid: Moid,
EdiDate: EdiDate,
BuyerName: '구매자명',
BuyerTel: '01022223333',
BuyerEmail: 'noname@smartro.co.kr',
CardQuota: '00',
CardPoint: '0',
GoodsCnt: '1',
GoodsName: 'Peach Macarong',
Amt: Amt,
SvcAmt: '',
VatAmt: '',
TaxAmt: '',
TaxFreeAmt: '',
MallUserId: '',
VerifyValue: VerifyValue
};
// JSON 데이터 AES256 암호화
const sendObject = {
EncData: AES256Encode(JSON.stringify(body), merchantKey.substring(0, 32)),
Mid: Mid
};
// .... STEP2 요청 및 결과 받기
from django.shortcuts import render
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json
import requests
import base64
import hashlib
import datetime
from Cryptodome.Cipher import AES
from Cryptodome import Random
# EdiDate 생성
def getyyyyMMddHHmmss():
return datetime.datetime.now().strftime("%Y%m%d%H%M%S")
# EncryptData 생성
def encodeSHA256Base64(strPW):
sha256_object = hashlib.sha256()
sha256_object.update(strPW.encode())
return base64.b64encode(sha256_object.digest()).decode("utf-8")
@csrf_exempt
def approvalResponse(request):
# 빌링 승인 요청
# 운영 : https://approval.smartropay.co.kr/payment/approval/approvalUnionBill.do
# 테스트 : https://tapproval.smartropay.co.kr/payment/approval/approvalUnionBill.do
url = 'https://tapproval.smartropay.co.kr/payment/approval/approvalUnionBill.do'
Mid = "" # 발급받은 테스트 Mid 설정(Real 전환 시 운영 Mid 설정)
MerchantKey = "" # 발급받은 테스트 상점키 설정(Real 전환 시 운영 상점키 설정)
EdiDate = getyyyyMMddHHmmss()
MallUserId = ""
Moid = ""
BillTokenKey = "" # 빌링키 발급을 통해 생성된 키
Amt = ""
# 검증값 SHA256 암호화(빌링키 + Mid + 금액)
VerifiyValue = encodeSHA256Base64(BillTokenKey + Mid + Amt)
paramData = {
'PayMethod' : 'CARD',
'UserIp' : '10.0.0.1',
'MallIp' : '10.0.0.1',
'Mid' : Mid,
'BillTokenKey' : BillTokenKey,
'Moid' : Moid,
'EdiDate' : EdiDate,
'BuyerName' : '구매자명',
'BuyerTel' : '01012345678',
'BuyerEmail' : 'noname@smartro.co.kr',
'CardQuota' : '00',
'CardPoint' : '0',
'GoodsCnt' : '1',
'GoodsName' : 'Peach Macarong',
'Amt' : Amt,
'VatAmt' : '',
'TaxAmt' : '',
'TaxFreeAmt' : '',
'MallUserId' : MallUserId,
'VerifyValue' : VerifiyValue
}
# .... STEP2 요청 및 결과 받기
· JSP
지원 언어 :
언어를 선택하세요
JSP
PHP
ASP
Node
Python
// json 데이터 AES256 암호화
try {
body.put("EncData", AES256Cipher.AES_Encode(paramData.toString(), merchantKey.substring(0,32)));
body.put("Mid", Mid);
} catch(Exception e){
e.printStackTrace();
}
HashMap<String, Object> result = callApi(body, url);
public HashMap<String, Object> callApi(JSONObject json, String callUrl) {
StringBuilder responseBody = null;
HashMap<String, Object> result = new HashMap<>();
// http urlCall 승인 요청 및 TrAuthKey 유효성 검증
int connectTimeout = 1000;
int readTimeout = 20000; // 원천사 별로 최대 응답 시간이 상이하므로 가맹점 환경에 맞게 Timeout 설정
URL url = null;
HttpsURLConnection connection = null;
try {
SSLContext sslCtx = SSLContext.getInstance("TLSv1.2");
sslCtx.init(null, null, new SecureRandom());
url = new URL(callUrl);
System.out.println(" url " + url.toString());
connection = (HttpsURLConnection)url.openConnection();
connection.setSSLSocketFactory(sslCtx.getSocketFactory());
connection.addRequestProperty("Content-Type", "application/json");
connection.addRequestProperty("Accept", "application/json");
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setConnectTimeout(connectTimeout);
connection.setReadTimeout(readTimeout);
OutputStreamWriter osw = new OutputStreamWriter(new BufferedOutputStream(connection.getOutputStream()) , "utf-8" );
char[] bytes = json.toString().toCharArray();
osw.write(bytes,0,bytes.length);
osw.flush();
osw.close();
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));
String line = null;
responseBody = new StringBuilder();
while ((line = br.readLine()) != null) {
System.out.println(" response " + line);
responseBody.append(line);
}
br.close();
// 결제결과
result = new ObjectMapper().readValue(responseBody.toString(), HashMap.class);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
// json 데이터 AES256 암호화
$EncData = base64_encode(openssl_encrypt(json_encode($paramData), 'aes-256-cbc', substr($MerchantKey,0,32), true, str_repeat(chr(0), 16)))
$body = array(
'EncData' => $EncData,
'Mid' => $Mid
);
// json data
$body = json_encode($body);
$ret = Curl($url, $body, $http_status);
function Curl($url, $post_data, $http_status, $header = null) {
$ch=curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
// post_data
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json', 'Content-Type: application/json'));
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
$body = null;
// error
if (!$response) {
$body = curl_error($ch);
// HostNotFound, No route to Host, etc Network related error
$http_status = -1;
Log::error("CURL Error: = " . $body);
} else {
//parsing http status code
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (!is_null($header)) {
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
} else {
$body = $response;
}
}
curl_close($ch);
return $body;
}
' EncData 암호화 (paramData → AES256 with 32-byte key)
EncData = CryptoUtil.Aes256Encrypt(paramData.jsString(), left(merchantKey, 32))
' CryptoUtil의 암호화 및 복호화 함수는 FAQ 메뉴의 "기타" 항목에서 확인하실 수 있습니다.
Set CryptoUtil = Nothing
' 최종 요청 본문 JSON 구성
Set body = jsObject()
body("EncData") = EncData
body("Mid") = smartroMid
' POST 전송 및 결과 수신
result = sendPost(url, body)
Response.Write "결과 : " & result
' 요청 함수 정의
Function sendPost(url, objJson)
Set httpRequest = Server.CreateObject("MSXML2.ServerXMLHTTP")
httpRequest.open "POST", url, False
httpRequest.setRequestHeader "Content-type","application/json"
httpRequest.setRequestHeader "Accept","application/json"
httpRequest.send objJson.jsString
postResponse = httpRequest.ResponseText
sendPost = postResponse
End Function
' JSON 객체 클래스
Function jsObject()
Dim obj
Set obj = New JsonWrapper
Set jsObject = obj
End Function
Class JsonWrapper
Private dict
Private Sub Class_Initialize()
Set dict = Server.CreateObject("Scripting.Dictionary")
End Sub
Public Property Let Item(key, value)
dict(key) = value
End Property
Public Default Property Get Item(key)
Item = dict(key)
End Property
Public Function jsString()
Dim key, json, value
json = "{"
For Each key In dict.Keys
value = Replace(dict(key), """", "\""") ' 따옴표 escape
json = json & """" & key & """:""" & value & ""","
Next
If dict.Count > 0 Then json = Left(json, Len(json) - 1) ' 마지막 쉼표 제거
json = json & "}"
jsString = json
End Function
End Class
%>
// .... STEP2 요청 및 결과 받기
try {
const response = await axios.post(restRequestUrl, sendObject, {
headers: {
'Content-Type': 'application/json'
}
});
console.log('============ test Result ============== \n', response.data);
} catch (error) {
console.error("API 호출 중 오류 발생:", error);
}
}
// 요청 함수 호출
urlCall();
# .... STEP2 요청 및 결과 받기
# json 데이터 AES256 암호화(하단 AES256 암호화 함수 참고)
json_data = json.dumps(paramData)
EncData = AES_Encode(json_data, MerchantKey[0:32])
body = {
'EncData' : EncData,
'Mid' : Mid
}
headers = {
"Content-Type" : "application/json",
"Accept" : "application/json"
}
# 가맹점에 맞게 TimeOut 조절
connectionTimeout = 1000
readTimeout = 10000
# 결과
response = requests.post(url, data=json.dumps(body), headers=headers, timeout=(connectionTimeout, readTimeout))
return render(request, "가맹점 결과완료 페이지.html", context=response.json())