프로젝트

[SpringBoot & JPA 프로젝트] 토스페이먼츠 카드사심사 후 라이브 API 적용 & 결제 TEST (성공/실패)

sian han 2022. 10. 11. 23:18

 

 

[SpringBoot & JPA 프로젝트] 배포 후 실제 웹서비스 운영 단계로 나아가기

도메인을 구매하고 EC2 인스턴스를 통해 도메인에 프로젝트를 올려놓는 것 까지 완성된 후 실제로 서비스를 런칭하기 위한 3가지 단계가 있었다 1. 사업자 등록증발급 2. 토스페이먼츠 API > 전자

feelfreetothink.tistory.com

 

▲ 이전글 : [SpringBoot & JPA 프로젝트] 배포 후 실제 웹서비스 운영 단계로 나아가기

 

 


 

아 기다리고 오 기다리던

카드사 심사가 13일만에 완료되었습니다 😆

 

 

 

 

개발자 센터에 접속하시면 카드사심사 전에는 활성화되지 않던 라이브 탭이 활성화 되어있는 것을 확인 할 수 있습니다.

 

 

application.properties 에 키를 입력하고 controller 에서 주입을 받아서

결제 테스트를 진행해보았는데요

cannot retry due to server authentication, in streaming mode

 

에러가 발생합니다. 

메세지로만 봐서는 키가 올바르지 않아 reject 된 것으로 추측되는데,

두세번 재확인 해봐도 올바르게 입력했습니다.

뭐가 문제일지 확인해보기로 합니다.

 

 

토스페이먼츠 홈페이지 우측 하단의 플로팅 아이콘을 클릭하면

Tosspayments 기술지원 디스코드의 초대장을 받을 수 있습니다.

 

 

 

디스코드에서 서치하여 저와 같은 오류가 발생한 사례를 찾았습니다.

 

 

역시 토스는 친절합니다.

토스에서 알려준 링크를 접속하여 제시된대로 해결을 시도해봤는데 결론적으로 같은에러가 발생했습니다.

 

코드를 다시 .. 찬찬히 살펴보니

 

${} 를 빼먹어서 제대로 주입이 되지 않네요 ! 

빨리 연동하고 싶은 마음에 너무 서두른 것 같습니다.

 

수정 후 다시 테스트를 진행했습니다.

 

 

테스트 결제가 성공했습니다

연동이 성공했으니 다음단계로 넘어가겠습니다. 

 

 


▶ 결제 성공 TEST

 

1. 한개씩 구매하기

상품 한개씩 결제는 성공했지만

 

주문목록에서

한개 결제한 주문건의(주문번호 50번) 상품명이 목도리 외 1개로 표시되는 것을 확인 할 수 있습니다.

목도리 한개 주문했기 때문에 상품명은 '목도리' 로 출력되야 하는데 말이죠

 

 

상품명(orderName) 출력 로직을 다시 살펴봐야 할 것 같습니다

//사용자의 주문목록 조회
    @Transactional
    public List<OrderDto> selectOrderList(Long userId){
        List<Order> orderList = orderRepository.findOrdersByUser_IdAndOrderStatus(userId, OrderStatus.ORDER);
        List <OrderDto> orderDtoList = new ArrayList<>();

        int itemQty = 0;
        String orderName = "";
        OrderDto orderDto = new OrderDto();

        for(Order order : orderList){ //사용자의 주문갯수만큼
            List<OrderItem> orderItemList = order.getOrderItems();

            for(OrderItem orderItem : orderItemList){ //주문1개의 상품개수만큼
                itemQty ++;
                orderName = orderItem.getItem().getItemName();
            }

            if(itemQty>1){
                itemQty -= 1;
                orderName = orderName + " 외 " + itemQty +"개";
            }

            orderDto = OrderDto.builder()
                    .id(order.getId())
                    .orderName(orderName)
                    .totalPrice(order.getTotalPrice())
                    .regTime(order.getRegTime())
                    .build();

            orderDtoList.add(orderDto);
        }
        return orderDtoList;
    }

중첩 for 문을 사용한 부분이 잘못되었습니다. 

다시보니 어처구니가 없습니다.

 

한 계정으로 한번씩만 결제 테스트를 진행하여 오류를 잡을 수 없었습니다.

한 계정으로 두변 결제를 진행하니 주문건수만큼 itemQty 변수가 증가되어 오류를 찾아냈습니다.

 

 

 

▷ 수정 후

@Transactional
    public List<OrderDto> selectOrderList(Long userId){
        List<Order> orderList = orderRepository.findOrdersByUser_IdAndOrderStatus(userId, OrderStatus.ORDER);
        List <OrderDto> orderDtoList = new ArrayList<>();


        String orderName = "";
        OrderDto orderDto = new OrderDto();

        for(Order order : orderList){ //사용자의 주문갯수만큼
            List<OrderItem> orderItemList = orderItemRepository.findOrderItemByOrder_Id(order.getId());
            log.info("size={}",orderItemList.size());

            int itemQty = orderItemList.size()-1;
            orderName = orderItemList.get(0).getItem().getItemName();
            log.info("itemQty={}",itemQty);
            log.info("orderName={}",orderName);

            if(2<=orderItemList.size()){
                orderName = orderName + " 외 " + itemQty +"개";
            }

            orderDto = OrderDto.builder()
                    .id(order.getId())
                    .orderName(orderName)
                    .totalPrice(order.getTotalPrice())
                    .regTime(order.getRegTime())
                    .build();

            orderDtoList.add(orderDto);
        }
        return orderDtoList;
    }

 

같은계정으로 여러번 주문했을 경우 상품명이 '주문건수' 로 조회되었던 오류가

'주문건 내 상품개수' 로 조회되도록 수정되었습니다.

해결 !

 

 

 

 

2. 상품 여러개 구매하기

장바구니에 상품 2개를 넣고

한번에 결제를 진행해보겠습니다.

 

 

결제 금액 200원. 결제성공입니다.

 

 

주문목록에서도 상품명이 의도한대로 출력됩니다.

 

 

결제 테스트를 성공했으니

이제 여러가지 실패 사례들을 발생시켜보는 테스트를 진행해봐야겠습니다.

 

 

 

 

▶ 결제 실패 TEST

 

1. 잔액부족

 

 

정상적으로 오류메세지와 오류코드가 출력되는 것을 확인할 수 있습니다.

또 어떤 오류케이스가 있을까요 분명 무궁무진할텐데 떠오르는게 없습니다.

떠오르면 테스트 진행해서 추가하도록 하겠습니다.