마지막 페이즈이다
제일 어려웠다
가상계좌는 입금 전/후로 나뉜다
거기서도 부분취소가 제일 문제가 된다
입금 후라면 그냥 환불이지만
입금 전이라면... 복잡해진다
일단 세틀 뱅크 사이트를 보는데
채번 수정? 은 찾지 못했다
대신 가상계좌 채변을 서버에서 다시 받을 수 있었다
그래서 이렇게 만들었다
시나리오
부분 취소-> 새로 채번 받기->db수정-> 기존 채번 취소
paymentService는 똑같으므로 참고 바랍니다
https://cordingmonster.tistory.com/162
vbankService
역시 요청을 최소화하기 위해 아이디별로 나눈다
for(int i=0;i<vbankReadysSize;i++){
전액/부분 환불인지 판단한다
deleteOrUpdate(vbankReadys.get(i), minusPrice,deleteRequests);
전액 환불되는 것들을 요청한다
paymentService.requestCancleAccount(j);
deleteOrUpdate
원래 금액-취소 요청금액=새금액
int newPrice=minusPrice(Integer.parseInt(getClientInter.getVtrd_amt()),minusPrice);
새금액이 0보다 크다면 새 채번 요청
if(newPrice>0){
세틀 뱅크가 요구하는 정보 만들기
JSONObject body=makeGetReAccountBody(getClientInter,newPrice);
세틀 뱅크와 통신
JSONObject response =paymentService.requestGetNewAccount(body);
결과받아서 가공
LinkedHashMap<String,Object>data
LinkedHashMap<String,Object>params
vbank테이블 수정
vbankDao.updateVbankvtl_acnt_noAndvmcht_trd_noAndPriceNative(vAcntNo,trdAmt,mchtTrdNo,trdNo,vid);
상품에 따라 테이블 수정
if(getClientInter.getSeat()!=null){
수정해주는 이유는 join시 paymentid로 조인해온다
새 채번을 받는다면 paymentid가 변경되므로 해주는 것!
0이라면
전 확 환불 or 남은 금액이 없으므로 delete작업을 해주고
vbankDao.deleteById(Integer.parseInt(getClientInter.getVid()));
채번 취소 시 요구하는 정보 만들기
makeCancleAccountBody(getClientInter,deleteRequests);
makeGetReAccountBody
아주 길다
어떤 상품인지 구별한다
if(getClientInter.getSeat()!=null){
(일반상품인 경우 이름도 바꿔줘야 할 수도 있기 때문에)
새 상점 고유 아이디 발급
itmeName=getClientInter.getSeat();
mchtTrdNo=aboutPayEnums.reservation.getString()+utillService.GetRandomNum(10);
입금 일자/은행 정보는 새로 만들지 않고 기존 db에서 가져온다
utillService.replaceDate(getClientInter.getVexpire_dt());
data.put("bankCd", getClientInter.getVfn_cd());
부분 취소가 일어난다 해서 계좌/금액은 바뀌어도
은행이 바뀌거나 입금일지가 바뀌면 안 되게 하려고 한다
요구사항대로 정보 가공
이 부분은
https://cordingmonster.tistory.com/160
여기서 좀 더 자세하게 적어놓았습니다
makeCancleAccountBody
채번 취소 시 요구하는 정보를
가공해서 주면 된다
테스트
8개의 예약 넣기 두 번은 거래요청
vbank
reservation8222833424/reservation5569202985
reservation
한 개 취소
vbank
새 아이디/금액이 잘 들어가 있다
얘는 채번 취소이기 필수 요청사항에 요청 횟수가 없어서 0이다
근데 올리는 게 좋을 거 같다 나중에 수정해보자!
reservation
역시 paymentid가 잘 변경되어있다
reservation5569202985-> reservation2829429528
다중 취소
reservation5569202985 2개
reservation8222833424 1개
vbank
reservation
하나 완전 취소/나머지 부분 취소
vbank
1개가 delete 되었다 성공!
남은 건 새 배번을 받아오고
전액 환불/잔액이없는건 채번취만 이뤄진다!
마지막 전액환불
채번 취소 완료!
delete완료
원래 vid=109/110번 두 개가 있었다
마지막 고민이 있다...
예를 들어
100개를 취소한다 했을 때
99번째에 예외가 터지면
99번째까지 금액은 클라이언트에게 돌아가나
db는 롤백되어버린다
예외를 남용해서 그런가
예외처리를 어떻게 해야 할지 고민이다
예를 들어 조건에 안 맞을 때 그냥 trow 하지 말고
enum으로 fasle 던져서 실패 db를만들어 놓거나..?그래서 다음 꺼는 진행되게 하거나..?
어쨌든 결제시스템은 여기까지 다음 토이 프로젝트 때 좀더 개선해보자!
'Spring boot kim's Shop > 리팩토링' 카테고리의 다른 글
Springboot 리팩토링 재고정리 시스템! (0) | 2021.09.25 |
---|---|
Springboot 로그인 리팩토링! with ResponseCookie (0) | 2021.09.21 |
Spring boot 결제시스템 리팩토링!(2) with 세틀뱅크/카카오페이 (0) | 2021.09.19 |
Springboot 예약내역 페이지 리팩토링! with left join (0) | 2021.09.19 |
Springboot 결제 시스템 리팩토링!(1) 카드/가상계좌 세틀뱅크 (0) | 2021.09.15 |