다음을 통해 공유


서비스에서 환불 및 지불 거절 관리

Clawback 서비스를 사용하면 파트너 서비스에서 소모성 제품 및 매장 관리 구독에 대한 환불, 반품 및 환불 이벤트를 알 수 있습니다.
이를 통해 파트너 서비스는 사기성 거래 및 환불 요청으로 인한 수익 손실을 방지하고 완화하는 데 도움이 되는 논리를 구현할 수 있습니다.

다음 정보는 모든 서비스에 권장되는 방법인 Clawback 이벤트 서비스의 최신 버전을 기반으로 합니다.

환불된 소모품 및 매장 관리 구독의 위험 및 사기 가능성

Microsoft Store를 통해 사용자는 계정의 주문 페이지(https://account.microsoft.com/billing/orders/)에서 디지털 구매 콘텐츠의 환불 또는 반환을 요청할 수 있습니다. 자동화 시스템은 사용자가 반품 요청 후 짧은 시간 내에 구입하는 등 일정 기준이 충족되면 연간 특정 일수에 대해 자동 반품을 받을 수 있는 기능을 제공합니다. 그렇지 않으면 Microsoft의 고객 지원팀이 디지털 아이템의 환불 또는 반품을 특정 경우에만 발행할 것입니다.

소모품이 아직 충족되지 않았거나 수량이 소비된 경우, 반품된 구매의 수량이 사용자의 잔액에서 자동으로 제거됩니다. 그러나 반품 전에 아이템이 처리되었거나 사용된 경우 사용자의 잔액은 0 이하로 떨어지지 않습니다. 이 경우 게임 서비스에서 아이템 을(를) 소비할 때 게임 내 통화 크레딧을 가진 경우 그들은 자신의 돈을 돌려받게 됩니다. 이로 인해 구매, 게임 내 사용, 환불과 관련된 남용 및 사기가 발생할 수 있습니다.

마찬가지로, 매장 관리 구독에는 전액 또는 부분 환불이 필요한 다양한 지역 법률이 적용됩니다.
환불 유형에 따라 게임 개발자나 퍼블리셔가 다른 해지 작업을 원할 수 있습니다.

따라서 파트너는 Clawback 이벤트 서비스를 사용하여 이러한 시나리오를 검색하고, 소모성 제품 및 매장 관리 구독에 대한 수익원을 관리하고 보호하는 것이 좋습니다.

Microsoft.StoreServices .NET 라이브러리 및 샘플 활용

이 문서에 설명된 원칙과 흐름을 보여 주기 위해 다음을 제공하는 Microsoft.StoreServices 샘플을 검토합니다.

  • Microsoft.StoreServices 라이브러리를 사용한 인증 관리 및 Microsoft Store Services 호출.

  • 소모성 제품 관리, 보류 중인 소비 요청 추적, 환불된 구매 조정, 만료된 사용자 저장소 ID 갱신 등에 대한 예제 논리.

  • 이 인증 방법에 대한 Microsoft Entra ID를 구성하고 설정하는 방법에 대한 이 문서의 단계를 포함하는 구성 가이드.

  • Microsoft.StoreServices(GitHub)

  • Microsoft.StoreServices 샘플(GitHub)

Clawback 이벤트 큐

Clawback 이벤트 서비스는 서비스의 Entra 애플리케이션 클라이언트 ID에 대해 구성된 Azure Storage 큐 에 이벤트 메시지를 쓰는 것을 기반으로 합니다.
이벤트는 환불, 반품 또는 지불 거절이 Microsoft Store 서비스를 통해 처리될 때 거의 즉시 큐에 기록됩니다.
따라서 서비스에서 전체 제품 카탈로그에서 최근 Clawback 이벤트를 주기적으로 쿼리하고 시스템 내에서 조정할 수 있습니다.

현재 다음 제품 유형은 Clawback 이벤트 서비스 큐에서 지원됩니다.

제품 종류 ProductKind 값
매장 관리 소모품 Consumable
개발자 관리 소모품 UnmanagedConsumable
매장 관리 구독 Pass

필수 온보딩 및 설정

Clawback 이벤트 큐에 온보딩하려면 Microsoft Store 서비스 팀에서 Azure Storage 큐를 구성해야 합니다. 큐의 호스팅 비용 및 관리는 Microsoft에서 처리합니다.

Clawback 이벤트 큐를 설정하려면 개발자 파트너 관리자 또는 Microsoft 연락처에 문의하세요. 큐의 설정을 요청할 때 다음을 제공해야 합니다.

  • 서비스가 인증하는 데 사용할 Entra 애플리케이션 클라이언트 ID이며, 파트너 센터에서 제품이 연결되어 있는지 확인합니다.
  • 기본 큐의 기본 지리적 Azure 데이터 센터입니다. 전 세계적으로 큐에 액세스할 수 있기 때문에 필요하지는 않지만 사용자 고유의 서비스에 가까울수록 대기 시간이 더 짧아집니다.

제출되면 큐 설정을 배포하는 데 1~2주가 걸릴 수 있습니다.

Clawback 이벤트 큐에 액세스

Clawback 이벤트 큐에 액세스하기 위해 서비스는 서비스의 Entra ID 자격 증명에서 생성된 서비스 액세스 토큰을 사용하여 purchase.mp.microsoft.com/v8.0/b2b/clawback/sastokenSAS 토큰을 가져옵니다. SAS 토큰의 수명은 제한되어 있지만 서비스는 언제든지 새 SAS 토큰을 요청할 수 있습니다.

SAS 토큰의 반환 uri 된 매개 변수는 Clawback 큐에 대한 URI 주소와 인증에 필요한 매개 변수를 나타냅니다. 그러나 큐에서 쿼리하고 작동하려면 URI를 수행하려는 작업에 따라 아래에 설명된 추가 아이템이 필요합니다.

큐에서 Clawback 메시지 처리

SAS 토큰의 수정된 uri 매개 변수를 사용하여 서비스는 다음 중 하나를 사용하여 Clawback 큐와 상호 작용할 수 있습니다.

Clawback 큐의 각 항목은 해당 메시지의 일부로 제공되는 Clawback 이벤트의 세부 정보가 포함된 메시지로 작성됩니다.
큐의 메시지를 관리하기 위해 서비스는 URI에 다음 매개 변수를 추가하여 이러한 작업을 수행할 수 있습니다.

작업 URI 추가 추가 매개 변수 설명
보기 /messages peekonly=true 큐의 이전의 하나 이상의 메시지를 검색하지만 메시지의 표시 유형을 변경하지는 않습니다.
Microsoft Store에서 /messages none 큐 앞부분에서 하나 이상의 메시지를 검색하고 표시 시간 제한(기본값은 30초)을 설정하므로 시간 제한 이후까지 다시 반환되지 않습니다.
삭제 /messages/(큐의 메시지 ID) popreceipt=(큐 메시지의 값) 큐에서 대상 메시지를 영구적으로 제거합니다.
작업 예제 URI
보기 https://uluufeofsxh2k.queue.core.windows.net/gxhxcvb32lnk4**/messages**?sv=2021-10-04&spr=https&st=2023-01-20T22%3A59%3A25Z&se=2023-01-21T04%3A59%3A25Z&sp=rp&sig=zJ4n%2BJdcv0nVNSh5vEwICguV54tqZ62jJwD7Omr87WE%3D**&peekonly=true**
Microsoft Store에서 https://uluufeofsxh2k.queue.core.windows.net/gxhxcvb32lnk4**/messages**?sv=2021-10-04&spr=https&st=2023-01-20T22%3A59%3A25Z&se=2023-01-21T04%3A59%3A25Z&sp=rp&sig=zJ4n%2BJdcv0nVNSh5vEwICguV54tqZ62jJwD7Omr87WE%3D
삭제 https://uluufeofsxh2k.queue.core.windows.net/gxhxcvb32lnk4**/messages/7df1da25-2c9b-4a09-9913-2e4f843ca439**?sv=2021-10-04&spr=https&st=2023-01-20T22%3A59%3A25Z&se=2023-01-21T04%3A59%3A25Z&sp=rp&sig=zJ4n%2BJdcv0nVNSh5vEwICguV54tqZ62jJwD7Omr87WE%3D**&popreceipt=AgAAAAMAAAAAAAAAP%2B4YHSMt2QE%3D**

Get 작업을 통해 큐에서 메시지를 검색하는 경우 반환된 메시지에 표시 시간 제한(기본값 30초)이 배치됩니다. 이렇게 하면 표시 시간 제한 이후까지 후속 Get 작업에서 처리되는 메시지가 표시되지 않습니다. 반면에 Peek 작업은 표시 시간 제한을 설정하지 않으며 모든 후속 Peek 또는 Get 요청에 메시지가 표시됩니다. 그러나 큐에서 메시지를 삭제하려면 Get 작업을 사용하여 메시지에만 반환되는 popreceipt 값이 필요합니다.

메시지 처리를 위한 권장되는 흐름은 다음과 같습니다.

  1. 큐에서 메시지(또는 메시지 집합)를 가져옵니다.
  2. 각 메시지에서 Clawback 이벤트 정보를 추출합니다.
  3. 완료된 트랜잭션 데이터베이스에서 ProductId, OrderId 및 LineItemOrderId와 동일한 ProductBack 이벤트와 일치하는 트랜잭션이 있는지 확인합니다.
  4. 완료된 트랜잭션에서 시스템의 사용자에게 부여된 항목을 조정합니다.
  5. 자체 데이터베이스의 트랜잭션을 조정된 대로 설정합니다.
  6. 메시지 큐에서 메시지를 삭제합니다.

Get 또는 Peek 함수의 응답은 다음 형식의 QueueMessage 항목의 XML 목록이 됩니다.

<QueueMessagesList>  
    <QueueMessage>  
      <MessageId>string-message-id</MessageId>  
      <InsertionTime>insertion-time</InsertionTime>  
      <ExpirationTime>expiration-time</ExpirationTime>  
      <PopReceipt>opaque-string-receipt-data</PopReceipt>  
      <TimeNextVisible>time-next-visible</TimeNextVisible>  
      <DequeueCount>integer</DequeueCount>  
      <MessageText>message-body</MessageText>  
    </QueueMessage>  
</QueueMessagesList>  

QueueMessage 구조

매개 변수 형식 설명 필수
MessageId GUID 큐의 메시지에 대한 고유 ID입니다.
InsertionTime datetime 메시지가 큐에 삽입된 UTC 날짜 및 시간입니다.
ExpirationTime datetime 메시지가 큐에서 자동으로 제거되는 UTC 날짜 및 시간입니다.
PopReceipt string 삭제 작업에서 큐에서 메시지를 제거하는 데 사용됩니다. 아니요
TimeNextVisible datetime 메시지가 큐에 다시 표시될 UTC 날짜 및 시간입니다.
DequeueCount int 메시지가 큐에서 제거된 횟수입니다(Get API를 사용하여 큐에서 제거).
MessageText string Clawback 이벤트의 JSON 구조인 Base64로 인코딩된 문자열

Clawback 이벤트 구조

큐의 각 메시지에는 다음 매개 변수를 사용하여 Clawback 이벤트를 나타내는 인코딩된 JSON 문자열이 MessageText에 있습니다.

매개 변수 형식 설명 필수
id GUID Clawback 이벤트의 고유 ID입니다.
source string 이벤트를 트리거한 원본 서비스입니다.
type string 데이터 필드의 개체 형식입니다. 이는 ClawbackEventContractV2여야 합니다.
data ClawbackEventContractV2 Clawback 이벤트의 영향을 받는 Order와 관련된 데이터가 들어 있는 ClawbackEventContractV2 개체입니다.
time datetime 이벤트를 만든 UTC 날짜 및 시간입니다.
specversion string 계약의 버전입니다. 1.0이어야 합니다.
datacontenttype string 데이터 매개 변수의 형식입니다. 애플리케이션/json이어야 합니다.
subject string 로깅을 위한 Clawback 서비스에서 사용하는 추가 정보입니다.
traceparent string 로깅을 위한 Clawback 서비스에서 사용하는 추가 정보입니다.

Clawback 이벤트 원본 값

설명
/Purchase/Refund 이벤트는 Microsoft 고객 지원 또는 Xbox 지원 반환 요청 사이트를 통해 처리되는 반품 또는 환불에서 비롯되었습니다.
/Purchase/Chargeback 이벤트는 주문에서 지불 기관의 지불 거절 또는 지불 거절 취소에서 비롯되었습니다. 은행, 신용 카드 등이 될 수 있습니다.

ClawbackEventContractV2 구조

매개 변수 형식 설명 필수
lineItemId GUID 소모품에 대한 구매 주문 내 lineItem을 식별합니다(주문은 카트 시나리오에 대해 여러 lineItemId를 가질 수 있음).
orderId GUID 사용자가 구매할 때 제품이 포함된 구매 주문을 식별합니다.
productId string Microsoft Store 카탈로그내의 제품에 대한 Microsoft Store ID입니다. 제품에 대한 Microsoft Store ID의 예는 9NBLGGH42CFD입니다.
productType string 제품 유형을 나타냅니다. 보다 상세한 안내는 제품 유형 값 및 의미를 참조합니다.
purchasedDate datetime 제품이 구매된 UTC 날짜 및 시간입니다.
eventDate datetime 아이템이 환불된 UTC 날짜 및 시간입니다.
sandboxId string 제품 구매가 연결된 샌드박스입니다. 최종 사용자가 있는 프로덕션 환경은 'RETAIL'입니다.
eventState string 이 특정 Clawback 이벤트의 상태입니다. Clawback 이벤트 상태를 참조하세요.
skuId string Microsoft Store 카탈로그에 다중 제공 제품이 있는 경우 특정 SKU 식별자 SKU에 대한 Microsoft Store ID의 예는 0010입니다.
subscriptionData ClawbackEventSubscriptionData 구독 제품에 대한 주문인 경우 반환되는 ClawbackEventSubscriptionData 개체입니다. 여기에는 Clawback 이벤트의 영향을 받는 구독 순서와 관련된 데이터가 포함됩니다. 아니요

Clawback 이벤트 상태

설명
Revoked 사용자가 환불을 받았으며 사용자의 자격을 해지하려고 했지만 성공하지 못했습니다. 소모품의 경우 이는 주문이 반품되기 전에 서비스에서 항목이 처리되었음을 나타냅니다. 사용자 고유의 레코드 및 데이터의 조정이 필요합니다. 소모성 클로백 이벤트 조정을 참조하세요.
Returned 사용자가 환불을 받았으며 해당 자격은 계정에서 제거되었습니다. 서비스에 대한 조정이 필요하지 않습니다. 소모품의 경우 구매한 항목이 서비스에서 아직 이행되지 않은 상태입니다.
Refunded 사용자가 환불을 받았지만 제품에 대한 자격을 유지할 수 있었습니다. 서비스에 대한 조정은 필요하지 않지만 이 사용자 계정을 추적해야 하며 이러한 유형의 빈번한 이벤트는 사기 행위를 나타낼 수 있습니다.
ChargebackReversal 원래 이 아이템은 결제 방법(신용 카드, 은행 등)에서 시작된 지불 거절로 인해 철회되거나 반환된 것으로 보고되었습니다. Microsoft는 지불 거절에 이의를 제기했고, 이 이의 제기는 받아들여졌습니다. 이 아이템의 비용이 Microsoft로 복원되었고 아이템의 상태가 사용자의 계정으로 복원되었습니다. 차지백에 대한 자세한 내용은 차지백 및 차지백 취소를 참조하세요. 또한 개발 관리형 소모성 제품과 스토어 관리 소모품의 특정 동작에 대해서는 차지백 취소 동안 개발 관리 소모품의 고유한 동작을 참조하세요.

ClawbackEventSubscriptionData 구조

매개 변수 형식 설명 필수
recurrenceId string 사용자의 구독 기간에 대한 고유 ID이며 구독 관리 API와 함께 사용할 수 있습니다.
durationIntervalStart datetime 구독의 간격이 구매 주문에 연결된 UTC 날짜 및 시간입니다.
durationInDays int 주문서의 구독 간격에 대한 구매 일 수입니다.
consumedDurationInDays int 이미 사용한, 사용자에게 환불/반품되지 않은 일 수입니다.

Clawback 이벤트 예제

{
  "id": "5ef37bd1-8b4b-48c4-9b67-be458d8ab9de",
  "source": "/Purchase/Refund",
  "type": "ClawbackEventContractV2",
  "data": {
    "lineItemId": "230e9063-bffe-411a-8aa1-6f99ca091452",
    "orderId": "70fd35f2-7e4a-4f27-8df3-a673a5a4d9d9",
    "productId": "9N0297GK108W",
    "productType": "UnmanagedConsumable",
    "purchasedDate": "2023-01-24T21:59:19.5725585+00:00",
    "eventDate": "2023-01-26T08:18:52.246847+00:00",
    "eventState": "Revoked",
    "sandboxId": "XDKS.1",
    "skuId": "0010"
  },
  "time": "2023-01-26T08:18:56.7103057+00:00",
  "specversion": "1.0",
  "datacontenttype": "application/json",
  "subject": "/Purchase/Refund/907eb4af-57bf-4ff6-b040-e9296d169436",
  "traceparent": "00-6d2a86a53e8cae15cddaadc43f4d9670-4821cba073c416c1-00"
}

환불 및 반품

이벤트를 /Purchase/Refund 소스에서 가져온 경우 이는 이벤트가 고객 refund 또는 return 요청에 연결되었음을 나타냅니다. 이러한 두 용어는 동의어로 사용되는 경우가 있지만 Microsoft Store 서비스의 컨텍스트에서는 각각 서비스에서 처리해야 하는 고유한 동작을 갖습니다.

두 경우 모두 사용자는 주문서의 비용을 환불받지만 구매에서 부여된 자격 또는 수량에 따라 다릅니다.
반품 작업은 사용자의 계정에서 자격 또는 수량을 제거하려고 시도합니다. 그러나 환불하면 사용자의 계정이 구매의 자격 또는 수량을 유지하게 됩니다.

Microsoft 고객 지원 또는 자동화된 도구를 통한 요청은 일반적으로 반품 요청으로 처리됩니다.
그러나 드문 경우지만 고객 문제와 관련된 상황에 따라 '좋은' 제스처로 이벤트 상태는 긍정적인 고객 서비스를 제공하기 위한 노력일 Refund 수 있습니다. 청구 처리 수수료를 피하기 위해 구매가 Refund 환불로 보고될 것이라는 표시가 있는 경우 상태는 고객에게 발급된 사전 활성 환불으로 사용될 수도 있습니다.

서비스는 eventState 값을 검사하고 Clawback 이벤트 상태에 설명된 각 값의 조정에 대한 권장 사항을 따라야 합니다. 예를 들어 시나리오는 소모성 제품에 대한 Clawback 반환 상태 동작스토어 관리 구독 제품의 Clawback 반환 동작을 참조하세요.

지불 거절 및 지불 거절 취소

이벤트가 /Purchase/Chargeback 소스에서 비롯되는 경우, 지불 기관이 주문서의 비용을 철회하고 지불을 취소했음을 나타냅니다. 지불 거절의 일반적인 원인은 결제 방법에 대한 분쟁 또는 사기성 과금입니다. Chargeback 이벤트가 발생하면 Clawback 서비스는 사용자 계정에서 자격 또는 Returned 수량을 제거하려는 시도에 따라 또는 상태로 이벤트를 Revoked 보고합니다. 이벤트 시 서비스는 /Purchase/Refund의 이벤트와 동일한 조정 작업으로 지불 거절 이벤트를 처리해야 합니다.

Microsoft는 일반적으로 구매가 합법적이고 구매 수량이 사용된 것으로 판단되는 경우 정보를 기반으로 지불 거절에 이의를 제기합니다. 이의 제기가 승인되면 Microsoft로 결제가 다시 전송되고 ChargebackReversal 이벤트가 Clawback 큐에 기록됩니다. 이 이벤트는 초기 지불 거절 이벤트와 동일한 OrderID를 갖습니다.

ChargebackReversal이(가) 발생할 경우 구매한 아이템이 사용자의 계정으로 복원됩니다. 따라서 구매한 아이템을 철회하거나 제거하기 위해 서버에서 수행한 모든 작업은 결제가 복원되었으므로 취소해야 합니다.

지불 거절 및 지불 거절 취소의 타임라인은 다를 수 있습니다. 지불 거절은 일반적으로 구매 후 90일 이내에 트리거되지만 일부는 구매 후 최대 180일이 걸릴 수 있습니다. Microsoft에서 지불 거절에 이의를 제기할 경우 프로세스가 완료되고 최종 이의 제기 결과가 나오는 데는 3~6개월이 걸릴 수 있습니다.

소모성 클로백 이벤트 조정

이미 처리되거나 사용된 항목에 대한 Clawback 이벤트가 감지되면 개발 팀 또는 게시자는 사용자 계정에 대한 적절한 작업 과정을 자유롭게 확인할 수 있습니다. 일부 가능한 작업은 아래에 나열되지만 이러한 작업에만 국한되지는 않습니다.

  • 가능한 경우 사용자의 남은 잔액에서 동등한 소모품 가치(일반적으로 게임 내 통화)를 제거합니다.
  • 게임 내에서 통화를 사용하여 마지막으로 구매한 아이템을 제거합니다(남은 잔액에서 수량을 제거할 수 없는 경우).
  • 현재 사용자에 대해 아무런 조치도 취하지 않고 계정을 추적하여 이것이 사기성 또는 반품 남용 패턴일 수 있는지 확인합니다(예: 구매한 대량의 소모성 제품, 게임 내에서 소비 후 반품됨).

추가 고객 지원 전화나 분쟁을 피하기 위해 취한 조정 조치와 그 이유를 사용자에게 알리고 이 정보를 서비스에 기록하는 것이 좋습니다. 예: "Microsoft를 통해 계정에 반품이 발행되어 계정 잔액에서 [제품]의 [qty]를 제거했습니다."

소모성 제품에 대한 Clawback 이벤트를 관리하기 위한 요구 사항

매장 관리 및 개발자 관리 소모품과 관련된 이벤트를 올바르게 관리하고 조정하려면 서비스에서 각 소비 트랜잭션을 추적하고 includeOrderIds 매개 변수를 TRUE로 사용해야 합니다. 이 매개 변수는 소비 요청을 이행하기 위해 사용된 구매 주문 및 수량과 관련된 ID를 반환합니다. 이러한 동일한 OrderID는 Clawback 이벤트에 제공되며, 이를 사용하여 트랜잭션을 정확히 검색하고 식별할 수 있으며, 해당 이벤트의 데이터를 기반으로 자체 데이터베이스의 사용자를 조정해야 합니다.

서비스에서 소비 트랜잭션을 추적하는 권장 사항 및 흐름에 대한 자세한 내용은 서비스에서 소모성 제품 관리를 참조하세요.

소모성 제품에 대한 Clawback 반환 상태 동작

소모품 유형 사용 eventStatus 소모품의 사용자 자격에 미치는 영향 개발자 서비스에 권장되는 작업
Store-managed 아니요 Return 구매에서 부여한 양만큼 수량이 감소했습니다. 예: 반품 전 수량 = 1, 이벤트 후 수량 = 0. 아무 조치 없음, 아이템이 소비되지 않았습니다.
Store-managed Revoked 아이템이 이전에 소비/이행되었으므로 수량은 줄어들지 않습니다. 예: 반환 전 수량 = 0, 이벤트 후 수량 = 0. OrderID, LineItemID 및 ProductID와 일치하는 완료된 트랜잭션 데이터베이스를 검색합니다. 게임 서버에서 추적된 사용자의 잔액에서 구매 값을 철회합니다.
Dev-managed 아니요 Return 구매에서 부여한 양만큼 수량이 감소했습니다. 예: 반품 전 수량 = 1, 이벤트 후 수량 = 0. 아무 조치 없음, 아이템이 소비되지 않았습니다.
Dev-managed Revoked 아이템이 이전에 소비/이행되었으므로 수량은 줄어들지 않습니다. 예: 반환 전 수량 = 0, 이벤트 후 수량 = 0. OrderID, LineItemID 및 ProductID와 일치하는 완료된 트랜잭션 데이터베이스를 검색합니다. 게임 서버에서 추적된 사용자의 잔액에서 구매 값을 철회합니다.

소모성 제품에 대한 클로백 환불 상태 동작

환불 이벤트 상태는 사용자에게 환불이 제공되지만 항목에 대한 자격을 유지할 수 있는 특별한 경우입니다. 이 이벤트 상태로 이어지는 두 가지 주요 시나리오가 있습니다.

  • 고객이 불편을 끼쳐 드려서 환불을 받는 문제를 해결하기 위해 고객 서비스에서 발급한 환불입니다.
  • 구매가 환불으로 보고될 가능성이 높은 경우 적극적으로 환불을 발행합니다. 이렇게 하면 추가된 요금 및 가능한 차지백 이벤트를 처리하는 데 드는 리소스 비용이 방지됩니다.

따라서 환불 이벤트 상태가 표시되면 올바른 작업은 서비스에 연결된 계정 정보로 이벤트를 기록하는 것입니다. 그런 다음 해당 계정에서 가능한 사기 또는 남용을 나타내는 단일 계정에서 패턴 또는 반복 환불 이벤트 상태를 감시합니다.

소모품 유형 사용 eventStatus 소모품의 사용자 자격에 미치는 영향 개발자 서비스에 권장되는 작업
Store-managed 아니요 Refund 수량이 감소되지 않음 취소 조치 없이 사용자는 자격을 유지할 수 있지만 이벤트와 연결된 모든 사용자 정보를 기록하여 반복되는 패턴을 관찰합니다.
Store-managed Refund 수량이 감소되지 않음 취소 조치 없이 사용자는 자격을 유지할 수 있지만 이벤트와 연결된 모든 사용자 정보를 기록하여 반복되는 패턴을 관찰합니다.
Dev-managed 아니요 Refund 수량이 감소되지 않음 취소 조치 없이 사용자는 자격을 유지할 수 있지만 이벤트와 연결된 모든 사용자 정보를 기록하여 반복되는 패턴을 관찰합니다.
Dev-managed Refund 수량이 감소되지 않음 취소 조치 없이 사용자는 자격을 유지할 수 있지만 이벤트와 연결된 모든 사용자 정보를 기록하여 반복되는 패턴을 관찰합니다.

소모성 제품에 대한 Clawback 지불 거절 동작

소모품 유형 사용 eventStatus 소모품의 사용자 자격에 미치는 영향 개발자 서비스에 권장되는 작업
Store-managed 아니요 Return 구매에서 부여한 양만큼 수량이 감소했습니다. 예: 반품 전 수량 = 1, 이벤트 후 수량 = 0. 아무 조치 없음, 아이템이 소비되지 않았습니다.
Store-managed Revoked 아이템이 이전에 소비/이행되었으므로 수량은 줄어들지 않습니다. 예: 반환 전 수량 = 0, 이벤트 후 수량 = 0. OrderID, LineItemID 및 ProductID와 일치하는 완료된 트랜잭션 데이터베이스를 검색합니다. 게임 서버에서 추적된 사용자의 잔액에서 구매 값을 철회한 다음 추적 데이터베이스 입력값을 업데이트하여 지불 거절되었음을 확인합니다.
Dev-managed 아니요 Return 구매에서 부여한 양만큼 수량이 감소했습니다. 예: 반품 전 수량 = 1, 이벤트 후 수량 = 0. 아무 조치 없음, 아이템이 소비되지 않았습니다.
Dev-managed Revoked 아이템이 이전에 소비/이행되었으므로 수량은 줄어들지 않습니다. 예: 반환 전 수량 = 0, 이벤트 후 수량 = 0. OrderID, LineItemID 및 ProductID와 일치하는 완료된 트랜잭션 데이터베이스를 검색합니다. 게임 서버에서 추적된 사용자의 잔액에서 구매 값을 철회한 다음 추적 데이터베이스 입력값을 업데이트하여 지불 거절되었음을 확인합니다.

소모성 제품에 대한 Clawback 지불 거절 취소 동작

소모품 유형 사용 eventStatus 소모품의 사용자 자격에 미치는 영향 개발자 서비스에 권장되는 작업
Store-managed 아니요 ChargebackReversal 지불 거절의 수량은 지불 거절 이벤트 전에 소비되지 않았기 때문에 사용자의 수량으로 복원됩니다. 예: 취소 전 수량 = 0, 반전 후 수량 = 1. 수량은 일반적인 쿼리 흐름에 의해 정상으로 표시되고 사용되어야 하며 소비되어야 합니다. OrderID, LineItemID 및 ProductID와 일치하는 완료된 트랜잭션 데이터베이스를 검색합니다. 일치 아이템이 반올림되지 않거나 레코드가 지불 거절을 통과했음을 나타내지 않는 경우 아무 작업도 수행하지 않습니다.
Store-managed ChargebackReversal 지불 거절의 수량은 지불 거절 이벤트 전에 이미 소비되었기 때문에 사용자의 수량으로 복원되지 않습니다. 예: 반전 전 수량 = 0, 반전 후 수량 = 0. OrderID, LineItemID 및 ProductID와 일치하는 완료된 트랜잭션 데이터베이스를 검색합니다. 일치 아이템이 발견되고 시스템에서 지불 거절로 기록된 경우 이전에 사용자의 잔액에 취한 지불 거절 조치를 취소합니다. 그런 다음 추적 입력 항목을 업데이트하여 지불 거절이 취소되었음을 확인합니다.
Dev-managed 아니요 ChargebackReversal 지불 거절의 수량은 지불 거절 이벤트 전에 소비되지 않았기 때문에 사용자의 수량으로 복원됩니다. 그러나 수량은 1 이하로 나타납니다. 아래의 참고를 참조하세요. 아래의 참고를 참조하세요.
Dev-managed ChargebackReversal 이미 사용되었더라도 지불 거절의 수량 사용자의 수량으로 복원됩니다. 아래의 참고를 참조하세요. 아래의 참고를 참조하세요.

참고 항목

개발자 관리 소모품은 지불 거절 취소와 함께 고유하게 동작하며 이러한 이벤트를 처리하기 위한 추가 논리가 필요합니다. 자세한 내용은 다음을 참조하세요.

지불 거절 취소 중 개발자 관리 소모품의 고유한 동작

개발자 관리 소모품이 지불 거절 이벤트 전에 사용되었는지 여부에 관계없이, 지불 거절이 취소되면 구매의 소모품 수량이 사용자의 계정 잔액에 다시 추가됩니다. 그러나 개발자 관리 소모품은 개발 관리자 소모품에 유효한 자격이 여러 개 있는 경우에도 1보다 큰 수량을 보고하지 않습니다. 이는 개발자 관리 소모품이 게임 서비스에서 소비/이행되었다고 보고될 때까지 사용자가 소모품을 다시 구매하지 못하도록 차단하기 위해 마련되었기 때문입니다. 사용자 계정에 이미 0이 아닌 잔액이 있는데 지불 거절 취소가 발생하는 경우 여러 자격은 여전히 유효하며 정상적으로 개별적으로 소비할 수 있습니다. 모든 활성 자격이 소비/이행될 때까지 각 소비 요청 후에는 사용자의 잔액이 '1'로 유지됩니다. 따라서 개발자 관리 소모품에 대한 사용자의 잔액이 '0'으로 보고될 때까지 시스템은 정상적으로 소비 흐름을 거쳐야 합니다.

소비할 때 동일한 OrderID, LineItemID 및 ProductId와 일치하는 레코드가 표시되는 경우 지불 거절 조정을 거치는 것으로 표시되는지 확인합니다.
지불 거절에서 조정된 것으로 표시된 경우 사용자의 계정 잔액에 대해 취한 조치를 취소하고 아이템을 지불 거절 취소로 표시합니다.

예: 취소 전 수량 = 1, 취소 후 수량 = 1이지만 실제로는 활성 자격이 2개 있습니다. 서비스는 소모품 중 1개를 소비하며, 사용자의 수량은 소비 후에도 여전히 '1'입니다. 서비스는 소모품 중 1개 이상을 소비하며, 사용자의 수량은 이제 '0'으로 보고됩니다.

스토어 관리 구독 제품에 대한 Clawback 반품 동작

스토어 관리 구독에 대한 Clawback 이벤트가 검색되면 ClawbackEventSubscriptionData 구조를 통해 구독과 관련된 추가 정보가 Clawback 이벤트에 추가됩니다. 특히 사용자가 해당 구독 간격에 대한 전체 또는 부분 지불 금액을 발급한 경우입니다. 구독이 사용자 계정에 매월 게임 내 보상 또는 통화를 부여하는 경우 지급액이 반환된 일수와 보유 일수에 따라 해당 보상을 해지할 수 있습니다.

[참고!] 개발 팀과 게시자는 스토어 관리 구독 Clawback 이벤트가 수신될 때 사용자 계정에 대한 적절한 작업 과정을 자유롭게 확인할 수 있습니다. 항목 또는 혜택을 취소하기 위한 조치가 수행되는 경우 추가 고객 지원 전화 또는 분쟁이 발생하지 않도록 서비스에서 수행된 조정 작업, 이유 및 로깅 정보를 사용자에게 알리는 것이 좋습니다. 예: “Microsoft를 통해 계정에 반환되는 반환으로 인해 [구독 제품] 혜택이 조정되었습니다.”

스토어 관리 구독에 대한 Clawback 이벤트 동작

eventStatus 시나리오 개발자 서비스에 권장되는 작업
Revoked 구독 간격에는 이미 사용된 날짜가 포함되며, 구독 자격이 사용자 계정에서 제거되었습니다. 반환이 일부 또는 꽉 찼는지 확인합니다. 지급되지 않은 자격을 해지하거나 부분 지불이 유지된 양에 따라 부분 값을 부여하려면 적절한 조치를 취합니다.
Return 아직 사용/시작되지 않은 예정된 구독 간격이 사용자 계정에서 제거되었습니다. 작업이 없습니다. 간격이 시작되지 않았습니다.
환불 현재 활성 구독 간격 결제가 사용자에게 다시 전송되었습니다. 해지 작업이 없으므로 사용자는 자격을 유지할 수 있지만 이벤트 및 연결된 사용자 정보를 기록하여 반복되는 패턴을 감시할 수 있습니다. 되풀이 서비스를 사용하여 정상 상태 및 논리를 따릅니다. 서비스에서 구독 제품 관리를 참조하세요.
ChargebackReversal 이전 해지 상태의 구독 간격이 사용자 계정으로 복원되었습니다. 항목이 해지된 것으로 조정될 때 수행된 모든 동작을 반대로 설정합니다. 되풀이 서비스에서 보고한 구독 상태의 정상 상태 및 논리를 따릅니다. 서비스에서 구독 제품 관리를 참조하세요.

전체 및 부분 반환에 대한 ClawbackEventSubscriptionData 예시

시나리오: 월간 구독, 사용자가 2023년 7월 6일에 비례 배분(부분) 반환을 발급했습니다. 사용자에게 사용되지 않은 25일의 가격이 다시 제공되었으며, Microsoft는 사용된 6일 동안 남은 가격을 유지했습니다.

    "subscriptionData": {
      "recurrenceId": "mdr:0:ae5cad80acf2428fa64c38529996a3fd:df3763c2-36f8-4bde-8fa5-a29fb6058d62",
      "durationIntervalStart": "2023-07-01T00:00:00+00:00",
      "durationInDays": 31,
      "consumedDurationInDays": 6,
      "refundType": "Partial"
    }

시나리오: 월간 구독, 사용자가 2023년 7월 6일에 전체 반환을 발행했습니다. 사용자에게 월 구독에 대해 지급된 전체 가격이 제공되었으며 Microsoft는 결제를 유지하지 않았습니다.

    "subscriptionData": {
      "recurrenceId": "mdr:0:0dc7194514404dd3bf0f678e21716774:23a454d5-f240-4dad-9923-9c3f53f515cc",
      "durationIntervalStart": "2023-07-01T00:00:00+00:00",
      "durationInDays": 31,
      "consumedDurationInDays": 6,
      "refundType": "Full"
    }

시나리오: 연간 구독에서 사용자는 2024년 1월 15일에 비례 배분(부분) 반환을 발급했습니다. 사용자에게 사용되지 않은 199일의 가격이 다시 제공되었으며, Microsoft는 사용된 168일 동안 남은 가격을 유지했습니다.

    "subscriptionData": {
      "recurrenceId": "mdr:0:9ed0a48236404b78a017e9e226da94c6:22aa4f3c-1ffc-4dd3-8801-cb2a227a5c46",
      "durationIntervalStart": "2023-07-31T00:00:00+00:00",
      "durationInDays": 367,
      "consumedDurationInDays": 168,
      "refundType": "Partial"
    }

[참고!] 위의 예제’의 연간 구독 durationInDays는 365가 아닌 367입니다. 2024년은 윤년으로 인해 하루가 추가되고, 다른 하나는 29일, 30일 또는 31일이 없는 문제를 방지하기 위해 사용자의 갱신 날짜를 다음 달 1일로 이동하기 위해 추가됩니다. 자세한 내용은 구독 시작, 갱신 및 만료 날짜 이해를 참조하세요.

후자의 예에서는 Clawback 이벤트 이전 시간에 대한 지불이 유지되었습니다. 구독에서 월간 보상 또는 게임 내 아이템을 부여한 경우 사용자가 해당 기간 동안 부여된 항목을 유지하도록 하는 것이 좋습니다.

개발 샌드박스 내에서 제품 반품 테스트

샌드박스 개발 계정은 support.xbox.com의 자동화된 제품 반품품 요청 도구에 액세스할 수 없습니다. 따라서 반품품 시나리오 및 사용자 지정 구현을 테스트하려면 다음을 수행하여 Microsoft 개발자 계정 관리자 또는 Microsoft 연락처의 도움을 받아 테스트 구매에 대한 반품을 요청해야 합니다.

  1. 테스트 제품이 0이 아닌 가격으로 설정되어 있는지 확인합니다($0.01로 충분함).
  2. 테스트 계정으로 개발 샌드박스에 로그인합니다.
  3. 테스트 계정에서 제품을 구매합니다.
  4. 소비 요청에서 includeOrderIds: true 옵션을 사용하여 구매한 항목을 처리/소비합니다.
  5. 소비 응답에서 반환되는 OrderId를 기록합니다.
  6. Microsoft 개발자 파트너 관리자 또는 Microsoft 연락처로 전자 메일을 보내 제품의 제품 반품을 요청합니다. 전자 메일은 다음 템플릿 예제에 다음 정보를 포함해야 합니다.
요청 유형 OrderID OrderLineItemId 테스트 계정(이메일) 구매한 항목의 이름 구매 날짜 요청 요약, 추가 정보
Return 8060a406-85c8-4d01-a105-ff11725499c9 cb054aa0-7392-4cc6-af06-53b285e39259 XDKS-RefundTest0001@xboxtest.com 소모품 1 2021-08-30T21:53:08.2565331+00:00 항목의 Clawback 테스팅

경고 참고: 요청이 '환불'이 아닌 '반품'으로 나열되어 있는지 확인합니다. '환불'에 사용되는 도구는 결제를 환불하지만 사용자 계정의 자격을 유지합니다. 도구의 'return'을 사용하면 자격이 해지되고, Clawback 이벤트 메시지가 큐에 기록됩니다.

Xbox 지원 팀의 담당자가 영업일 3일 이내에 요청이 처리되었는지 확인하기 위해 회신합니다. 그런 다음 쿼리에서 올바른 Clawback 정보를 볼 수 있어야 합니다.
개발자 파트너 관리자가 권한을 부여한 경우 나중에 직접 요청하기 위한 Xbox 지원 팀의 전자 메일 주소를 제공할 수 있습니다. 조직 내에서 이 별칭을 광범위하게 공유하지 말고 향후 직접 요청에 대해 개발자 파트너 관리자에게 문의하세요.

경고 참고: 반품 및 환불은 0이 아닌 가격이 책정된 제품에 Clawback 이벤트만 발생시킵니다. 따라서 제품에는 $0.01 이상의 가격이 책정되어야 합니다. 이제 새로 생성된 모든 테스트 계정에는 샌드박스 내에서 테스트 구매를 할 수 있는 테스트 결제 도구가 추가되므로 이 기능이 활성화됩니다. 테스트 결제 방법이 없는 이전 계정을 사용하는 경우 이 흐름을 수행할 수 있도록 새 계정을 만드세요.

참고 항목

상거래 개요

소모품 기반 에코시스템

서비스의 소모성 제품 관리

Microsoft Store Service API

Microsoft.StoreServices 라이브러리(GitHub)

Microsoft.StoreServices 샘플(GitHub)