Nav apraksta
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

IntegratingSelfProvidedBackendReceiptValidation.cs 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. using System;
  2. using System.Collections;
  3. using UnityEngine;
  4. using UnityEngine.Purchasing;
  5. using UnityEngine.Purchasing.Extension;
  6. using UnityEngine.UI;
  7. namespace Samples.Purchasing.Core.IntegratingSelfProvidedBackendReceiptValidation
  8. {
  9. public class IntegratingSelfProvidedBackendReceiptValidation : MonoBehaviour, IDetailedStoreListener
  10. {
  11. IStoreController m_StoreController;
  12. public string goldProductId = "com.mycompany.mygame.gold1";
  13. public ProductType goldType = ProductType.Consumable;
  14. public Text GoldCountText;
  15. public Text ProcessingPurchasesCountText;
  16. int m_GoldCount;
  17. int m_ProcessingPurchasesCount;
  18. void Start()
  19. {
  20. InitializePurchasing();
  21. UpdateUI();
  22. }
  23. void InitializePurchasing()
  24. {
  25. var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
  26. builder.AddProduct(goldProductId, goldType);
  27. UnityPurchasing.Initialize(this, builder);
  28. }
  29. public void BuyGold()
  30. {
  31. m_StoreController.InitiatePurchase(goldProductId);
  32. }
  33. public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
  34. {
  35. Debug.Log("In-App Purchasing successfully initialized");
  36. m_StoreController = controller;
  37. }
  38. public void OnInitializeFailed(InitializationFailureReason error)
  39. {
  40. OnInitializeFailed(error, null);
  41. }
  42. public void OnInitializeFailed(InitializationFailureReason error, string message)
  43. {
  44. var errorMessage = $"Purchasing failed to initialize. Reason: {error}.";
  45. if (message != null)
  46. {
  47. errorMessage += $" More details: {message}";
  48. }
  49. Debug.Log(errorMessage);
  50. }
  51. public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
  52. {
  53. //Retrieve the purchased product
  54. var product = args.purchasedProduct;
  55. StartCoroutine(BackEndValidation(product));
  56. //We return Pending, informing IAP to keep the transaction open while we validate the purchase on our side.
  57. return PurchaseProcessingResult.Pending;
  58. }
  59. public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason)
  60. {
  61. Debug.Log($"Purchase failed - Product: '{product.definition.id}', PurchaseFailureReason: {failureReason}");
  62. }
  63. public void OnPurchaseFailed(Product product, PurchaseFailureDescription failureDescription)
  64. {
  65. Debug.Log($"Purchase failed - Product: '{product.definition.id}'," +
  66. $" Purchase failure reason: {failureDescription.reason}," +
  67. $" Purchase failure details: {failureDescription.message}");
  68. }
  69. IEnumerator BackEndValidation(Product product)
  70. {
  71. m_ProcessingPurchasesCount++;
  72. UpdateUI();
  73. //Mock backend validation. Here you would call your own backend and wait for its response.
  74. //If the app is closed during this time, ProcessPurchase will be called again for the same purchase once the app is opened again.
  75. yield return MockServerSideValidation(product);
  76. m_ProcessingPurchasesCount--;
  77. UpdateUI();
  78. Debug.Log($"Confirming purchase of {product.definition.id}");
  79. //Once we have done the validation in our backend, we confirm the purchase.
  80. m_StoreController.ConfirmPendingPurchase(product);
  81. //We can now add the purchased product to the players inventory
  82. if (product.definition.id == goldProductId)
  83. {
  84. AddGold();
  85. }
  86. }
  87. YieldInstruction MockServerSideValidation(Product product)
  88. {
  89. const int waitSeconds = 3;
  90. Debug.Log($"Purchase Pending, Waiting for confirmation for {waitSeconds} seconds - Product: {product.definition.id}");
  91. return new WaitForSeconds(waitSeconds);
  92. }
  93. void AddGold()
  94. {
  95. m_GoldCount++;
  96. UpdateUI();
  97. }
  98. void UpdateUI()
  99. {
  100. GoldCountText.text = $"Your Gold: {m_GoldCount}";
  101. ProcessingPurchasesCountText.text = "";
  102. for (var i = 0; i < m_ProcessingPurchasesCount; i++)
  103. {
  104. ProcessingPurchasesCountText.text += "Purchase Processing...\n";
  105. }
  106. }
  107. }
  108. }