사실 트러블 슈팅이라고 하기엔 좀 어이없는? 트러블 슈팅이였지만 적어봅니다..
시뮬레이터로 결제 테스트를 하던 와중에 갑자기 결제가 제대로 되지 않은 문제가 발생했다. 분명히 잘 작동하던 로직들이였는데 무슨 문제인가 싶었고 로그를 찍어둔게 있어서 확인해봤다.
"data": {
"message": "주문 수정 중 오류가 발생했습니다: fromisoformat: argument must be str",
"strror"
}
결제완료 시점에 문제가 발생했는데 시간 포멧이 잘못된거 같았다... (뭐가 문제지..?) 에러 확인하고 좀 찾아봤는데 시간을 넣을 때 none으로 들어와서 로그를 다시 찍어봤더니 좀 황당했다..
{
"mId": "~~~~~~~",
"status": "WAITING_FOR_DEPOSIT",
"method": "가상계좌",
"virtualAccount": {
"accountNumber": "~~~~~~~~",
"dueDate": "2024-12-28T22:17:45+09:00",
"expired": false
}
}
로그를 찍었을 때 토스쪽에서 받는 response를 보니까 status에서 문제를 알 수 있었다. 그 전에는 다른 결제 방식으로 결제를 했지만 가상 계좌로 결제를 하면 status처럼 결제 대기 상태를 받아오고 있지만 그 전에 코드에서는
request.payment_status = PaymentStatus.PAYMENT_COMPLETED
request.order_status = OrderStatus.ORDER_COMPLETED
request.approved_at = _convert_to_kst(response['approvedAt'])
이런 식으로 결제가 완료되면 approved_at을 한국 시간으로 변경을 하고 있었지만, 가상 계좌는 결제 대기중이라 approved_at이 None으로 받아오고 있어서 난 에러였다.
찾아보니 토스에서 주는 status가 꽤 세분화되어 있었다
토스페이먼츠 주요 상태값
READY: 결제 생성
PENDING: 결제 진행 중
WAITING_FOR_DEPOSIT: 가상계좌 입금 대기
SUCCESS: 결제 완료
EXPIRED: 가상계좌 입금 기한 만료
CANCELED: 결제 취소
PARTIAL_CANCELED: 부분 취소
ABORTED: 결제 중단
FAILED: 결제 실패
WAITING_FOR_DEPOSIT: 가상계좌 입금 대기 이것때문에 오류가 난거라니 다행히 에러처리를 진작에 해서 좀 다행이긴하다.
위 코드를 가상계좌 결제인 상태일 때도 처리하기 위해서 조금 바꿨다.
# approvedAt이 None인 경우 처리 추가
if response.get('approvedAt') is None:
current_time = datetime.now().isoformat()
request.approved_at = _convert_to_kst(current_time)
else:
request.approved_at = _convert_to_kst(response['approvedAt'])
이렇게 none일때랑 정상적으로 들어올 때 처리를 하면 해결완료!