결제 응답 값 문의 드립니다

결제 진행 중 processProductGrant 로직이 실행될 때,
아래 케이스에 따라 /api-partner/v1/apps-in-toss/order/get-order-status (주문 조회하기 API) 의 status 값이 어떻게 오는지 궁금합니다.

  1. return true; 한 이후 주문조회하기 API status 값?
  2. return false; 한 이후 주문조회하기 API status 값?
  3. 아직 return 하지 않은 상태에서 주문조회하기 API status 값?
  4. 아직 return 하지 않은 상태에서 타임아웃이 지난 이후 주문조회하기 API status 값?

관련하여 아래 글에서 문의를 했는데,

문의 내용도 점점 복잡해지고 답변이 오랫동안 없는 관계로

다시 정리하여 질문 드립니다.

@kimybzz 님 안녕하세요

답변이 늦어 죄송합니다.

지급 로직이 true 일 경우 PAYMENT_COMPLETED 상태값이 return 됩니다.

false 일 경우, 아직 return 하지 않은 상태, 타임아웃 등 모두 지급 로직이 실패하여 FAILED 로 return 됩니다.

return true 외에는 모두 FAILED 로 return된다고 하셨는데요.

가이드에 있는 에러코드는 아래와 같은데, 여기에는 FAILED 라는 항목이 없습니다.

헛 API를 문의주셔서 상태 조회 API 응답값을 말씀드렸어요

상품 지급 로직에 실패할 경우에는 PRODUCT_NOT_GRANTED_BY_PARTNER 코드가 리턴됩니다.

아아.. “가이드에 있는 에러코드는 아래와 같은데, 여기에는 FAILED 라는 항목이 없습니다.” 질문은 무시해주세요 잠시 착각했습니다!!

그렇다면 추가 질문이 있습니다.

  1. 위와 같은 방식으로 FAILED가 발생하면, 토스 내부적으로 그 타이밍에 미결주문으로 처리되어 getPendingOrders에 등록이 되는 방식인가요?
  2. 상태조회에서 ORDER_IN_PROGRESS 응답이 오려면 어떤 케이스가 발생해야 하는 걸까요?

제가 계속 질문을 드리는 이유는… QR 결제테스트 도중에 processProductGrant 에서 return false; 를 하였고,
이후 getPendingOrders에 해당 주문이 등록된 것을 확인하였으나
상태조회 API를 사용하면 status 응답이 PAYMENT_COMPLETED로 오고 있어서 그렇습니다.

getPendingOrders 에 있는 주문이거나 processProductGrant 상태가 되면
서버에서 결제상품을 유저에게 지급해야 하는데,
이 때 항상 상태조회 API로 확인 후에 지급을 하려고 하거든요.
이 과정이 없으면 누군가 임의로 orderID를 아무거나 생성하여 서버에 요청하면 서버는 지급할수 밖에 없으니까요
그런데 상태조회에서 어떤 status가 왔을 때 지급해야 하는지 굉장히 혼동되는 상황입니다.

제가 올린 다른 문의 글에서는 비슷한 상황에 ORDER_IN_PROGRESS가 온다고 답변이 있어 더더욱 혼란스럽습니다.

@kimybzz 님 안녕하세요

혹시 테스트하신 orderId 전달 가능하실까요?

본문에 적어둔 이전문의에 올렸던 내용입니다.
orderid : f0a65e00-98cd-4e5d-91a4-824dec3ff94d

헉 확인해보겠습니다

@kimybzz 님 기다려주셔서 감사합니다.

확인해보니 아래와 같습니다.

  • PAYMENT_COMPLETED : 결제는 완료되었으나 상품 지급이 되지 않은 경우
  • PURCHASED : 결제 및 상품 지급이 모두 완료된 경우

가이드에도 수정해둘게요. 서비스에 불편함을 드려 죄송합니다.

1개의 좋아요

넵 감사합니다.

