コード例 #1
0
    private void ConfirmPurchase()
    {
        var circleView = view as CircleView;

        circleView.PlayPurchaseAnimation();
        OnPurchased?.Invoke();
    }
コード例 #2
0
        PurchaseProcessingResult IStoreListener.ProcessPurchase(PurchaseEventArgs args)
        {
            if (googleTangleData == null)
            {
                Debug.Log($" ***** ProcessGooglePurchase   googleTangleData IS NULL");
                OnPurchased?.Invoke(PurchaseResponse.Ok, args.purchasedProduct);
                return(PurchaseProcessingResult.Complete);
            }

            // validate receipt.
            try {
                Debug.Log($" ***** ProcessAmazonPurchase   validate receipt.");
                var validator = new CrossPlatformValidator(googleTangleData, null, Application.identifier);
                // On Google Play, result has a single product ID.
                // On Apple stores, receipts contain multiple products.
                var result = validator.Validate(args.purchasedProduct.receipt);
    #if DEBUG_IAP
                // For informational purposes, we list the receipt(s)
                foreach (IPurchaseReceipt receipt in result)
                {
                    var sb = new StringBuilder("Purchase Receipt Details:");
                    sb.Append($"\n  Product ID: {receipt.productID}");
                    sb.Append($"\n  Purchase Date: {receipt.purchaseDate}");
                    sb.Append($"\n  Transaction ID: {receipt.transactionID}");
                    Debug.Log(sb);
                }
    #endif
                OnPurchased?.Invoke(PurchaseResponse.Ok, args.purchasedProduct);
            } catch (IAPSecurityException err) {
                Debug.Log($"Invalid receipt or security exception: {err.Message}");
                OnPurchased?.Invoke(PurchaseResponse.InvalidReceipt, args.purchasedProduct);
            }

            return(PurchaseProcessingResult.Complete);
        }
コード例 #3
0
        PurchaseProcessingResult IStoreListener.ProcessPurchase(PurchaseEventArgs e)
        {
            DebugLog("Processing a purchase");

            // receipt validation tangle data not available.
            if (appleTangleData == null)
            {
                OnPurchased?.Invoke(PurchaseResponse.Ok, e.purchasedProduct);
                onRestored?.Invoke(PurchaseResponse.Ok);
                onRestored = null;

                return(PurchaseProcessingResult.Complete);
            }

            // validate receipt.
            try {
                var          receiptData = System.Convert.FromBase64String(appleConfig.appReceipt);
                AppleReceipt receipt     = new AppleValidator(appleTangleData).Validate(receiptData);
#if DEBUG_IAP
                foreach (AppleInAppPurchaseReceipt receipts in receipt.inAppPurchaseReceipts)
                {
                    var sb = new StringBuilder("Purchase Receipt Details:");
                    sb.Append($"\n  Original Transaction ID: {receipts.originalTransactionIdentifier}");
                    sb.Append($"\n  Intro Price Period: {receipts.isIntroductoryPricePeriod}");
                    sb.Append($"\n  Product ID: {receipts.productID}");
                    sb.Append($"\n  Product type: {receipts.productType}");
                    sb.Append($"\n  Quantity: {receipts.quantity}");
                    sb.Append($"\n  Original Transaction ID: {receipts.originalTransactionIdentifier}");
                    sb.Append($"\n  Original Purchase Date: {receipts.originalPurchaseDate}");
                    sb.Append($"\n  Purchase Date: {receipts.purchaseDate}");
                    sb.Append($"\n  Cancellation Date: {receipts.cancellationDate}");
                    sb.Append($"\n  Subsc Expiration Date: {receipts.subscriptionExpirationDate}");
                    sb.Append($"\n  Free trial: {receipts.isFreeTrial}");
                    DebugLog(sb);
                }
#endif
                OnPurchased?.Invoke(PurchaseResponse.Ok, e.purchasedProduct);
                onRestored?.Invoke(PurchaseResponse.Ok);
                onRestored = null;
            } catch (IAPSecurityException err) {
                Debug.Log($"Invalid receipt or security exception: {err.Message}");
                OnPurchased?.Invoke(PurchaseResponse.InvalidReceipt, e.purchasedProduct);
                onRestored?.Invoke(PurchaseResponse.InvalidReceipt);
                onRestored = null;
            } catch {
                OnPurchased?.Invoke(PurchaseResponse.InvalidReceipt, e.purchasedProduct);
                onRestored?.Invoke(PurchaseResponse.InvalidReceipt);
                onRestored = null;
            }

            return(PurchaseProcessingResult.Complete);
        }
