모듈 연동

스마트로페이 결제모듈 연동을 위한 가이드입니다.
- 해당 메뉴얼의 Parameter 들은 가맹점에 통보 없이 응답값이 추가 될 수 있습니다. 응답값 추가도 고려하여 개발 진행하시길 권장합니다 .
- 스마트로 VAN 단말기를 사용중인 가맹점 대상 포인트페이 연동 가이드입니다.(VAN 계약 필수)

포인트페이

스마트로의 포인트페이 간편결제 서비스 연동에 대한 안내입니다.
통신사와 제휴된 가맹점 전용으로 일반 가맹점에서는 이용이 불가합니다.
* 통신사 포인트의 경우 스마트로 VAN 단말기를 사용 중인 가맹점만 서비스 이용이 가능합니다.
스마트로페이 SERVER IP
스마트로페이 서비스 IP 정보입니다.
구분 IP 비고
테스트 211.193.35.11 STG
운영 - 결제 211.193.35.20
운영 - 재통보 211.193.35.216
211.193.35.217
재통보 서비스 사용시

상세 파라미터

파라미터 항목명 길이(char) 필수여부 설명
PayMethod 지불수단 10 필수 OTPOINT
PointType 결제타입 10 필수 CELLPHONE : 통신사포인트
PointTypeValue 포인트 조회 수단 설정값 3 필수 KTF : KT, SKT : SK, LGT : LG
ProductCode 통신사 제휴코드 8 필수 통신사 정의값
Notice Notice 100 필수 결제창 내 표기될 문구(ex : 포인트 차감)
EdiDate 전문생성일시 14 필수 YYYYMMDDHHmmss(형식)
GoodsCnt 결제상품 품목 개수 2 필수 기본값: 1
GoodsName 거래 상품명 40 필수
Amt 거래 금액 12 필수 숫자만 가능, 문장부호 제외
UsePoint 사용 포인트 12 필수 숫자만 가능, 문장부호 제외
Moid 상품주문번호 40 필수 특수문자 포함 불가
Mid 상점아이디 10 필수
ReturnUrl 결제결과전송URL 100 필수 Http 프로토콜 포함 전체 Url 설정
MallUserId 회원사 고객 ID 20 필수
BuyerName 구매자명 30 필수
BuyerTel 구매자연락처 40 필수 숫자만 입력
( 문자 입력 시 승인 오류가 발생할 수 있습니다. )
BuyerEmail 구매자메일주소 60 필수
EncryptData 암호화데이타 가변 필수
TransType 결제타입 1 필수 0: 일반
MallIp 상점 IP 20 선택 상점서버 IP
UserIp 고객 IP 20 선택 고객 IP
파라미터 항목명 길이(char) 설명
PayMethod 지불수단 10 OTPOINT: 포인트
Tid 거래번호 30
AuthDate 승인일자 12 YYMMDDHHMMSS(형식)
AuthCode 승인번호 30
ResultCode 결과코드 4
ResultMsg 결과메시지 100
PointTypeValue 포인트 조회 수단 설정값 3 KTF: KT, SKT: SK, LGT: LG
Mid 상점아이디 10
Amt 거래 금액 12
BuyerName 구매자명 30
GoodsName 거래 상품명 40
Moid 상품주문번호 40
MallUserId 회원사 고객 ID 20
CardNum 카드번호 16 Masking 처리된 카드번호
UsePoint 사용포인트 9
BalancePoint 잔여포인트 9

샘플 소스
STEP 1-1결제요청 파라미터 설정 및 결제 요청하기
·JSP

String Mid = "";           // 발급받은 테스트 Mid 설정(Real 전환 시 운영 Mid 설정)
String MerchantKey = "";   // 발급받은 테스트 상점키 설정(Real 전환 시 운영 상점키 설정)
String EdiDate = getyyyyMMddHHmmss();
String Amt = "1004";
String EncryptData = encodeSHA256Base64(EdiDate + Mid + Amt + MerchantKey);
String today = getyyyyMMddHHmm();		// 현재일자. 캐시방지용으로 사용

/* SHA256 암호화 */
public static final 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;
}

/* 현재일자 */
public static final String getyyyyMMddHHmmss() {
    SimpleDateFormat yyyyMMddHHmmss = new SimpleDateFormat("yyyyMMddHHmmss");
    return yyyyMMddHHmmss.format(new Date());
}

/* 현재일자  */
public static final String getyyyyMMddHHmm() {
    SimpleDateFormat yyyyMMddHHmm = new SimpleDateFormat("yyyyMMddHHmm");
    return yyyyMMddHHmm.format(new Date());
}


STEP 1-2 결제에 필요한 Form 데이터를 설정합니다.
·JSP


