결제 요청시 중복으로 응답됨
안녕하세요.
결제 성공 시 성공 콜백이 두 번 옵니다.
로컬, 개발서버에선 콜백이 정상적으로 한번 호출되는데,
클라우드 실 서버에선 두 번 호출됩니다.
어떤 부분을 확인해 봐야 하는지 알고 싶습니다.
36 Replies
두번 호출된 주문번호 전달해주세요.
202309190004628 입니다.
위 주문번호가 2번 호출된건가요? 실 서버라고 하셨는데, 실서버에서 저희쪽 테스트키로 결제 테스트 하신것도 맞으실까요?
ngrok으로 여러건 주소를 등록하시건으로 보여요
다른 주소로 결과들이 발송되었습니다.
ngrok으로 여러건 주소등록을 했던 것은 다 local 이고 실서버주소는 하나만 셋팅이 되어있습니다.
보내주신 주문번호가 라이브 mid에서 진행하신 건가요?
아니요 테스트입니다
라이브로 하기전에 실서버에서 테스트키로 선작업 중이였습니다.
네, 해당 테스트키로 다수의 웹훅 URL이 등록되어 있다고 말씀드린거네요. 한번 개발자센터 들어가보셔서 확인해보시겠어요?
다수의 웹훅 URL이 등록되어 있는 것은 맞는데
해당 실서버 returnUrl 주소는 하나만 등록되어 있는데도 연관이 있는걸까요?
웹훅 응답이 아닌 결제요청 응답이 두 번 중복되어 옵니다.
웹훅 응답이 아니라 API 응답이시라는거죠?
잠시만요
/v1/payments/confirm 을 2번 호출했습니다.
17:32:54.366
17:32:54.765
동일 paymentKey 로 중복요청이 들어오고 있는것으로 보이네요. 이 부분을 확인해보셔야 할 것 같아요.
그래서 첫번째 요청은 성공, 두번째 요청은 이미 처리된 결제 응답이 나갔습니다.
결제요청의 successUrl 내에서 /v1/payments/confirm를 호출하도록 되어있는데, successUrl 이 두번 호출되어 중복요청이 발생되고있습닏.
단순 새로고침이나 뒤로가기 등으로 successUrl 이 2번 호출되는 경우가 많아서요. 이 경우도 한번 염두에 두고 한번 다시 진행 해보시겠어요?
단순 새로고침이나 뒤로가기는 없었고
결제요청뿐만 아니라 결제취소 등 콜백url이 모두 2번 호출되고있습니다..
경험하신 케이스는 실제로 두번 호출하셨을 확률이 높습니다.
결제승인요청하는 소스에 라인별로 로그를 찍어서 분석하시면 도움이 되실거에요
말씀하신 결제승인요청이 /v1/payments/confirm 으로 보내는 프로세스 말씀하시는 걸까요?
네 모든 API 호출이 2번씩 되고 있다면 코드가 중복 수행되는 형태는 아닌지 확인부탁드립니다.
로컬, 개발서버에선 콜백이 정상적으로 한 번 호출되는데 N클라우드에서 진행하였을 땐 위와 같은 문제가 발생됩니다.
코드 중복 수행은 아닌 것 같습니다.
그럼 N 클라우드 쪽 설정 등을 확인해 보시기 바랍니다(N클라우드 관련 내용을 알지 못해서 어디를 봐야 할지 가이드 드리지 못하는점 양해 부탁드립니다)
저희가 특정 환경에서 오는 요청을 중복으로 처리하거나 하지는 않습니다.
그러면 결제 요청이 두 번 된 건지 확인이 가능할까요?
주문번호: 202309200005010 입니다
승인 API 이신건가요?
승인 API 기준으로 10시 20분 22.348, 10시 20분 22.656 으로
0.3초 간격으로 요청이 두번 왔습니다.
/v1/payments/confirm이 아닌
결제위젯(javascript)으로 결제완료 시 보낸 요청입니다.
결제창은 1번 생성되었어요
문의 내용을 이렇게 생각하면 될까요?
간략하게는 이렇게 결제가 진행되는데요
1. 결제위젯에서는 결제창 생성을 하고
2. 결제창에서 인증을 마치고
3. 전달된 paymentKey 로 승인요청
여기에서 1. 결제창생성 이 두번 되었는지? 를 물어보신것으로 이해했어요
2번이요
결제창 생성이 한번되었고 인증결과도 한번 드렸어요
두번 받으신 로그가 있으신가요? get method 로 들어오는 input 를 찍으시면 보이실거에요
2023-09-20 10:20:22.047 INFO 2867418 --- [0.0-8009-exec-8] c.h.s.i.HttpInterceptor : 요청 URL : https://regs.gijangcmc.or.kr/gijang/rsv/returnSuc
response :{"mId":"tvivarepublica","lastTransactionKey":"42967DBF7BF7B121948A88CF5C859C21","paymentKey":"k0A2Ga1QqXjExPeJWYVQpyA0n7AB9g349R5gvNLdzZwO6oKl","orderId":"202309200005010","orderName":"자유수영_테스트-1","taxExemptionAmount":0,"status":"DONE","requestedAt":"2023-09-20T10:19:39+09:00","approvedAt":"2023-09-20T10:20:22+09:00","useEscrow":false,"cultureExpense":false,"card":{"issuerCode":"71","acquirerCode":"71","number":"48897200**691*","installmentPlanMonths":0,"isInterestFree":false,"interestPayer":null,"approveNo":"00000000","useCardPoint":false,"cardType":"신용","ownerType":"개인","acquireStatus":"READY","amount":50000},"virtualAccount":null,"transfer":null,"mobilePhone":null,"giftCertificate":null,"cashReceipt":null,"cashReceipts":null,"discount":null,"cancels":null,"secret":"ps_kYG57Eba3Gpv7qdNkOkQVpWDOxmA","type":"NORMAL","easyPay":null,"country":"KR","failure":null,"isPartialCancelable":true,"receipt":{"url":"https://dashboard.tosspayments.com/receipt/redirection?transactionId=tviva20230920102022h6ap9&ref=PX"},"checkout":{"url":"https://api.tosspayments.com/v1/payments/k0A2Ga1QqXjExPeJWYVQpyA0n7AB9g349R5gvNLdzZwO6oKl/checkout"},"currency":"KRW","totalAmount":50000,"balanceAmount":50000,"suppliedAmount":45455,"vat":4545,"taxFreeAmount":0,"method":"카드","version":"2022-11-16"}
2023-09-20 10:20:22.452 INFO 2867418 --- [.0-8009-exec-11] c.h.s.i.HttpInterceptor : [preHandle]
2023-09-20 10:20:22.452 INFO 2867418 --- [.0-8009-exec-11] c.h.s.i.HttpInterceptor : 요청 URL : https://regs.gijangcmc.or.kr/gijang/rsv/returnSuc
response :{"code":"ALREADY_PROCESSED_PAYMENT","message":"이미 처리된 결제 입니다."}
첫번째 요청에서 승인결과를
{"mId":"tvivarepublica","lastTransactionKey":"42967DBF7BF7B121948A88CF5C859C21","paymentKey":"k0A2Ga1QqXjExPeJWYVQpyA0n7AB9g349R5gvNLdzZwO6o(이하생략)
이렇게 받으셨구요
동일한 요청을 한번 더 보내셔서
response :{"code":"ALREADY_PROCESSED_PAYMENT","message":"이미 처리된 결제 입니다."}
이렇게 받으셨어요
confirm 을 두번 호출하면 이렇게 나오거든요returnSuc호출 시 confirm을 호출하게 되어있거든요
근데 returnSuc가 왜 두 번 호출 되었는지 의문입니다.
넵
보통은 refresh 등으로 2번 호출이 되는 경우가 가장 많긴 합니다.
모든 결제가 다 저렇게 2번씩 호출이 되시는 건가요?
네 결제 및 취소 2번씩 호출됩니다.
returnSrc 로 paymentKey, amount, orderId 가 들어온 후 confirm 을 어떻게 처리하시는지 소스코드를 전달주실 수 있으실까요?
techsupport@tosspayments.com 으로 보내주시면 됩니다.
내부적으로 확인해보고 다시 말씀드리겠습니다.
감사합니다 🙂
넵, 원인파악이나 내용 업데이트 되셨을때
다시 들려주시면 감사하겠습니다. 🙏
❤️ 기술문의 경험이 어떠셨나요?!
간단히 코멘트 남겨주세요! 제품 발전에 큰 힘이 됩니다.