결제가 끝나면 오게될 예약 서비스를 봐보자
restcontroller
dto
기본적인 유효성 검사를 해준다
reservationService
confrimContents
롤백을 위해 사용
@Transactional(rollbackFor = Exception.class)
일반결제시->결제완료 테이블 저장
가상계좌시->가상계좌 테이블 저장
최종 예약테이블 저장 인데
이과정중 예외가 하나라도 발생하면
모든 과정이 취소되고 환불되야하기 때문이다
추가 유효성 검사
confrimInsert(reservationInsertDto);
결제검증
payMentInterFace payMentInterFace=confrimPayment(reservationInsertDto);
예약시도
insertReservation(reservationInsertDto);
결과전송
JSONObject result=new JSONObject()
하니씩 봐보자
confrimInsert
수량이 0보다큰지 검사
if(reservationInsertDto.getTimes().size()<=0)
이미 예약한날에 같은자리인지 검사
if(m.getDateAndTime().equals(DateAndTime)||utillService.compareDate(DateAndTime, LocalDateTime.now()))
다찬시간 예약시도인지 검사
else if(getCountAlreadyInTime(DateAndTime,reservationInsertDto.getSeat())==maxPeopleOfTime)
영업시간외 인지 검사
else if(hour<openTime||hour>closeTime)
마지막잘린 검사는 가상계좌에 관한것이므로
가상계좌파트에서 보자
++추가
(저 마지막 가상계좌 검증은 나중에 따로 뺐다)
confrimPayment
주문의 전체 결제금액 재계산
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
confrimPayment
아임포트/부트페이 두개를 쓰는이유는
가상계좌 때문이다 가상계좌테스트는 부트페이서만 가능한거같다
정식적으로 사업자번호를 받고 한다면 둘중하나로 하면될 거 같다
일단 일반결제이니 아임포트서비스로 가자
결제테이블
일반결제 테이블과
가상결제 테이블 등록 로직이다
이제보니
둘이 합쳐도 되겠는데 생각이든다
iamportService
confrimPayment
결제정보를 받아서
getBuyInfor(payMentInterFace.getPaymentId())
우리가 가진 정보와 비교한다
confrimBuy(getBuyInfor(payMentInterFace.getPaymentId()),payMentInterFace);
getBuyInfor
토큰을 발급받아서
String token=getToken();
토큰과 url+id 조합으로 보내고
buyInforDto buyInforDto=restTemplate.postForObject(impGetInforUrl+impId, entity,buyInforDto.class);
받은 응답중 결제정보를 리턴해주자
return buyInforDto.getResponse();
자세한건 이전 토이프로젝트에 써져있다
(아직도 첫 api연동의 감동이 잊혀지지가 않는다)
https://cordingmonster.tistory.com/76?category=1032073
confrimBuy
금액/결제여부 비교
if(payInter.getTotalPrice()==amount&&status.equals("paid"))
결제방법 set
payInter.setUsedKind((String)buyInfor.get("pay_method"));
결제테이블 등록
paymentService.insertPayment(payInter);
cancleBuy
토큰을 받아서
String token=getToken();
금액이있다면 바디에 넣어주고
없다면 전액 환불 처리가된다
if(zeorOrPrice!=0)
url전송
restTemplate.postForObject("https://api.iamport.kr/payments/cancel",entity,JSONObject.class);
reservationService
insertReservation
이제 선택한 시간 개수만큼 테이블에 넣어주자
자이제 환불 로직을 봐보자
예약 도중 모든 예외는 catch로 가서 커스텀 에러를 타게된다
throw new failBuyException(e.getMessage(),reservationInsertDto.getPaymentId());
failBuyException
스프링의 DataAccessException을 상속받으면
이렇게 커스텀 예외를 만들 수 있다
errorRestController
상품구매든/예약이든 도중에 예외가 터지면
여기로 오게 만들어서 바로 환불이 진행되게 만든다
(테스트 해봤는데 가상계좌는 발급된거는 취소되지 않는다
나중에 가상계좌 파트에서 봐보자!)
테스트
정상 예약
2023/7/21/10시,15시,17시예약
여러검증을 거쳐서 db에 들어갔다
이제 여러 예외테스트를해보자
같은자리 같은시간 예약
재밌는걸 발견했다
방금 예외가 터진함수는
confrimContents안의
confrimInsert인데
confrimInsert함수의
failBuyException가아닌
confrimContents의
failBuyException로와서
환불이 되었다 즉 예외가
제일 위 함수로 올라왔다
처음알았다
이렇게 되면 다른 함수들 캐치가 좀더
심플하게 구성되도 될거같다
++추가
허전하기도 하고 예약내역페이지에서
표시해줘야할거같기도해서
카드면 kb카드
point면 카카오페이
이런식으로 들어 갈 수있게해줬다
'Spring boot kim's Shop > 예약시스템' 카테고리의 다른 글
Springboot 예약내역페이지!(1) 예약내역 보여주기(페이징)+ jpa+mysql inner join (0) | 2021.09.06 |
---|---|
Springboot 예약시스템!(2) 가격 계산해서 전달하기! (0) | 2021.08.26 |
Springboot 예약시스템 만들기!(1) 연/월/일/요일 뿌리기! (2) | 2021.08.21 |