영수증 검증 관련 문의 드립니다.

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

  • 뒤끝 SDK 버전 : 5.7.0
  • 프로젝트명 : 내일의 용사
  • 스테이터스 코드 :
  • 에러 코드 : 400
  • 에러 메시지 : bad token, 잘못된 token 입니다

안녕하세요. IAP관련 영수증 검증 문의를 드립니다.
코드는 문서에 예시로 올려주신 대로 작성해서 사용 중이고,
필요한 설정은 대부분 한 것 같습니다.
구글에 클로즈테스트 버전으로 올려서 핸드폰에 다운받아서 돌리면
구글에서 결재 완료가 넘어오는데, 뒤끝서버에 검증을 보내면 400이 돌아오네요.
어떤 부분이 문제가 있을지 감이 좀 오지 않아서 logcat으로 떠온 디버깅 메시지와
코드를 올려 드리고 도움을 요층 드리고자 합니다 ^^;

확인 부탁 드립니다~

디버깅 로그
2022-10-04 14:11:42.422 10711 10736 Info Unity IAP_receipt : {“Payload”:"{“json”:"{\“orderId\”:\“GPA.3337-4565-9189-61763\”,\“packageName\”:\“com.donkatsu.bot\”,\“productId\”:\“dia_1680\”,\“purchaseTime\”:1664860300553,\“purchaseState\”:0,\“purchaseToken\”:\“ddddeicafjaeofmhnlhdfafn.AO-J1OxN5Al7bSNzJLk9isyhJdKdNI2Q5GgSZM1OpwkZDUZiQRrITJegU8QtroFVHehBI5Gsw6eIAb0F4ECXWLG996NHrSXEqw\”,\“quantity\”:1,\“acknowledged\”:false}",“signature”:“kr8PGWhQsVoeJEfWl1l7MZ2hHaHTxiW57p0rOepQYgoJPW6YRcw7e84KqxB2l4TSehnsyA2RSB11c+1oJrWulEBYM05FEVZeNj7urBO2sH5fBEJXdfLhGHriwKHfnZ1JwQOmxz5mPTGmZ1IvnUu11Ru+NsqPM1ikcY8PITVONgM6t4HwAqVacznG9R2z2nwz+XKYcGRGJIeQ8QUtKyENjMr0dgMkokaYl3q/+7efGe34Dik7b3k61jxT9Px0PWDuDUaFHG5Dw8egqS7/1KBOkXR3pDVTc/hbS/o3qmANaIRtlZOwi1SiMcluXiaSabHi5Ayo671WIA5qTdzdweFe8w==”,“skuDetails”:["{\“productId\”:\“dia_1680\”,\“type\”:\“inapp\”,\“title\”:\"\ub2e4\uc774\uc544X1680 (\ub0b4\uc77c\uc758 \uc6a9\uc0ac - \uad6d\uc0b0 \ubc29\uce58\ud615 \ub3c8\uae4c\uc2a4 RPG)\

2022-10-04 14:11:43.367 10711 10736 Info Unity IAP_Result : 400

2022-10-04 14:11:43.368 10711 10736 Info Unity ProcessPurchase: FAIL. Unrecognized product: ‘dia_1680’

2022-10-04 14:11:43.368 10711 10736 Info Unity bad token, 잘못된 token 입니다

해당 코드

public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
{
Debug.Log(args.purchasedProduct.receipt);
BackendReturnObject validation = Backend.Receipt.IsValidateGooglePurchase(args.purchasedProduct.receipt, “receiptDescription”, false);
Debug.Log($“IAP_Result : {validation.GetStatusCode()}”);
if (validation.IsSuccess()) {
// 구매 성공한 제품에 대한 id 체크하여 그에 맞는 보상
// A consumable product has been purchased by this user.
if (String.Equals(args.purchasedProduct.definition.id, lastRequestedProductId, StringComparison.Ordinal))
{
Debug.Log(string.Format(“ProcessPurchase: PASS. Product: ‘{0}’”, args.purchasedProduct.definition.id));

            // The consumable item has been successfully purchased, add 100 coins to the player's in-game score.
            // ScoreManager.score += 100;
            BackendReturnObject bro = ApplyPurchase(args.purchasedProduct.definition.id);
            if (bro.IsSuccess())
                return PurchaseProcessingResult.Complete;
            else
                return PurchaseProcessingResult.Pending;
        }
        // Or ... an unknown product has been purchased by this user. Fill in additional products here....
        else
        {
            Debug.Log(string.Format("ProcessPurchase: FAIL. Unrecognized product: '{0}'", args.purchasedProduct.definition.id));
        }
    } else {
        // dOr ... an unknown product has been purchased by this user. Fill in additional products here....
        //Debug.Log(string.Format("ProcessPurchase: FAIL. Unrecognized product: '{0}'", args.purchasedProduct.definition.id));
        Debug.Log(validation.GetMessage());
    }

    // Return a flag indicating whether this product has completely been received, or if the application needs 
    // to be reminded of this purchase at next app launch. Use PurchaseProcessingResult.Pending when still 
    // saving purchased products to the cloud, and when that save is delayed. 
    return PurchaseProcessingResult.Pending;
}

안녕하세요 개발자님,
말씀해주신 에러는 유효하지 않은 영수증 토큰으로 인해 발생하는 에러로,
JWT 권한이 올바르게 부여되지 않은 경우 발생할 수 있습니다.

JWT 생성 또는 권한 설정 후 토큰 활성화 까지는 최대 만 하루가 소요될 수 있습니다.
JWT 생성 및 권한 설정 시간으로부터 24시간이 경과되지 않았다면 조금만 여유를 가지고 이후에 재시도 해주세요.

영수증 검증 문서
JWT 토큰 문서

위 링크를 통해 개발자 문서를 참고하여 주시면 감사하겠습니다.