인앱 결재이후 TBC 검증 오류

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

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

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

  • 뒤끝 SDK 버전 : 5.11.7
  • 프로젝트명 : 악사키우기
  • 스테이터스 코드 :
  • 에러 코드 :
  • 에러 메시지 : Log: ChargeTBC Fail : BadParameterException, bad token, 잘못된 token 입니다

<>c__DisplayClass28_0:<UnityEngine.Purchasing.IStoreListener.ProcessPurchase>b__0(BackendReturnObject)
dKiSsHF0Z7kWhgu8iHT.n6NIZMF62Yy8AOisqCc:qBaFQVXaop()
LoginManager:Update()

출시직전 인앱결재 테스트할려고 구글플레이스토어에 테스트 계정으로 결재 테스트도중 TBC 검증중 해당 badtoken이라는 오류를 받았습니다. 이건 사용자 계정이 어떤경웨 뜨는 오류인가요 …?

안녕하세요 개발자님,
해당 에러가 발생하였던 유저 정보와 대략적인 일시를 공유해주시면 감사하겠습니다.

넵 아이디는 풍요로운전투사이고 결재는 1시간 전쯤에 이루어졌습니다!! 필요하신 데이터 더 말씀주시면 제공해드리겠습니다.
아 정확한 프로젝트명은 악귀사냥꾼키우기입니다.

좋아요 1

확인 시 유효하지 않은 영수증 토큰을 통해 시도된 결제로인해 발생한 에러로 확인됩니다.

statusCode : 400
errorCode : BadParameterException
message : bad token, 잘못된 token 입니다

PurchaseProcessingResult IStoreListener.ProcessPurchase(PurchaseEventArgs e)
    {
        try
        {
            bool isSuccess = true;

#if (UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR

            CrossPlatformValidator validator = new CrossPlatformValidator(GooglePlayTangle.Data(), AppleTangle.Data(), Application.identifier);

            try
            {
                IPurchaseReceipt[] result = validator.Validate(e.purchasedProduct.receipt);

                foreach (var productReceipt in result)
                {
                    Analytics.Transaction(productReceipt.productID, e.purchasedProduct.metadata.localizedPrice,
                        e.purchasedProduct.metadata.isoCurrencyCode, productReceipt.transactionID, null);

#if UNITY_ANDROID
                    GooglePlayReceipt google = productReceipt as GooglePlayReceipt;
                    if(google != null)
                    {
                        if (google.purchaseState != GooglePurchaseState.Purchased)
                            isSuccess = false;
                    }
#endif
                }
            }
            catch (IAPSecurityException)
            {
                isSuccess = false;
                Debug.Log("영수증 검증 실패");
            }
#endif
            if (isSuccess)
            {
                //구매성공했으니 사운드 
                Debug.Log("구매 성공! 영수증 검증 성공!");
                SoundManager.Instance.PlayAudio("RewardReceived");
                string productId = e.purchasedProduct.definition.id;
                string receipt = null;
                string signature = null;
#if UNITY_ANDROID
                GetReceiptSignature(e.purchasedProduct.receipt, out receipt, out signature);
#elif UNITY_IOS
            receipt = e.purchasedProduct.receipt;
#endif
                string currency = e.purchasedProduct.metadata.isoCurrencyCode;
                double price = decimal.ToDouble(e.purchasedProduct.metadata.localizedPrice);

                //현재 구매한 가격을 유저 과금 변수에 추가함
                //추후 할인 고려하여 구조 확장 필요
                GameDataTable.Instance.User.TotalPurchase += cellData.DiscountedPrice;
                Debug.LogFormat("ProcessPurchase id : {0}, receipt : {1}, signature : {2}, currency : {3}, price : {4}", productId, receipt, signature, currency, price);
#if (UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR
#if UNITY_ANDROID
                BackEnd.Backend.TBC.ChargeTBC(e.purchasedProduct.receipt,
                    $"ProcessPurchase id: {productId}, receipt: {receipt}, signature: {signature}, currency: {currency}, price: {price}", callback =>
                {
                    if (callback.IsSuccess())
                    {
                        //StartCoroutine(GetTBC());
                        Invoke("GetTBC", 0.1f);
                        OnPurchaseSuccess(productId);
                    }
                    else
                    {
                  Debug.Log("productId : " + productId  + "receipt :" + receipt + "signature :" + signature + "currency:" + currency + "price:"+ price);
                        Debug.Log($"ChargeTBC Fail : {callback.GetErrorCode()}, {callback.GetMessage()}");
                        if (callback.GetStatusCode() == "404")
                            OnPurchaseSuccess(productId);
                    }
                });
#elif UNITY_IOS
                BackEnd.Backend.TBC.ChargeTBC(productId, e.purchasedProduct.receipt, 
                    $"ProcessPurchase id: {productId}, receipt: {receipt}, signature: {signature}, currency: {currency}, price: {price}", callback =>
                {
                    if (callback.IsSuccess())
                    {
                        //StartCoroutine(GetTBC());
                        Invoke("GetTBC", 0.1f);
                        OnPurchaseSuccess(productId);
                    }
                    else
                    {
                        Debug.Log($"ChargeTBC Fail : {callback.GetErrorCode()}, {callback.GetMessage()}");
                        if(callback.GetStatusCode() == "404")
                            OnPurchaseSuccess(productId);
                    }
                });
#endif
#else
                if (!BackendManager.Instance.IsLocal)
                {
                    //마일리지
                    Backend.TBC.ChargeTBC(e.purchasedProduct.receipt,
                        $"ProcessPurchase id: {productId}, receipt: {receipt}, signature: {signature}, currency: {currency}, price: {price}", callback =>
                        {
                            if (callback.IsSuccess())
                                //StartCoroutine(GetTBC());
                                Invoke("GetTBC", 0.1f);

                            
                        });
                }

                OnPurchaseSuccess(productId);
                
#endif
            }
        }
        catch (Exception error)
        {
            Debug.LogError(error);
            return PurchaseProcessingResult.Pending;
        }
        return PurchaseProcessingResult.Complete;
    }

구매 영수증 확인하는 코드를 이렇게짰는데 영수증 토큰을 재대로 할려면 어떻게해야하나요?

관련 내용을 상세 확인 시,
영수증 검증은 정상적으로 성공한 것으로 확인되나,
TBC 검증 로직 과정에서 에러가 발생하여 에러가 노출되며 TBC와 관련한 영수증 데이터가 저장되지 못한 것으로 확인됩니다.
이용에 불편을 드려 죄송합니다.

현재 콘솔내 TBC 지급 기능 이상과 함께 빠르게 픽스하여 안내드릴 수 있도록 하겠습니다.
다소 시간이 소요될 수 있는 점 양해 부탁드립니다.