opencloset / OpenCloset-Share-Web

OpenCloset::Share::Web
https://share.theopencloset.net
Artistic License 2.0
2 stars 2 forks source link

토스 결제시 오류 #270

Closed pingpongworks closed 3 years ago

pingpongworks commented 3 years ago

토스로 신용카드 결제를 하면, 아임포트에서는 정상적으로 결제 확인이 되는데 share에서는 결제대기 상태가 바뀌지 않아서 불편을 겪은 경우가 최근 2건 있었습니다.

orders/178279/purchase

27일 발송 건이라 일단 따로 결제를 해서 결제완료로 만들었습니다. 토스 결제와 연동이 잘 안 되는 거 같은데 확인 부탁드립니다.

근데, 제가 토스로 결제를 해보면 잘 됩니다. 문제가 뭘까요?

aanoaa commented 3 years ago
Failed to get payment info from iamport: sid(imp_726557961320), retry(1)
Not found payment: sid(imp_726557961320)
Not found payment log: payment_id(19437)

정상적인 프로세스라면 아래와 같아야 합니다.

  1. 사용자 화면에서 결제완료.
  2. 이 사용자 데이터로 iamport 에서 결제 데이터 조회 (3회까지 재시도)
  3. iamport 에서 지정된 url 로 결제 완료 통보

이 경우에는 첫번째 결제 데이터 조회에 실패한 뒤에 재시도 하려는 도중에 iamport 로 부터 결제완료 통보를 받았습니다. 결제 데이터가 조회되기 이전에 결제완료 통보를 받아서 오류로 처리되었습니다. (2번이 끝나기 전에 3번이 시작되었음)

사용자는 실제로 결제되었지만 우리 프로그램에서는 사용자에게 에러를 응답했습니다.

aanoaa commented 3 years ago

우연히도 토스 결제할때에 이러한 상황이 발생한 것이지, 결제수단의 문제는 아닌 것 같습니다.

비동기로 상황이 발생합니다. 아직 결제 확인이 되지 않았을때에 결제완료 통보가 왔을때에 에러로 처리하는 것은 정상적인 프로세스입니다. 타이밍을 조절하거나 다른 방안을 고민해봐야 합니다.

2번째 재시도 했을때에는 iamport 로 부터 결제 데이터가 조회가 되었고, 결제 완료 상태로 변경했습니다.

1초 내외의 타이밍 문제입니다.

결제 조회 상태일때 결제 완료 통보를 받았을때에 대한 예외처리를 해야 합니다.

  1. 상태를 세분화해서 결제완료 통보를 받았을때 상태 정보로 판단하고 처리를 미룬다.

  2. 재시도 wait time 을 줄인다(임시방편)

로그를 보면 16:53:08 초에 사용자가 결제 완료를 했고, 같은 시간에 iamport 에 조회를 했습니다. 또한 같은 시간에 iamport 에서 결제완료 통보를 받았습니다.

재시도를 위한 time 은 1sec 인데 이를 0.1 sec 으로 변경해보는 방법입니다.

aanoaa commented 3 years ago

로직을 변경하는 건 작업 및 테스트 볼륨이 좀 있고, 1초 wait 하고 재시도하는 것을 wait 없이 재시도 하도록 변경해보겠습니다.

물론 이렇게 변경한다고 이 문제가 해결되는 것은 아니지만 타이밍을 당기는 것 입니다. 또한 결제 완료 통보를 받았을때에 1초 wait 하고 처리하도록 변경하겠습니다.

그렇게 하면 결제 데이터 조회는 3회까지 바로 재시도하게되고, 결제 통보를 받은 이후에는 1초 wait 후에 처리하게 되어서 타이밍이 맞춰질 가능성이 높아집니다.

pingpongworks commented 3 years ago

토스 결제를 PC에서 하면 결제는 되는데, 주문서와 연동되어 결제완료로 상태 변경이 안됩니다. 모바일만 정상 결제완료가 가능합니다. PC에서도 되도록 요청드립니다.

pingpongworks commented 3 years ago

orders/181922 토스 웹 결제 오류가 계속 나타나고 있습니다. 오류 개선이 가능할지 확인 부탁드립니다. 택배대여 결제 단계에서 오류가 날 경우, 스태프가 확인하기가 어려워서 대여자가 연락을 주지 않으면 배송사고가 있을 수 있습니다. 토스 사용자가 생각보다 많아서 빠른 개선이 어려울 경우 토스는 모바일 결제만 가능합니다 안내문구를 결제 단계에 넣으면 좋겠습니다.

pingpongworks commented 3 years ago

안녕하세요, 아임포트 고객지원팀입니다.

문의하신 KG이니시스 카드결제창내의 간편결제(토스페이)로 결제한 경우 주문처리가 되지 않은 이슈건(imp_308707668208) 관련하여 확인시,

아임포트의 9월 18일 오후 15:44에 패치된 내용 중, 아래 내용에 의한 영향으로 판단되어 안내드리니 가맹점의 내부 주문처리 로직 체크를 부탁 드립니다.

pay_method 변경에 대해 가맹점의 처리 로직이 달라질 것이라고 예상하지 못해 미리 공지하지 않고 배포한 점 죄송하다는 말씀드립니다.

카카오페이, PAYCO 등 간편결제수단이 도입되면서 pay_method 상 point 라는 항목이 추가된지 오래되었는데, 아직까지 이 부분 매뉴얼에 반영해드리지 못한 점 또한 대단히 죄송하다는 말씀드립니다.

이용에 혼선드려 정말 죄송합니다. 보다 세심하게 서비스 배포관리에 신경쓰도록 하겠습니다.