<html lang="ko">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
    <meta name="description" content="" />
    <meta name="author" content="Smartro" />
    <title>SmartroPAY 연동가이드</title>

    <!-- PC/Mobile 구분하여 도메인 변경 필요
         PC 환경에서 호출시 https://tpay.smartropay.co.kr/asset/js/SmartroPAY-1.0.min.js?version=현재일자
         Mobile 환경에서 호출시 https://tmpay.smartropay.co.kr/asset/js/SmartroPAY-1.0.min.js?version=현재일자
    -->
    <!-- 운영 전환 시 도메인 변경
         PC : tpay.smartropay.co.kr -> pay.smartropay.co.kr
         Mobile : tmpay.smartropay.co.kr -> mpay.smartropay.co.kr
    -->
    <!-- script 캐시방지를 위해 ?version=today를 추가  ex) SmartroPAY-1.0.min.js?version=20230101 -->
    <script src="https://tpay.smartropay.co.kr/asset/js/SmartroPAY-1.0.min.js?version=현재일자"></script>

    <script type="text/javascript">
		function goPay() {

			// 스마트로페이 초기화
			smartropay.init({
				mode : 'STG', // STG: 테스트, REAL: 운영(운영서버 전환 시 변경 필수!)
				actionUri : '/point/cellphone/reqPay.do'
			});

			// 스마트로페이 간편결제 요청
			// PC 연동일 경우에만 Callback 함수를 구현합니다. (Mobile은 제외)
			smartropay.payment({
				FormId : 'tranMgr', // 폼ID
				Callback : function(res) { // 인증/승인 분리일경우 콜백함수
					// 승인호출
					var approvalForm = document.approvalForm;
					approvalForm.Tid.value = res.Tid;
					approvalForm.TrAuthKey.value = res.TrAuthKey;
					approvalForm.action = '가맹점 ReturnUrl';
					approvalForm.submit();
				}
			});
		}
	</script>
</head>
<body>
    <form id="tranMgr" name="tranMgr" method="post">
        <!-- 각 값들을 가맹점에 맞게 설정해 주세요. -->
        <input type="text" name="PayMethod" value="OTPOINT" placeholder="" />
        <input type="text" name="PointType" value="CELLPHONE" placeholder="" />
        <input type="text" name="PointGroup" value="OTHER" placeholder="" />
        <input type="text" name="PointTypeValue" maxlength="3" value="KTF" placeholder="" />
        <input type="text" name="ProductCode" value="00000001" placeholder="" />
        <input type="text" name="Notice" value="포인트차감" placeholder="" />
        <input type="text" name="GoodsCnt" maxlength="2" value="1" placeholder="" />
        <input type="text" name="GoodsName" maxlength="40" value="거래상품명" placeholder="" />
        <input type="text" name="Amt" maxlength="12" value="1004" placeholder="" />
        <input type="text" name="UsePoint" maxlength="12" value="300" placeholder="" />
        <input type="text" name="Moid" maxlength="40" value="Moid_20230724154643" placeholder="특수문자 포함 불가" />
        <input type="text" name="Mid" maxlength="10" value="설정한 Mid" placeholder="" />
        <input type="text" name="ReturnUrl" size="100" class="input" value="가맹점 ReturnUrl">
        <input type="text" name="MallUserId" maxlength="20" value="MallUserId" placeholder="" />
        <input type="text" name="BuyerName" maxlength="30" value="구매자명" placeholder="" />
        <input type="text" name="BuyerTel" maxlength="30" value="01099991111" placeholder="" />
        <input type="text" name="BuyerEmail" maxlength="30" value="noname@smartro.co.kr" placeholder="" />
        <input type="text" name="MallIp" maxlength="20" value="10.0.0.1" placeholder="" />
        <input type="text" name="UserIp" maxlength="20" value="10.0.0.1" placeholder="" />
        <input type="text" name="EncryptData" maxlength="100" class="input" value="생성된 EncryptData" placeholder="위/변조방지 HASH 데이터">
        <input type="text" name="TransType" size="1" class="input" value="0">
        <input type="text" name="EdiDate" maxlength="14" value="설정한 EdiDate" placeholder="" />
        <button type="button" class="btn btn-primary" onclick="goPay();">결제하기</button>
    </form>

    <!-- PC 연동의 경우에만 아래 승인폼이 필요합니다. (Mobile은 제외) -->
    <form id="approvalForm" name="approvalForm" method="post">
        <input type="hidden" id="Tid" name="Tid" />
        <input type="hidden" id="TrAuthKey" name="TrAuthKey" />
    </form>
</body>
</html>



STEP 2 HTTPS URL Call로 승인 요청 후 결과 받기
·JSP
        
String url = "https://tapproval.smartropay.co.kr/payment/approval/urlCallApproval.do";		// 테스트
//String url = "https://approval.smartropay.co.kr/payment/approval/urlCallApproval.do";   	// 운영

String Tid       = request.getParameter("Tid")==null?"":request.getParameter("Tid");
String TrAuthKey = request.getParameter("TrAuthKey")==null?"":request.getParameter("TrAuthKey");

HashMap<String, Object> result = callApi(TrAuthKey , Tid, url);

public HashMap<String, Object> callApi(String TrAuthKey, String Tid, 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" );

    	JSONObject body = new JSONObject();
    	body.put("Tid" ,Tid);
    	body.put("TrAuthKey" ,TrAuthKey);

    	char[] bytes = body.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;
}
		
	

INDEX

FAQ
기술 지원 문의
1:1 문의는 아래 이메일로 보내주세요.
필요정보 Mid
Moid or Tid
거래 일시
: