Spring boot kim's Shop/리팩토링

Springboot 결제시스템 리팩토링!(3) 가상계좌 입금전 부분취소 with 세틀뱅크

디비드킴 2021. 9. 21. 11:36

마지막 페이즈이다
제일 어려웠다

가상계좌는 입금 전/후로 나뉜다
거기서도 부분취소가 제일 문제가 된다
입금 후라면 그냥 환불이지만
입금 전이라면... 복잡해진다

일단 세틀 뱅크 사이트를 보는데
채번 수정? 은 찾지 못했다
대신 가상계좌 채변을 서버에서 다시 받을 수 있었다
그래서 이렇게 만들었다

시나리오
부분 취소-> 새로 채번 받기->db수정-> 기존 채번 취소

paymentService는 똑같으므로 참고 바랍니다
https://cordingmonster.tistory.com/162

Spring boot 결제취소/예약취소 리팩토링!(1) with 세틀뱅크/카카오페이

일반 결제 취소 = 카드/카카오페이/가상계좌 입금 후 = 돈이 들어온 후 환불만 해주면 됨 시나리오 요청-> 취소가능 여부 검증-> 예약/상품 테이블 선택 아이템 삭제-> 각 아이템별 결제수단 추출->

cordingmonster.tistory.com

vbankService

vbankService.java

역시 요청을 최소화하기 위해 아이디별로 나눈다
for(int i=0;i<vbankReadysSize;i++){
전액/부분 환불인지 판단한다
deleteOrUpdate(vbankReadys.get(i), minusPrice,deleteRequests);
전액 환불되는 것들을 요청한다
paymentService.requestCancleAccount(j);

deleteOrUpdate

vbankService.java

원래 금액-취소 요청금액=새금액
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

vbankService.java

아주 길다
어떤 상품인지 구별한다
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

Springboot 결제 시스템 개편!(1) 카드/가상계좌 세틀뱅크

바보였다 테스트 신청하자마자 하면 되는 거였는데 3일 전에 알고 부랴부랴 시스템을 개편했다 진짜 힘들었다 변동사항 결제 요청 이전 아임 포트-> 세틀 뱅크 현재 세틀 뱅크 디렉트 연결 예약

cordingmonster.tistory.com

여기서 좀 더 자세하게 적어놓았습니다

makeCancleAccountBody

vbankService.java

채번 취소 시 요구하는 정보를
가공해서 주면 된다

테스트
8개의 예약 넣기 두 번은 거래요청

https://localhost:8443/showReservationPage.html

vbank

mysql

reservation8222833424/reservation5569202985

reservation

mysql

한 개 취소

https://localhost:8443/showReservationPage.html

vbank

새 아이디/금액이 잘 들어가 있다
얘는 채번 취소이기 필수 요청사항에 요청 횟수가 없어서 0이다
근데 올리는 게 좋을 거 같다 나중에 수정해보자!
reservation

mysql

역시 paymentid가 잘 변경되어있다
reservation5569202985-> reservation2829429528

vscode

다중 취소
reservation5569202985 2개
reservation8222833424 1개

https://localhost:8443/showReservationPage.html

vbank

mysql

reservation

mysql
vscode
vscode

하나 완전 취소/나머지 부분 취소

https://localhost:8443/showReservationPage.html

vbank

mysql

1개가 delete 되었다 성공!

vscode

남은 건 새 배번을 받아오고

vscode

전액 환불/잔액이없는건 채번취만 이뤄진다!

마지막 전액환불

https://localhost:8443/showReservationPage.html
vscode

채번 취소 완료!

mysql

delete완료
원래 vid=109/110번 두 개가 있었다

마지막 고민이 있다...
예를 들어
100개를 취소한다 했을 때
99번째에 예외가 터지면
99번째까지 금액은 클라이언트에게 돌아가나
db는 롤백되어버린다
예외를 남용해서 그런가
예외처리를 어떻게 해야 할지 고민이다
예를 들어 조건에 안 맞을 때 그냥 trow 하지 말고
enum으로 fasle 던져서 실패 db를만들어 놓거나..?그래서 다음 꺼는 진행되게 하거나..?
어쨌든 결제시스템은 여기까지 다음 토이 프로젝트 때 좀더 개선해보자!