コード例 #4
0
        PurchaseProcessingResult ProcessGooglePurchase(PurchaseEventArgs e)
        {
            // receipt validation tangle data not available.
            if (googleTangleData == null)
            {
                DebugLog($" ***** ProcessGooglePurchase   googleTangleData IS NULL");
                OnPurchased?.Invoke(PurchaseResponse.Ok, e.purchasedProduct);
                return(PurchaseProcessingResult.Complete);
            }

            // validate receipt.
            try {
                DebugLog($" ***** ProcessGooglePurchase   validate receipt.");
                var validator = new CrossPlatformValidator(googleTangleData, null, Application.identifier);
                // On Google Play, result has a single product ID.
                // On Apple stores, receipts contain multiple products.
                var result = validator.Validate(e.purchasedProduct.receipt);
#if DEBUG_IAP
                // For informational purposes, we list the receipt(s)
                foreach (IPurchaseReceipt receipt in result)
                {
                    var sb = new StringBuilder("Purchase Receipt Details:");
                    sb.Append($"\n  Product ID: {receipt.productID}");
                    sb.Append($"\n  Purchase Date: {receipt.purchaseDate}");
                    sb.Append($"\n  Transaction ID: {receipt.transactionID}");

                    var googleReceipt = receipt as GooglePlayReceipt;
                    if (googleReceipt != null)
                    {
                        // This is Google's Order ID.
                        // Note that it is null when testing in the sandbox
                        // because Google's sandbox does not provide Order IDs.
                        sb.Append($"\n  Purchase State: {googleReceipt.purchaseState}");
                        sb.Append($"\n  Purchase Token: {googleReceipt.purchaseToken}");
                    }

                    DebugLog(sb);
                }
#endif
                OnPurchased?.Invoke(PurchaseResponse.Ok, e.purchasedProduct);
            } catch (IAPSecurityException err) {
                DebugLog($"Invalid receipt or security exception: {err.Message}");
                OnPurchased?.Invoke(PurchaseResponse.InvalidReceipt, e.purchasedProduct);
            }

            return(PurchaseProcessingResult.Complete);
        }
コード例 #5
0
        void IStoreListener.OnPurchaseFailed(Product p, PurchaseFailureReason reason)
        {
            Debug.LogWarning($"IAP purchase error: {reason}");
            HandleRestoreFailure(reason);

            switch (reason)
            {
            case PurchaseFailureReason.DuplicateTransaction:
                OnPurchased?.Invoke(PurchaseResponse.DuplicateTransaction, p);
                break;

            case PurchaseFailureReason.PaymentDeclined:
                OnPurchased?.Invoke(PurchaseResponse.PaymentDeclined, p);
                break;

            case PurchaseFailureReason.ProductUnavailable:
                OnPurchased?.Invoke(PurchaseResponse.ProductUnavailable, p);
                break;

            case PurchaseFailureReason.PurchasingUnavailable:
                OnPurchased?.Invoke(PurchaseResponse.PurchasingUnavailable, p);
                break;

            case PurchaseFailureReason.SignatureInvalid:
                OnPurchased?.Invoke(PurchaseResponse.SignatureInvalid, p);
                break;

            case PurchaseFailureReason.UserCancelled:
                OnPurchased?.Invoke(PurchaseResponse.UserCancelled, p);
                break;

            case PurchaseFailureReason.ExistingPurchasePending:
                OnPurchased?.Invoke(PurchaseResponse.ExistingPurchasePending, p);
                break;

            case PurchaseFailureReason.Unknown:
                OnPurchased?.Invoke(PurchaseResponse.Unknown, p);
                break;
            }
        }