[SERVER] - shared solution project : IAMPORT로 결제 기능 구현

2024. 9. 14. 10:33카테고리 없음

 

프로젝트 진행중 아무래도 비즈니스모델을 구축하려면 결제기능은 필수라고 생각하여 결제기능을 구현해야겠다고 생각하였습니다.

 

결제 게이트 웨이 시스템중 IAMPORT를 사용하기로 결정하였습니다. 

IAMPORT는 신용카드, 체크카드, 휴대폰 결제, 은행 이체, 가상 계좌, 간편 결제(카카오페이, 네이버페이, 페이코) 등 다양한 결제 수단을 지원하며, 한 가지 api로 다양한 결제 수단을 처리할 수 있어 개발과 유지보수가 용이한다는 이점이 있었기 때문입니다.

그중 가장 이점이라고 생각하였던 것은 IAMPORT의 결제 시스템에 대한 유연성입니다. 결제 금액 조정, 결제 후 리다이렉션 처리, 결제 페이지 커스터마이징 등 필요한 기능을 자유롭게 구현할 수 있어서 결제 에러처리, 결제 후 결제 사안에 대한 데이터 처리를 제한 없이 구현할 수 있다고 생각하였습니다.

 

IAMPORT의 시스템 구조

 

 

 

구현시에는 우선 api key를 발급받아줍니다.( 프론트와 서버에서 결제 요청 인증시 필요하니 꼭 발급받아야합니다. )

다음으로는 서버에서 구현시 결제할 항목들을 설정하여서 enum으로 지정해놔주었습니다. ( 1000원 결제시 1000포인트 충전식으로 비즈니스 모델을 임시 설정하였습니다. )

그후 결제와 주문 엔티티를 생성해주었습니다.

다음으로는 클라이언트에서 특정 item을 요청시 주문 번호를 생성하게 하였습니다.

이때 orderUid는 uuid로 생성하여서 넣어줍니다. <- 추후 결제 인증을 위함입니다.

( 이때 결제엔티티도 빌드해서 결제 레포지토리에 일단 저장해줍니다. )

 

다음으로 클라이언트측에서 발급받은 오더 id를 통하여 서버에 결제 데이터를 조회해줍니다.

 

그럼 클라이언트는 결제자의 대한 이름, 이메일, 결제 금액, 결제 항목, 생성했던 orderUid를 응답으로 받게됩니다.

 

그럼 클라이언트는 이제 IMP라이브러리로 IAMPORT에 결제 요청을 보내주게됩니다. ( 이때 IAMPORT에서 발급받은 IMP코드를 통하여 IMPORT 선언 및 초기화를 진행해주어야합니다.

 

그럼 이때 클라이언트가 iamport에 결제 요청을 보내면 콜백으로 결제자의 대한 결제 고유번호와 주문번호를 주게됩니다.

그럼 이 정보를 통하여 서버에서 에러처리를 해주어야합니다.

 

이때 서버에서는 IAMPORT CLIENT를 통하여 클라이언트에서 받은 정보로 결제조회를 해줍니다. ( 해당 결제가 있는 결제인지 에러처리를 해주기 위함입니다. )

추가적으로 아임포트 콜백으로 온 응답중 orderUid도 같이 오게되는데 이때 이 정보를 가지고 있는 주문인지 확인을 한번 더 해줬습니다.

 

iamportResponse로 IAMPORT에서 응답을 주게되는데 공식문서를 살펴보면 

 

 

 

이렇게 케이스별로 나뉘어져서 응답이 오는걸 알 수 있습니다.

따라서 응답으로 온 결제 요청이 상태가 paid상태가 아니라면 결제가 미완료 됐다는 에러를 띄워주고 해당 정보를 레포지토리에서 삭제해줬습니다.

 

다음으로 아까 클라이언트에서 IAMPORT에 결제 요청을 보낼때 주문 금액도 같이 넣어서 요청하였는데,

이때 클라이언트 측에서 의도적으로 price값을 바꾸어서 요청을 보내게되면 10000원 가격의 상품을 구매하였는데 결제 요청시에는 1000원이라고 설정해놓으면 1000원으로 10000원의 상품을 결제 할 수 있다고 생각하였습니다.

이에 대한 에러처리가 필요할 것 같아서 iamport에서 서버에 준 응답과 서버의 데이터베이스에 지정된 금액과 일치한지 판별하는 에러처리를 해주었습니다.

 

 

결제가 성공되면 해당 주문의 상태를 PAID로 변경하고, 결제 금액만큼 해당 유저의 포인트를 변경 해주었습니다.

 

 

클라이언트 측에서는 모든 결제 인증이 통과될시, 결제 성공 페이지로 리다이렉팅되게 구현하였고, 에러시 에러페이지로 리다이렉팅 되게끔 처리하면 될 것 같습니다.