고객 영수증의 App Store 주문 ID를 보면 무엇을 샀는지, Apple이 이미 환불했는지 알 수 있습니다
Apple의 Look Up Order ID 엔드포인트는 고객의 App Store 영수증에 있는 주문 ID를 환불 날짜와 사유가 담긴 서명된 거래로 바꿔 줍니다. 환불 이메일에 활용하는 방법, 이 엔드포인트로 할 수 없는 일, Google Play 주문 ID와의 차이를 정리했습니다.

핵심 요약
- Apple은 고객이 인앱 구매를 할 때마다 주문 ID가 담긴 이메일 영수증을 보내며, 고객은 App Store 구매 내역에서도 주문 ID를 확인할 수 있습니다.
- Apple의 App Store Server API 엔드포인트 Look Up Order ID(GET /inApps/v1/lookup/{orderId})는 유효한 주문 ID에 대해 하나 이상의 서명된 거래를 반환하므로, 고객 지원팀은 추측하지 않고 productId와 purchaseDate를 확인할 수 있습니다.
- 디코딩한 App Store 거래에는 revocationDate와 revocationReason이 들어 있어, 주문 ID를 조회하면 Apple이 이미 해당 구매를 환불했는지 알 수 있습니다. 사유 1은 앱 내 실제 문제 또는 문제로 인식된 사항 때문에 Apple이 환불했다는 뜻입니다.
- 주문 ID가 내 앱에서 유효하지 않으면 Look Up Order ID는 OrderLookupStatus 1을 반환하고 signedTransactions 배열을 포함하지 않습니다. 이는 영수증이 잘못되었거나 다른 앱의 구매라는 신호입니다.
- Look Up Order ID는 Apple의 샌드박스 환경에서 사용할 수 없으며, 프로덕션 요청 한도는 앱당 초당 10건이고 시간 단위로 적용됩니다.
- 개발자는 App Store 환불을 직접 처리할 수 없습니다. 환불은 reportaproblem.apple.com에서 Apple이 결정하며, 개발자가 증거를 제출할 수 있는 유일한 단계는 12시간 안에 CONSUMPTION_REQUEST에 응답하는 것입니다.
- Google Play는 모든 일회성 구매와 모든 구독 갱신마다 주문 ID가 담긴 이메일을 보내며, 개발자는 Play Console에서 그 주문 ID를 검색해 직접 환불할 수 있습니다. Play Console은 환불을 취소할 수 없다고 안내합니다.
iPhone 고객의 환불 이메일에 답하기 전에, Apple 영수증에 있는 App Store 주문 ID부터 요청하세요. 그 문자열 하나를 Apple의 Look Up Order ID 엔드포인트에 넣으면 고객이 어떤 상품을 언제 샀는지, Apple이 이미 환불했는지 알 수 있습니다. 주문 ID가 없으면 스크린샷과 이메일 주소를 데이터베이스와 맞춰 보며 운에 맡길 수밖에 없습니다. 주문 ID가 있으면 상대가 결제 중인 고객인지, Apple이 이미 환불해 준 고객인지, 다른 앱의 영수증을 들고 온 사람인지 몇 초 만에 알 수 있습니다.
App Store 주문 ID는 어디에서 오나
Apple 문서는 구체적입니다. 고객이 앱에서 한 번 이상 인앱 구매를 하면 App Store가 이메일 영수증을 보내고, 그 영수증에 주문 ID가 들어 있습니다. 고객은 App Store 구매 내역에서도 주문 ID를 찾을 수 있습니다. Apple의 구매 내역 페이지는 reportaproblem.apple.com과 App Store 앱의 '앱 및 구입 내역'에 있으며, 기본으로 최근 90일이 표시되고 그 이전 구매는 필터로 볼 수 있습니다.
즉, 열쇠는 이미 고객이 쥐고 있습니다. 고객 지원 양식에서 요청하기만 하면 됩니다.
이메일 주소만으로는 부족한 이유
Apple은 고객의 Apple 계정 이메일을 개발자에게 공유하지 않습니다. 고객 지원 메일함으로 연락한 주소가 결제한 계정과 전혀 관계없을 수도 있습니다. 구매 시 appAccountToken을 설정했다면 거래를 자체 사용자 ID와 연결할 수 있지만, 그것은 개발자 쪽에서만 가능합니다. 주문 ID는 고객 쪽에서, 탭 한 번으로 전달할 수 있는 영수증에서 옵니다.
Look Up Order ID가 반환하는 것
Look Up Order ID는 App Store Server API의 일부로 버전 1.1.0부터 제공됩니다. 서명된 JWT로 GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId}를 호출합니다. Apple에 따르면 응답은 고객이 앱을 설치했는지, 삭제했는지, 다시 설치했는지와 관계없이 고객의 인앱 구매 내역을 기준으로 합니다.
| 필드 또는 동작 | Apple 문서의 설명 | 고객 지원에서 활용하는 방법 |
|---|---|---|
| OrderLookupStatus 0 | 유효한 주문 ID. 응답에 하나 이상의 서명된 거래 배열이 포함됨 | 각 거래를 디코딩해 구매 내역을 확인 |
| OrderLookupStatus 1 | 응답에 signedTransactions 배열이 포함되지 않음 | 해당 주문 ID가 내 앱에서 유효하지 않은 것으로 처리. 올바른 영수증을 요청 |
| productId 및 purchaseDate | Apple이 고객 지원에 사용할 필드로 명시 | 무엇을 언제 샀는지 확인 |
| revocationDate | App Store가 거래를 환불했거나 가족 공유에서 취소한 시각 | 값이 있으면 Apple이 이미 고객에게 환불한 것 |
| revocationReason | 0: 실수로 한 구매 등 기타 사유로 환불. 1: 앱 내 실제 문제 또는 문제로 인식된 사항 때문에 환불 | 1은 단순한 지원 티켓이 아니라 제품 신호 |
| appAccountToken | 구매 시 설정한 UUID(설정한 경우) | 주문을 자체 사용자 기록과 연결 |
| price 및 currency | Apple은 매출 대사에 사용하지 말라고 안내 | 금액은 App Store Connect 보고서를 사용 |
| 샌드박스 | 이 엔드포인트는 샌드박스 환경에서 사용할 수 없음 | 프로덕션 주문 ID로만 테스트 |
| 요청 한도 | 앱당 초당 10건, 시간 단위로 적용. 초과 시 Retry-After 헤더가 포함된 HTTP 429 반환 | 고객 지원 데스크에는 충분하지만 대량 조회에는 부적합 |
내 앱의 유효한 영수증인가?
OrderLookupStatus가 가장 먼저 답하는 질문입니다. 1은 해당 주문 ID가 내 앱의 구매와 연결되지 않았다는 뜻입니다. 흔한 경우는 오타, 다른 앱의 영수증, 아예 App Store 영수증이 아닌 경우입니다. 1이 나오면 환불도, 크레딧 지급도, 복원도 하지 마세요. 고객에게 영수증을 다시 확인해 달라고 요청하세요.
Apple이 이미 이 구매를 환불했나?
디코딩한 각 거래의 revocationDate를 확인하세요. 값이 있으면 Apple이 이미 해당 구매를 환불했거나 가족 공유에서 취소한 것이고, 고객은 돈을 돌려받았습니다. 같은 거래에 대해 App Store Server Notifications가 REFUND를 보냈어야 하므로, 서버가 실제로 접근 권한을 회수했는지 저렴하게 확인하는 방법이기도 합니다.