= 아래 =

카카오페이, 페이코와 같이 신용카드 / 계좌이체 등 결제수단을 의도로 결제창 진입하더라도 고객의 결제단계에서 보유한 포인트 전액으로 결제처리를 하거나 발급된 쿠폰으로 전액 결제처리를 하는 경우 아임포트 데이터 내 pay_method 값을 최초 결제요청된 card 또는 trans 값으로 유지하지 않고 point 또는 coupon 으로 변경하여 저장하고 있습니다. (최초 아임포트 내 도입단계부터 적용된 정책)

즉, 결제창이 오픈되는 순간 아임포트 내 결제 레코드 생성 시에는 pay_method : card 또는 trans 로 저장된 거래건이 승인을 완료한 시점에는 point 또는 coupon 으로 변경될 수 있습니다.

다만, KG이니시스, 나이스페이먼츠, LGU+, KCP와 같은 일부 PG사에서 카카오페이, 페이코를 하나의 결제수단으로 내장하고 있기도 한데 이런 경우에 대해서는 앞서 설명드린 케이스와 같이 pay_method 를 변경하지 않고 본래의 pay_method 인 card를 그대로 유지하고 있었습니다.

이 때문에, KG이니시스 결제창 내 카카오페이 / 페이코 결제 시 전액 포인트로 지급된 경우 실제로는 카드 결제는 아닌데 pay_method = card 로 저장돼있다보니, card_number / card_code / card_type 등 카드 결제에 대한 부가정보들이 모두 null 또는 공란으로 제공되어 가맹점 결제 데이터 저장 상 정합성 오류 analytics.iamport.kr 또는 admin.iamport.kr 에서 card_number / card_code / card_type 에 대한 분류가 잘못 집계되거나 관련 정보가 표시되지 않는 문제 에 대한 클레임이 종종 있어 정합성을 맞추는 측면에서 pay_method 를 point 로 변경하는 배치를 진행하였습니다.

"열린옷장"에서 9월이후 KG이니시스로 발생한 간편결제 머니/포인트 거래현황을 파일로 첨부드리니 참고 부탁 드립니다.

추가적으로 궁금하신 사항이 있으시면 문의 주시기 바랍니다.

감사합니다.

pingpongworks commented 3 years ago

아임포트에 오류 문의하여 받은 이메일 내용입니다. 첨부된 오류케이스 명단과 함께 이메일로도 전달드렸습니다. 확인부탁드립니다.

aanoaa commented 3 years ago
  1. iamport 에 결제요청
  2. 응답을 받았는데 이때에 validation 실패

    [Fri Dec  4 14:12:31 2020] [error] Parameter validation failed: pay_method
  3. 결제완료 webhook 을 받음

2번이 실패해서 3번이 정상적으로 처리되지 못했습니다.

고객이 선택한 결제수단은 card 였는데, iamport 쪽의 패치로인해 point 또는 coupon 으로 변경되어서 응답이 왔고 실패처리 되었습니다.

이와 관련한 로직변경이 필요하다는 내용입니다.

결제 타이밍과 관련한 문제로 추측했는데, 이것과는 별개입니다. 결제수단이 변경된 상황에서도 정상으로 판단하고 처리하도록 하겠습니다.

aanoaa commented 3 years ago

수정해서 반영하였습니다. 특정상황에서만 발생하는 케이스라서 테스트 해보지 못했습니다.

토스로 결제 테스트해보시고 결과 알려주세요. @pingpongworks

pingpongworks commented 3 years ago
스크린샷 2020-12-12 오후 6 35 28

결제는 정상적으로 되는데, 결제 후에 "이 주문서의 결제는 취소할 수 없습니다" 문구가 뜹니다. 원래는 결제가 되면 결제완료취소버튼이 떴던 거 같은데 바뀐 건가요?

aanoaa commented 3 years ago

위 메세지는 현재시간이 배송날짜보다 이른지 여부와 결제수단이 존재하는지 여부로 체크합니다. 현재시간(오늘)이 배송시작일보다 이르고, 결제수단이 존재한다면 취소할 수 있습니다.

테스트 하신 주문서를 살펴보니, 열린옷장에서의 결제수단은 card 로 기록되었지만, iamport 에서는 point 결제로 되어있습니다.

그렇다고 하더라도 주문서에 결제방법이 포인트결제 로 남았어야 합니다.

이 이슈를 해결하면서, pay_method parameter 에 대한 검증을 생략했는데, 이게 문제가 됐습니다.

validation 을 누락하면 해당 값을 param method 로 부터 얻어올 수 없습니다. 제 실수입니다.

내용을 바로 잡아서 배포한뒤에 다시 테스트 요청드리겠습니다.

aanoaa commented 3 years ago

182451 주문서는 결제방법을 임의로 point 로 수정하였습니다. 취소를 할 수 있는지 취소가 되는지 확인해주세요.

aanoaa commented 3 years ago

다시 한번 테스트 하고 결과를 알려주세요. @pingpongworks

pingpongworks commented 3 years ago
스크린샷 2020-12-14 오전 7 30 12

정상적으로 결제취소가 됩니다. 토스와 국민카드 2가지로 테스트하였습니다.

pingpongworks commented 3 years ago
스크린샷 2020-12-14 오전 7 38 50

수정작업 전에 테스트결제했다가 취소한 내역 3개가 관리자목록에서 사라지지 않습니다. 삭제 부탁드립니다.

182432
182450
182451
aanoaa commented 3 years ago

대여하지 않음 으로 변경했습니다.