모듈 연동

스마트로페이 결제모듈 연동을 위한 가이드입니다
- Test 연동시 체크 카드는 사용자제 부탁드립니다. 체크 카드 결제시 Test 계에서는 당일 전체 취소만 가능 합니다 (부분취소 지원 불가)
- 스마트로 사업자번호로 제공된 테스트 Mid는 국민카드(카카오뱅크), 하나카드 결제가 불가합니다.
- 해당 메뉴얼의 Parameter 들은 가맹점에 통보 없이 응답값이 추가 될 수 있습니다. 응답값 추가도 고려하여 개발 진행하시길 권장합니다 .

Online 신용카드 통합빌링

신/구빌링 통합 승인을 위한 API 서비스입니다
스마트로페이 SERVER IP
스마트로페이 서비스 IP 정보입니다.
구분 IP 비고
테스트 211.193.35.11 STG
운영 - 결제 211.193.35.20
운영 - 재통보 211.193.35.216
211.193.35.217
재통보 서비스 사용시

빌링결제 파라미터

파라미터 항목명 길이(char) 필수여부 설명
PayMethod 지불수단 20 필수 CARD
GoodsCnt 결제상품 품목 개수 2 필수 기본값: 1
GoodsName 거래 상품명 40 필수
Amt 거래 금액 12 필수 숫자만 가능, 문장부호 제외
Moid 상품주문번호 40 필수 특수문자 포함 불가
MallUserId 회원사 고객 ID 20 필수 빌링 결제 요청시 고객 구분값으로 사용(구 빌링일 경우 미사용)
영어 대·소문자, 숫자 사용 가능(특수문자 포함 불가)
Mid 상점아이디 10 필수
BillTokenKey 고정식 토큰(빌링키) 30 필수 복호화하여 전송
BuyerName 구매자명 30 필수
BuyerTel 구매자연락처 40 필수 숫자만 입력
( 문자 입력 시 승인 오류가 발생할 수 있습니다. )
BuyerEmail 구매자메일주소 60 필수
CardQuota 할부 개월 2 필수 00: 일시불(기본값), 02, 03, ...
VerifyValue 위·변조 검증값 50 필수 SHA256 해시 암호화
MallIp 상점 IP 20 선택 상점서버 IP
UserIp 고객 IP 20 선택 고객 IP
TaxAmt 과세 9 선택 숫자만 가능, 문장부호 제외
TaxFreeAmt 비과세 9 선택 숫자만 가능, 문장부호 제외
VatAmt 부가세 9 선택 숫자만 가능, 문장부호 제외
CardPoint 포인트 사용여부 1 선택 신용카드 카드포인트 사용여부
파라미터 항목명 길이(char) 설명
AuthDate 승인일자 12 YYMMDDHHMMSS(형식)
AuthCode 승인번호 30
ResultCode 결과코드 4
ResultMsg 결과메시지 100
AppCardCode 발급사코드 2
AppCardName 발급사명 20
VerifyValue 위·변조 검증값 50 SHA256 해시 암호화
MallReserved 상점예비정보 500 결제 요청 시 설정한 값 전달

STEP 1-1 빌링결제 요청 파라미터 설정하기
·JSP
        
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;
}
		
	

STEP 1-2 HTTPS URL Call로 승인 요청 후 결과 받기
·JSP
        
// 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;
}
		
	

INDEX

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