Spring 결제기능 구현
개요
스프링 프로젝트에서 결제기능을 구현하기 위해 관련된 정보를 찾아본 내용을 정리해보려한다.
한국의 온라인 결제 플로우
온라인 결제에서 핵심적인 역할을 하는 것은 PG라는 개념이다.
PG란 Payment Gateway의 약자로 일반적으로 사용하는 Gateway의 의미와 같다.
온라인 결제수단은 카드, 상품권, 계좌이체 등등 다양하다.
직접 구축한 서비스에서 여러 결제 기관과 계약하고 연동하려면 비용과 시간이 많이 든다.
이를 해결하기 위해 상점이 여러 결제기관과 데이터를 주고받을 수 있도록 게이트웨이를 제공한다. PG사를 동해 여러 은행과 같은 결제 기관과 계약한 것처럼 사용할 수 있다. 출처: 토스 페이먼트 개발자센터
구매자가 결제 버튼을 누르면 카드사의 앱에서 카드 정보를 입력하고 카드사는 카드 정보를 인증한다.
인증된 결제 정보로 결제를 승인하고 결제수단에서 돈을 차감한다.
원래대로라면 가맹점이 PG사와 계약하고 PG사로부터 API를 제공받고 테스트환경에서 검증하고 테스트가 완료되었다면 실제 결제를 위한 환경으로 전환하는 작업이 필요하다. 포트원(이전 아이엠포트)서비스를 이용하면 PG사와 계약하고 위와같은 과정을 거치지 않아도 간단히 구현이 가능하다.
PG사가 다양한 결제 기관과 클라이언트 사이의 인터페이스 역할을 했다면 포트원은 다양한 PG사와 클라이언트 사이의 인터페이스 역할을 한다.
포트원 서비스를 통해 PG사에 구애받지 않고 코드를 작성하고 포트원은 PG사를 호출하여 결제를 진행한다.
Spring에서 결제기능 구현하기
포트원 서비스를 사용해서 웹앱?을 등록하는 과정은 공식 페이지에 자세히 나와있다. 개발자 가이드
결제 연동을 위해 iamport의존성을 추가해준다.
<dependency>
<groupId>com.github.iamport</groupId>
<artifactId>iamport-rest-client-java</artifactId>
<version>0.2.0</version>
</dependency>
프론트에서 결제 버튼을 누르면 동작할 자바스크립트 코드를 작성한다.
IMP.request_pay({
amount : 1000,
buyer_name : '홍길동',
name : '결제테스트'
}, function(response) {
//결제 후 호출되는 callback함수
if ( response.success ) { //결제 성공
console.log(response);
} else {
alert('결제실패 : ' + response.error_msg);
}
})
프론트단에서 먼저 테스트해본 뒤 코드를 작성해도 좋다.
이렇게 하고 스프링에서는 아이엠포트 모듈과 api키를 등록해준다.
private IamportClient iamportClient;
@Value("${API_KEY}")
private String API_KEY;
@Value("${API_KEY_SECRET}")
private String API_KEY_SECRET;
@PostConstruct
public void init() {
this.iamportClient = new IamportClient(API_KEY, API_KEY_SECRET);
}
위에서 살펴본 결제 플로우대로 사용자가 결제를 요청한 뒤 포트원이 결제를 대행한 뒤 결제 정보를 우리 서비스에 전송해주면 이를 실제 결제 정보와 동일한지 확인하고 우리의 서비스에서 결제를 마치면 된다.
콜백함수 function(response) {}
에 우리의 스프링 서버로 비동기 요청을 보낸다.
서버에서는 paymentByImpUid(imp_uid);
메소드를 통해 검증하고 그 결과를 리턴한다. 이걸 프론트에서 받아서 만약 PG사에서 결제한 내용과 같다면 우리 서비스에서 결제를 마무리지으면 된다.