Spring boot kim's Shop/예약시스템

Springboot 예약시스템!(3) 일반결제+예약+예외처리+아임포트

디비드킴 2021. 8. 28. 20:16

결제가 끝나면 오게될 예약 서비스를 봐보자

 

restcontroller

restcontroller.java

dto

reservationDto.java

기본적인 유효성 검사를 해준다

 

reservationService

confrimContents

reservationService.java

롤백을 위해 사용

 @Transactional(rollbackFor = Exception.class)

일반결제시->결제완료 테이블 저장

가상계좌시->가상계좌 테이블 저장

최종 예약테이블 저장 인데

이과정중 예외가 하나라도 발생하면 

모든 과정이 취소되고 환불되야하기 때문이다

 

추가 유효성 검사

confrimInsert(reservationInsertDto);

결제검증

payMentInterFace payMentInterFace=confrimPayment(reservationInsertDto);

예약시도

insertReservation(reservationInsertDto);

결과전송

 JSONObject result=new JSONObject()

 

하니씩 봐보자

 

confrimInsert

reservationService.java

수량이 0보다큰지 검사

if(reservationInsertDto.getTimes().size()<=0)

이미 예약한날에 같은자리인지 검사

if(m.getDateAndTime().equals(DateAndTime)||utillService.compareDate(DateAndTimeLocalDateTime.now()))

다찬시간 예약시도인지 검사

else if(getCountAlreadyInTime(DateAndTime,reservationInsertDto.getSeat())==maxPeopleOfTime)

영업시간외 인지 검사

else if(hour<openTime||hour>closeTime)

마지막잘린 검사는 가상계좌에 관한것이므로

가상계좌파트에서 보자

++추가

(저 마지막 가상계좌 검증은 나중에 따로 뺐다)

 

confrimPayment

reservationService.java

주문의 전체 결제금액 재계산

 int totalPrice=priceService.getTotalPrice(reservationInsertDto.getSeat(),times.size());

결제검증/등록을 위한 인터페이스생성

payMentInterFace payMentInterFace=paymentService.makePaymentInter(reservationInsertDto.getPaymentId(), reservationInsertDto.getEmail(),userDto.getName(), totalPrice,kind,times.get(0));

결제검증/등록을 위한 함수

paymentService.confrimPayment(payMentInterFace)

 

paymentService

makePayment

paymentService.java

confrimPayment

paymentService.java

아임포트/부트페이 두개를 쓰는이유는

가상계좌 때문이다 가상계좌테스트는 부트페이서만 가능한거같다

정식적으로 사업자번호를 받고 한다면 둘중하나로 하면될 거 같다

일단 일반결제이니 아임포트서비스로 가자

 

결제테이블

paymentService.java

일반결제 테이블과

가상결제 테이블 등록 로직이다

이제보니

둘이 합쳐도 되겠는데 생각이든다

 

iamportService

confrimPayment

iamportService.java

결제정보를 받아서

getBuyInfor(payMentInterFace.getPaymentId())

우리가 가진 정보와 비교한다

confrimBuy(getBuyInfor(payMentInterFace.getPaymentId()),payMentInterFace);

 

getBuyInfor

iamportService.java

토큰을 발급받아서

String token=getToken();

토큰과 url+id 조합으로 보내고

buyInforDto buyInforDto=restTemplate.postForObject(impGetInforUrl+impIdentity,buyInforDto.class);

받은 응답중 결제정보를 리턴해주자

 return buyInforDto.getResponse();

자세한건 이전 토이프로젝트에 써져있다

(아직도 첫 api연동의 감동이 잊혀지지가 않는다)

https://cordingmonster.tistory.com/76?category=1032073 

 

Springboot 결제 시스템 만들기! (1) 토큰 발급받기 with 아임포트, HttpHeaders ,RestTemplate,Response

진짜 죽는 줄 알았다 결제만 몇 번 한 건지 모르겠다 오후 2시 부터 했는데 현재 8시이다 일단 결제 시스템을 만든 이유는 사실 예약 변경/수정/삭제는 이제 db에서 delete/update/insert 하는 일만 남았

cordingmonster.tistory.com

confrimBuy

iamportService.java

금액/결제여부 비교

 if(payInter.getTotalPrice()==amount&&status.equals("paid"))

결제방법 set

payInter.setUsedKind((String)buyInfor.get("pay_method"));

결제테이블 등록

paymentService.insertPayment(payInter);

 

cancleBuy

iamportService.java

토큰을 받아서

String token=getToken();

금액이있다면 바디에 넣어주고

없다면 전액 환불 처리가된다

if(zeorOrPrice!=0)

url전송

restTemplate.postForObject("https://api.iamport.kr/payments/cancel",entity,JSONObject.class);

 

reservationService

insertReservation

reservationService.java

이제 선택한 시간 개수만큼 테이블에 넣어주자

 

자이제 환불 로직을 봐보자 

예약 도중 모든 예외는 catch로 가서 커스텀 에러를 타게된다

throw new failBuyException(e.getMessage(),reservationInsertDto.getPaymentId());

 

failBuyException

failBuyException.java

스프링의 DataAccessException을 상속받으면

이렇게 커스텀 예외를 만들 수 있다

 

errorRestController

errorRestController.java

 

상품구매든/예약이든 도중에 예외가 터지면

여기로 오게 만들어서 바로 환불이 진행되게 만든다

(테스트 해봤는데 가상계좌는 발급된거는 취소되지 않는다

나중에 가상계좌 파트에서 봐보자!)

 

테스트 

정상 예약

2023/7/21/10시,15시,17시예약

http://localhost:3030/reservationPage
vscode
vscode
mysql

여러검증을 거쳐서 db에 들어갔다

 

이제 여러 예외테스트를해보자

같은자리 같은시간 예약

http://localhost:3030/reservationPage
자동으로 즉시 결제 취소 

 

 

재밌는걸 발견했다

방금 예외가 터진함수는

confrimContents안의

confrimInsert인데

confrimInsert함수의

failBuyException가아닌

confrimContents

failBuyException로와서

환불이 되었다 즉 예외가 

제일 위 함수로 올라왔다

처음알았다 

이렇게 되면 다른 함수들 캐치가 좀더

심플하게 구성되도 될거같다

 

++추가

허전하기도 하고 예약내역페이지에서

표시해줘야할거같기도해서

iamportService.java

 

카드면 kb카드

point면 카카오페이 

이런식으로 들어 갈 수있게해줬다

mysql