App Store에서 주문 ID로 할 수 없는 일
주문 ID로 환불을 처리할 수는 없습니다. 개발자에게는 App Store 환불 버튼이 없습니다. 환불은 Apple이 결정하며, Apple 지원 문서는 고객을 reportaproblem.apple.com으로 안내합니다. 고객은 그곳에서 'I'd like to'를 선택한 뒤 'Request a refund'를 고르고, 사유를 선택한 다음 해당 항목을 선택합니다. Apple은 또한 고객이 이메일 영수증을 받기 전까지는 대기 중인 청구를 환불할 수 없다고 안내합니다.
개발자가 의견을 낼 수 있는 유일한 곳은 Apple의 CONSUMPTION_REQUEST입니다. 고객이 Apple에 환불을 요청하면 Apple이 이 알림을 보낼 수 있고, 개발자는 12시간 안에 Send Consumption Information으로 응답해야 합니다. 주문 ID 조회는 고객 지원 도구일 뿐, 이 기한을 열거나 늘려 주지 않습니다.
조회를 건너뛴 환불 이메일이 치르는 비용
주문 ID를 보지 않는 고객 지원은 돈이 조용히 새는 곳입니다. 세 가지 패턴이 반복해서 나타납니다.
- 환불 위에 얹은 호의. Apple이 구매를 환불했는데 고객이 개발자에게도 연락하고, 지원팀이 무료 크레딧이나 한 달을 더 제공합니다. 제공한 크레딧은 모두 개발자가 비용을 내는 컴퓨팅, API 호출, 스토리지로 돌아가며, 그 계정은 이미 돈을 돌려받았습니다.
- 회수되지 않은 접근 권한. REFUND 처리가 실패했다면 환불받은 고객이 계속 사용량을 만들어 냅니다. 조회 결과에는 revocationDate가 있는데 데이터베이스에는 여전히 활성으로 표시된다면, 그것은 가격표가 붙은 버그 리포트입니다.
- 계정을 잘못 짚은 처리. 주문 ID는 다른 사람의 것인데 전달된 이메일 뒤의 계정을 복원하거나 크레딧을 주면, 한 번도 구매하지 않은 사람에게 유료 서비스를 주는 셈입니다.
이 중 어느 것도 분쟁이나 기한 없이도 손해를 냅니다. 사실 확인 없이 보낸 지원 답변일 뿐입니다. 티켓마다 API를 한 번 호출하면 추측이 사라집니다.
revocationReason이 1이면 제가 뭔가 잘못한 건가요?
꼭 그렇지는 않습니다. Apple에 따르면 사유 1은 앱 내 실제 문제 또는 문제로 인식된 사항 때문에 환불했다는 뜻입니다. '인식된'이라는 말이 큰 의미를 가집니다. 하지만 한 번의 출시 이후 특정 상품에서 사유 1 환불이 몰린다면, 그것은 Apple이 주는 가장 분명한 제품 피드백입니다. 세어 두세요.
Google Play 주문 ID와 비교하면
Google Play는 정반대로 작동합니다. Google 결제 문서에 따르면 사용자는 일회성 상품을 구매할 때마다, 첫 구독 구매 때, 그리고 정기 자동 갱신 때마다 고유한 주문 ID가 담긴 이메일을 받으며, 개발자는 이 주문 ID로 Play Console에서 환불을 관리할 수 있습니다. 주문 관리에서 주문 ID나 사용자의 전체 이메일 주소로 검색한 뒤 직접 환불합니다.
| 질문 | App Store 주문 ID | Google Play 주문 ID |
|---|---|---|
| 고객이 확인하는 곳 | 이메일 영수증과 App Store 구매 내역 | 구매 및 갱신마다 오는 이메일 영수증 |
| 조회 방법 | App Store Server API의 Look Up Order ID | Play Console의 주문 관리에서 검색 |
| 이걸로 환불할 수 있나 | 아니요. Apple이 결정 | 예. 전액 환불, 그리고 인앱 상품과 구독은 부분 환불 가능 |
| 환불 증거 제출 기한 | CONSUMPTION_REQUEST, 12시간, Apple이 결정 | orders.reviewrefund를 통한 지불 거절 검토, 24시간 |
| 환불을 되돌릴 수 있나 | 개발자는 불가 | 아니요. Play Console은 환불을 취소할 수 없다고 안내 |
Google Play에서는 버튼을 누르는 사람이 개발자 자신이므로 주문 ID가 더 중요합니다. Play Console에 따르면 가장 최근 구독 주문을 환불하면 구독이 즉시 삭제되고 이후 갱신이 취소되지만, 그보다 이전 주문을 환불하면 환불만 되고 구독은 계속 유지됩니다. 부분 환불은 2018년 3월 이후에 접수된 주문만 지원되며, 유료 앱은 부분 환불할 수 없습니다.
환불 지원 흐름의 맨 앞에 주문 ID를 두세요
- 고객 지원 양식에서 주문 ID를 요청하고, 'Apple 또는 Google Play 영수증 이메일에 있습니다'라는 한 줄 안내를 덧붙이세요.
- iOS에서는 Look Up Order ID를 호출해 모든 거래를 디코딩하고, productId, purchaseDate, revocationDate, revocationReason을 한 화면에서 지원팀에 보여 주세요.
- OrderLookupStatus가 1이면 멈추고 올바른 영수증을 요청하세요. 아무것도 제공하지 마세요.
- revocationDate에 값이 있으면 서버에서 접근 권한이 이미 회수되었는지 확인한 뒤 티켓을 닫으세요. 추가 호의는 없습니다.
- 값이 없고 고객이 환불을 원한다면 reportaproblem.apple.com으로 안내하고, 12시간 기한에 대비해 CONSUMPTION_REQUEST 처리기를 준비해 두세요. RefundHalt는 Apple이 요구하는 소비 데이터로 그 요청에 응답합니다.
- Android에서는 환불하기 전에 Play Console에서 정확한 주문을 찾고, 환불만 할지 환불 후 권한을 회수할지 의도적으로 선택하세요.
자주 묻는 질문
- 개발자로서 App Store 주문 ID는 어떻게 조회하나요?
- 서명된 JWT로 App Store Server API 엔드포인트 Look Up Order ID, 즉 GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId}를 호출하세요. 유효한 주문 ID라면 OrderLookupStatus 0과 하나 이상의 서명된 거래가 반환되며, 디코딩하면 productId, purchaseDate와 환불 세부 정보를 볼 수 있습니다. 이 엔드포인트는 샌드박스에서 사용할 수 없습니다.
- 고객은 App Store 주문 ID를 어디에서 찾나요?
- 인앱 구매를 할 때마다 Apple이 보내는 이메일 영수증, 그리고 reportaproblem.apple.com이나 App Store 앱의 '앱 및 구입 내역'에 있는 App Store 구매 내역에서 찾을 수 있습니다. 구매 내역은 기본으로 최근 90일이 표시되며, 그 이전 구매는 필터로 볼 수 있습니다.
- 주문 ID로 App Store 구매를 환불할 수 있나요?
- 아니요. 개발자는 App Store 환불을 처리할 수 없습니다. 고객이 reportaproblem.apple.com에서 환불을 요청하면 Apple이 결정합니다. 개발자가 할 수 있는 일은 Apple의 CONSUMPTION_REQUEST에 12시간 안에 Send Consumption Information으로 응답하는 것입니다.
- Apple이 이미 구매를 환불했는지 어떻게 알 수 있나요?
- 주문 ID를 조회하고 디코딩한 각 거래의 revocationDate를 확인하세요. 값이 있으면 Apple이 해당 구매를 환불했거나 가족 공유에서 취소한 것입니다. revocationReason 0은 실수로 한 구매 등 기타 사유, 1은 앱 내 실제 문제 또는 문제로 인식된 사항을 뜻합니다.
- OrderLookupStatus 1은 무슨 뜻인가요?
- 해당 주문 ID가 내 앱에서 유효하지 않으며 응답에 signedTransactions 배열이 없다는 뜻입니다. 보통 고객이 다른 앱의 영수증을 보냈거나, ID를 잘못 입력했거나, App Store가 아닌 영수증을 보낸 경우입니다. 무엇이든 제공하기 전에 올바른 영수증을 요청하세요.
출처 및 추가 자료
- Apple Developer Documentation: Look Up Order ID
- Apple Developer Documentation: orderId
- Apple Developer Documentation: revocationReason
- Apple Developer Documentation: Identifying rate limits
- Apple Support: See your purchase history for the App Store, iTunes Store, and more
- Apple Support: Request a refund for apps or content that you bought from Apple
- Play Console Help: Refund orders and subscriptions
- Android Developers: Integrate the Google Play Billing Library into your app
RefundHalt
App Store와 Google Play 환불 자동 처리
계속 읽기
iOS 웹 결제 환불은 이제 Apple이 아니라 당신이 처리합니다. 은행 분쟁도 마찬가지입니다
미국 iPhone 앱은 이제 구매자를 웹 결제로 연결할 수 있습니다. Apple은 이런 판매의 환불을 도울 수 없다고 밝혔고, 그래서 환불 창구와 지불 거절, $15 분쟁 수수료가 개발자에게 넘어옵니다. 무엇이 바뀌는지, 비용이 얼마인지, 분쟁을 어떻게 줄이는지 정리했습니다.
유료 앱 환불은 서버에 절대 도달하지 않습니다. 그래서 앱이 직접 알아채야 합니다
선결제 유료 앱의 환불은 서버가 수신하는 모든 알림을 건너뜁니다. Google은 구매자에게 2시간의 반품 기간을 주고 앱을 제거하며, Apple은 계약에 따라 90일 이내에 환불할 수 있고, 둘 다 증거를 요구하지 않습니다. 각 스토어가 무엇을 알려 주는지, 비용이 얼마나 드는지, 앱 안에서 어떻게 확인하는지 정리했습니다.