본문 바로가기
JAVA

아임포트(i'mport) 결제 기능 구현하기

by snow_white 2023. 5. 9.

아임포트(i'mport)

아임포트는 국내 PG결제 연동을 쉽게해주는 결제 API서비스로 간편하게 온라인에서 결제 기능을 구현할 수 있습니다. 아임포트는 다양한 결제 수단을 지원하며, 개발자들이 쉽게 결제 시스템을 구현할 수 있도록 API를 제공합니다. 또한, 결제 외에도 구독, 정기결제, 본인인증, 가상계좌 등 다양한 기능을 제공하고 있습니다.

PG(Payment gateway)란?

온라인 쇼핑몰의 경우,

PG사와의 계약을 통해 전자결제서비스를 구축해야만 거래가 가능합니다.

PG사는 신용카드사와 직접 계약하기 어려운 온라인 쇼핑몰을 대신해 결제와 정산 업무를 대행해 주는 업체를 뜻합니다.

PG사와 계약을 하면, 카드결제, 휴대폰 결제, 계좌이체, 무통장입금 등 다양한 결제 수단을 쇼핑몰 방문 고객에게 제공할 수 있습니다.

(1) 아임포트 라이브러리 추가

아임포트는 jquery를 기반하기 때문에 jquery가 설치되어 있어야합니다.

결제 기능이 필요한 페이지에 코드를 작성합니다.

<!-- jQuery -->
<script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.min.js" ></script><!-- iamport.payment.js -->
<script type="text/javascript" src="https://cdn.iamport.kr/js/iamport.payment-{SDK-최신버전}.js"></script>

 

(2) 아임포트 결제 준비

가맹점 식별코드

아임포트에서 제공하는 모듈을 사용할 때 가맹점을 구분하기 위해, 관리자 페이지 가입과 동시에 자동 발급되는 고유한 문자입니다.

결제모듈의 경우, 결제요청 전에 IMP.init('가맹점 식별코드') 호출이 필요한데, 가맹점 식별코드가 호출 파라미터로 사용된다.

  1. 아임포트 회원가입
  2. 홈페이지 로그인 후 오른쪽 상단 관리자 콘솔 클릭 또는 i'mport 관리자페이지 접속

 

🔑가맹점 식별코드 및 API 시크릿 키 발급

javascript의 아래 가맹점 식별코드와 PG사 정보를 추가해줍니다.

<script>
	function iamport(){
		//가맹점 식별코드
		IMP.init('impXXXXXXXX');
		IMP.request_pay({
		    pg : 'inicis',
		    pay_method : 'card',
		    merchant_uid : 'merchant_' + new Date().getTime(),
		    name : '상품1' , //결제창에서 보여질 이름
		    amount : 100, //실제 결제되는 가격
		    buyer_email : 'iamport@siot.do',
		    buyer_name : '구매자이름',
		    buyer_tel : '010-1234-5678',
		    buyer_addr : '서울 강남구 도곡동',
		    buyer_postcode : '123-456'
		}, function(rsp) {
			console.log(rsp);
			// 결제검증
			$.ajax({
	        	type : "POST",
	        	url : "/verifyIamport/" + rsp.imp_uid 
	        }).done(function(data) {
	        	
	        	console.log(data);
	        	
	        	// 위의 rsp.paid_amount 와 data.response.amount를 비교한후 로직 실행 (import 서버검증)
	        	if(rsp.paid_amount == data.response.amount){
		        	alert("결제 및 결제검증완료");
	        	} else {
	        		alert("결제 실패");
	        	}
	        });
		});
	}
</script>

스프링 설정

1. 아임포트 라이브러리 추가

아임포트 라이브러리를 프로젝트에 추가해야 합니다. Gradle을 사용하는 경우 build.gradle 파일에 다음과 같은 의존성을 추가합니다.

dependencies {
    implementation 'com.siot.iamport:iamport-rest-client-java:2.0.0'
}

build.gradle 하단에 아래 코드를 추가합니다.

allprojects {
	repositories {
		maven { url '<https://jitpack.io>' }
	}
}

 

2. 결제 요청 처리

결제 요청을 처리하기 위해, PaymentService 클래스를 만들어 아임포트 라이브러리를 사용하여 결제 요청을 보내고 결과를 받아옵니다.

위의 가맹점 식별코드 확인 창에서 REST API KEYREST API Secret을 환경변수로 추가합니다.

import com.siot.iamport.restclient.IamportClient;
import com.siot.iamport.restclient.exception.IamportResponseException;
import com.siot.iamport.restclient.request.CancelData;
import com.siot.iamport.restclient.response.Payment;
import com.siot.iamport.restclient.response.PaymentCancelDetail;

@Service
public class PaymentService {
    @Value("${iamport.api.key}")
    private String apiKey;
    
    @Value("${iamport.api.secret}")
    private String apiSecret;
    
    public Payment getPayment(String impUid) throws IamportResponseException {
        IamportClient client = new IamportClient(apiKey, apiSecret);
        return client.paymentByImpUid(impUid).getResponse();
    }
    
    public Payment cancelPayment(String impUid, int amount, String reason) throws IamportResponseException {
        IamportClient client = new IamportClient(apiKey, apiSecret);
        CancelData cancelData = new CancelData(impUid, amount, reason);
        return client.cancelPaymentByImpUid(cancelData).getResponse();
    }
    
    public PaymentCancelDetail getCancelDetail(String impUid) throws IamportResponseException {
        IamportClient client = new IamportClient(apiKey, apiSecret);
        return client.paymentCancelDetailByImpUid(impUid).getResponse();
    }
}

위 코드에서는 getPayment() 메소드를 사용하여 결제 정보를 가져오고, cancelPayment() 메소드를 사용하여 결제를 취소하며, getCancelDetail() 메소드를 사용하여 결제 취소 상세 정보를 가져옵니다.

Payment 객체에서 정상 결제 응답을 받으려면 다음과 같이 코드를 작성할 수 있습니다.

// 아임포트 API를 통해 결제 요청 후, Payment 객체가 생성됨

// Payment 객체의 status가 "paid"인 경우, 결제가 성공한 것으로 간주할 수 있음
if(payment.getStatus().equals("paid")){
    // 결제 성공 처리
} else {
    // 결제 실패 처리
}

위의 코드에서 payment는 아임포트 API를 통해 생성된 Payment 객체를 가리킵니다. Payment 객체의 status는 "paid"일 경우, 결제가 성공한 것으로 간주할 수 있습니다. 따라서 if 문을 사용하여 Payment 객체의 status가 "paid"인지 확인한 후, 결제 성공 처리를 하면 됩니다. Payment 객체의 status가 "paid"가 아닌 경우, 결제 실패 처리를 하면 됩니다.

댓글