private void ConfirmPurchase() { var circleView = view as CircleView; circleView.PlayPurchaseAnimation(); OnPurchased?.Invoke(); }
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); }
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); }
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); }
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; } }