영수증 검증 실패 문의드립니다

고객님의 문의에 답변하는 직원은 고객 여러분의 가족 중 한 사람일 수 있습니다.
고객의 언어폭력(비하, 조롱, 욕설, 협박, 성희롱 등)으로부터 직원을 보호하기 위해
관련 법에 따라 수사기관에 필요한 조치를 요구할 수 있으며, 형법에 의해 처벌 대상이 될 수 있습니다.

커뮤니티 이용 정책에 위배되는 게시물을 작성할 경우, 별도 안내 없이 게시물 삭제 또는 커뮤니티 이용이 제한될 수 있습니다.

문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.

  • 뒤끝 SDK 버전 : 5.16.1
  • 프로젝트명 : PirateStory
  • 스테이터스 코드 :
  • 에러 코드 :
  • 에러 메시지 :

현재 특정 캐시 상품을 구매 후 재접속 할 경우 영수증 검증 실패 로그가 계속 남고 있는 현상이 발생하는데,
개발 로직상으로 특별히 요청하는 경우가 없는 것 같아 문의 드립니다.
혹시 콘솔의 영수증 검증에서 해당 영수증의 실패 이유를 파악할 수 있는 방법이 있을까요?

pirate_pass_level1
pirate_pass_stage1
pirate_pass_mon

위 현상이 발생하고 있는 캐시 상품 정보도 전달 드립니다.

안녕하세요 개발자님,
확인 시 이미 사용된 영수증 정보를 통해 영수증 검증을 요청하여 실패한 상황으로 확인됩니다.
상세 정보 DM으로 전달드렸으니 확인해 주시면 감사하겠습니다.

답변 감사드립니다.

죄송합니다만, 영수증 검증 로직을 구매 성공했을 경우에만 호출하고 있고,
해당 구매 실패에 대한 내역이 구글 콘솔에는 출력 되지 않는 상태에서 뒤끝 콘솔에만 영수증 검증 실패 오류가 계속 발생하고 있는데 혹시 원인을 파악할 수 있는 방법이 있을까요?

현재 상황은 구매 실패한 영수증이 아니라, 정상적으로 구매가 완료된 영수증을 가지고 검증 요청이 반복적으로 발생하고 있는 상태입니다.
다만, 이 영수증은 이미 한 번 검증에 성공하여 사용 처리된 상태이기 때문에, 이후 같은 영수증으로 검증 요청이 오면 뒤끝에서는 '이미 사용된 영수증’으로 판단하여 실패 로그를 남기게 됩니다.

즉, 실제로 구매에 실패한 케이스는 아니며, 구글 콘솔에서도 실패한 구매로 나타나지 않는 이유가 바로 이 때문입니다.

클라이언트에서 이미 사용된 영수증으로 검증 요청이 반복적으로 발생하고 있는 원인을 확인해 대응해 주시면 감사하겠습니다.

아래는 클라이언트 내에서 영수증 검증 요청에 관련된 코드 내역입니다. 혹시 잘못 적용한 부분이 있을까요?
아니면 영수증 검증 요청이 IsValidateGooglePurchase 함수 외에 적용 되는 경우가 있나요?

/* 구매를 처리하는 함수 */
public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
{
    Debug.Log("구매에 성공했습니다");

    // 영수증 검증
    TitleMng.m_Instance.GetBackendManager().PruchaseProcess(args);

    // 구매 보상 처리 로직

    return PurchaseProcessingResult.Complete;
}


public void PruchaseProcess(PurchaseEventArgs args)
{

#if UNITY_ANDROID
BackendReturnObject validation = Backend.Receipt.IsValidateGooglePurchase(args.purchasedProduct.receipt, args.purchasedProduct.definition.id,
args.purchasedProduct.metadata.localizedPrice, args.purchasedProduct.metadata.isoCurrencyCode);

    if (validation.IsSuccess())
    {
        Debug.Log("영수증 검증 성공");
    }
    else
    {
        Debug.Log("영수증 검증 실패 " + validation.GetErrorCode());
    }

#elif UNITY_IOS
BackendReturnObject validation = Backend.Receipt.IsValidateApplePurchase(args.purchasedProduct.receipt, args.purchasedProduct.definition.id,
args.purchasedProduct.metadata.localizedPrice, args.purchasedProduct.metadata.isoCurrencyCode);

    if (validation.IsSuccess())
    {
        Debug.Log("영수증 검증 성공");
    }
    else
    {
        Debug.Log("영수증 검증 실패 " + validation.GetErrorCode());
    }

#endif
}

공유해주신 코드 기준으로는 IsValidateGooglePurchase는 구매 성공 시 ProcessPurchase 내에서 단 한 번만 호출되는 구조이며, 별도로 중복 호출되는 로직은 확인되지 않았습니다.

다만 Unity IAP 특성상, 다음과 같은 상황에서는 같은 영수증으로 검증 요청이 반복될 수 있습니다.

  • 구매 직후 PurchaseProcessingResult.Complete가 반환되기 전에 앱이 강제 종료된 경우
  • Unity IAP가 특정 트랜잭션을 완료 처리하지 못한 상태에서 앱이 재실행된 경우 →
    ProcessPurchase가 다시 호출되어 같은 영수증이 재검증되는 상황이 발생할 수 있습니다.

즉, 클라이언트 로직상 반복 검증을 유도한 것은 아니지만, Unity IAP 내부 로직에 의해 자동 재처리가 발생했을 가능성이 높습니다.

이미 사용된 영수증이라는 에러 메시지가 리턴되는 경우에는 PurchaseProcessingResult.Complete를 반환하여 Unity IAP가 해당 트랜잭션을 더 이상 처리하지 않도록 구성해 주시기 바랍니다.

답변 감사드립니다.

뒤끝 영수증 검증 로직 상의 문제는 없다고 판단 되어 클라이언트 내부 로직에서 좀 더 체크 해보겠습니다.

좋아요 1