그런데 문제가 있었던 orderID 상품에 대해 환불을 하려고 하는데요.
토스 앱에서 환불하기 메뉴를 들어가봐도 아무것도 나오지 않고
콘솔에서도 결제 내역 / 정산 내역 / 환불 내역 에 아무것도 안나오는데요.
아직 해당 상품이 getPendingOrders에 남아있는데 지급처리가 아직 되지 않아서 그런걸까요?

안드로이드에서 환불 받기 누르면 환불 신청이 안되실까요?

아 iOS 기기에서 했습니다.
가이드를 보니 토스 앱에서는 불가능하고 앱스토어에서 직접 해야되나보군요!

음 하나 궁금한게 더 생겼는데요.
만약에 getPendingOrders 항목에 있는 상품에 대해 유저가 스토어에서 환불을 받게 되면
이후 getPendingOrders 조회시에 해당 항목이 자동으로 사라지게 될까요?

넵 맞습니다.

getPendingOrders 는 결제는 완료되었으나 상품 지급이 안된 주문건만 내려가서 환불된 주문 건은 내려가지 않습니다

처음에 내려가더라도 추후 환불이 되었을 경우 나중에 조회하면 환불된 주문건은 내려가지 않아요

1개의 좋아요

감사합니다… 자꾸 질문드려서 죄송합니다만 또 이슈가 생겼는데요 (이번에는 기술적인 이슈입니다)

유니티 게임의 경우에는 대부분의 로직을 유니티 단계에서 구현하고
토스 API를 호출해야 되는 시점에서만 Vite프로젝트 내의 tsx파일에서 구현을 할텐데요.

processProductGrant 상황에서 클라이언트가 서버에게 “주문조회 해보고 유저에게 지급해줘!” 라는 명령어를 내릴 때
유니티 단에서 구현한 통신으로 서버에 전송을 하게 됩니다. (저희는 UnityWebRequest를 사용)
이 때, 서버에서 지급이 완료되었다는 응답도 마찬가지로 유니티에서 구현한 통신으로 reponse를 받아야 하는데
토스 결제창이 떠 있는 상황에서는 유니티가 background 상태로 전환되어 있기 때문에 응답을 받지 못합니다.
결국 서버에서는 지급을 하였지만 클라이언트가 응답을 받지 못해 processProductGrant 에서 타임아웃이 발생합니다.

이걸 해결하기 위해서는 결제 시에 서버와의 통신을 유니티가 아닌 vite 프로젝트에서 구현을 할 수 밖에 없는 상황인데요.
좀 난감합니다.
해당 내용에 대해 내부적으로 유니티를 테스트 하실 때 이슈가 되었을 것 같은데, 논의 된 내용이 없으셨을까요?
관련해서 어떻게 해결했는지 도움을 받고 싶습니다.

————————————————————————————————————————-

꼼수로 일단 processProductGrant 에서 return false; 를 해버리고
바로 completeProductGrant로 지급하는 방식으로 우회해 보았습니다만,
processProductGrant 에서 return false를 하는 순간, 결제창에서 환불에 대한 화면으로 전환이 되더군요 ㅠㅠ
그래서 이 꼼수도 사용을 못할 것 같습니다.

안녕하세요 :slight_smile:
서버와의 통신을 js쪽으로 넘겨서 진행해주실 수 있을까요 ?
JS가 서버에 processProductGrant 요청 → 지급 완료 신호는 JS에서 먼저 수신/버퍼링 → 결제창 닫힘/포커스 복귀 시 Unity에 결과 전달

이런 플로우로 처리가 가능할지요 ?! :man_bowing:

음… 넵 아무래도 다른방법이 없는 것 같아서
c#으로 작성한 게임서버 통신 로직을 JS로 옮기고 있습니다.

감사합니다.

해당 부분은 다른 방식으로 변경 예정이 없는거죠?

빠른 시일내로 유니티 SDK 가 제공될 예정입니다 :slight_smile:
별도로 js 브릿지를 구현하지 않으셔도 c# 코드 호출로 동작하게 될 예정입니다.
조금만 기다려주시면 감사하겠습니다 :man_bowing: