guys i have the same issue… working very cool in editor but not in phone apk. i have created seaprate project and tried not working… one week before i tried with separate project and that worls both in phone and editor after that i have implemented in my project also it worked but suddenly it stops working i didnt add or remove anything in the project. yesterday it works upto noon after that i added player prefs after that its not working and now i removed all my own code and done in new project even then it is not working. i tried with debug and checked yesterday i had an error purchasing initialisation is not correct but i didnt initialize anything i just copied from unity IAP tutorial tats it then i added my few codes after that debug mode also not workig
my code:
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Purchasing;
// Deriving the Purchaser class from IStoreListener enables it to receive messages from Unity Purchasing.
using UnityEngine.UI;
public class Purchaser : MonoBehaviour, IStoreListener
{
private static IStoreController m_StoreController; // The Unity Purchasing system.
private static IExtensionProvider m_StoreExtensionProvider; // The store-specific Purchasing subsystems.
public static string kProductIDConsumable = “100”;
public static string kProductIDNonConsumable = “200”;
public static string kProductIDSubscription = “subscription”;
// Apple App Store-specific product identifier for the subscription product.
private static string kProductNameAppleSubscription = “com.unity3d.subscription.new”;
// Google Play Store-specific product identifier subscription product.
private static string kProductNameGooglePlaySubscription = “com.unity3d.subscription.original”;
public int goldBar;
public static int goldBarStore;
public Text goldBarAmount;
public Button goldBarButton;
void Start()
{
// If we haven’t set up the Unity Purchasing reference
if (m_StoreController == null)
{
// Begin to configure our connection to Purchasing
InitializePurchasing();
}
}
public void Update()
{
CheckGoldBar ();
CheckGoldBarLess ();
goldBarAmount.text = PlayerPrefs.GetInt(“GoldBar :”,goldBarStore).ToString();
}
public void InitializePurchasing()
{
// If we have already connected to Purchasing …
if (IsInitialized())
{
// … we are done here.
return;
}
// Create a builder, first passing in a suite of Unity provided stores.
var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
// Add a product to sell / restore by way of its identifier, associating the general identifier
// with its store-specific identifiers.
builder.AddProduct(kProductIDConsumable, ProductType.Consumable);
// Continue adding the non-consumable product.
builder.AddProduct(kProductIDNonConsumable, ProductType.NonConsumable);
// And finish adding the subscription product. Notice this uses store-specific IDs, illustrating
// if the Product ID was configured differently between Apple and Google stores. Also note that
// one uses the general kProductIDSubscription handle inside the game - the store-specific IDs
// must only be referenced here.
builder.AddProduct(kProductIDSubscription, ProductType.Subscription, new IDs(){
{ kProductNameAppleSubscription, AppleAppStore.Name },
{ kProductNameGooglePlaySubscription, GooglePlay.Name },
});
// Kick off the remainder of the set-up with an asynchrounous call, passing the configuration
// and this class’ instance. Expect a response either in OnInitialized or OnInitializeFailed.
UnityPurchasing.Initialize(this, builder);
}
private bool IsInitialized()
{
// Only say we are initialized if both the Purchasing references are set.
return m_StoreController != null && m_StoreExtensionProvider != null;
}
public void BuyConsumable()
{
BuyProductID(kProductIDConsumable);
}
public void BuyNonConsumable()
{
BuyProductID(kProductIDNonConsumable);
}
public void BuySubscription()
{
BuyProductID(kProductIDSubscription);
}
void BuyProductID(string productId)
{
// If Purchasing has been initialized …
if (IsInitialized())
{
Product product = m_StoreController.products.WithID(productId);
// If the look up found a product for this device’s store and that product is ready to be sold …
if (product != null && product.availableToPurchase)
{
Debug.Log(string.Format(“Purchasing product asychronously: ‘{0}’”, product.definition.id));
m_StoreController.InitiatePurchase(product);
}
// Otherwise …
else
{
// … report the product look-up failure situation
Debug.Log(“BuyProductID: FAIL. Not purchasing product, either is not found or is not available for purchase”);
}
}
// Otherwise …
else
{
// … report the fact Purchasing has not succeeded initializing yet. Consider waiting longer or
// retrying initiailization.
Debug.Log(“BuyProductID FAIL. Not initialized.”);
}
}
public void RestorePurchases()
{
// If Purchasing has not yet been set up …
if (!IsInitialized())
{
// … report the situation and stop restoring. Consider either waiting longer, or retrying initialization.
Debug.Log(“RestorePurchases FAIL. Not initialized.”);
return;
}
// If we are running on an Apple device …
if (Application.platform == RuntimePlatform.IPhonePlayer ||
Application.platform == RuntimePlatform.OSXPlayer)
{
// … begin restoring purchases
Debug.Log(“RestorePurchases started …”);
// Fetch the Apple store-specific subsystem.
var apple = m_StoreExtensionProvider.GetExtension();
// Begin the asynchronous process of restoring purchases. Expect a confirmation response in
// the Action below, and ProcessPurchase if there are previously purchased products to restore.
apple.RestoreTransactions((result) => {
// The first phase of restoration. If no more responses are received on ProcessPurchase then
// no purchases are available to be restored.
Debug.Log("RestorePurchases continuing: " + result + “. If no further messages, no purchases available to restore.”);
});
}
// Otherwise …
else
{
// We are not running on an Apple device. No work is necessary to restore purchases.
Debug.Log("RestorePurchases FAIL. Not supported on this platform. Current = " + Application.platform);
}
}
//
// — IStoreListener
//
public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
// Purchasing has succeeded initializing. Collect our Purchasing references.
Debug.Log(“OnInitialized: PASS”);
// Overall Purchasing system, configured with products for this application.
m_StoreController = controller;
// Store specific subsystem, for accessing device-specific store features.
m_StoreExtensionProvider = extensions;
}
public void OnInitializeFailed(InitializationFailureReason error)
{
// Purchasing set-up has not succeeded. Check error for reason. Consider sharing this reason with the user.
Debug.Log(“OnInitializeFailed InitializationFailureReason:” + error);
}
public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
{
// A consumable product has been purchased by this user.
if (String.Equals(args.purchasedProduct.definition.id, kProductIDConsumable, StringComparison.Ordinal))
{
Debug.Log(string.Format(“ProcessPurchase: PASS. Product: ‘{0}’”, args.purchasedProduct.definition.id));
Debug.Log (“100”);
int.TryParse(goldBarAmount.text, out goldBar);
goldBarAmount.text = goldBar.ToString();
goldBarStore = goldBar + 5;
PlayerPrefs.SetInt (“GoldBar :”, goldBarStore);
Debug.Log (“100BAck”);
// The consumable item has been successfully purchased, add 100 coins to the player’s in-game score.
}
// Or … a non-consumable product has been purchased by this user.
else if (String.Equals(args.purchasedProduct.definition.id, kProductIDNonConsumable, StringComparison.Ordinal))
{
Debug.Log(string.Format(“ProcessPurchase: PASS. Product: ‘{0}’”, args.purchasedProduct.definition.id));
Debug.Log (“200”);
int.TryParse(goldBarAmount.text, out goldBar);
goldBarAmount.text = goldBar.ToString();
goldBarStore = goldBar + 10;
PlayerPrefs.SetInt (“GoldBar :”, goldBarStore);
Debug.Log (“200back”);
// TODO: The non-consumable item has been successfully purchased, grant this item to the player.
}
// Or … a subscription product has been purchased by this user.
else if (String.Equals(args.purchasedProduct.definition.id, kProductIDSubscription, StringComparison.Ordinal))
{
Debug.Log(string.Format(“ProcessPurchase: PASS. Product: ‘{0}’”, args.purchasedProduct.definition.id));
// TODO: The subscription item has been successfully purchased, grant this to the player.
}
// 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));
}
// 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.Complete;
}
public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason)
{
// A product purchase attempt did not succeed. Check failureReason for more detail. Consider sharing
// this reason with the user to guide their troubleshooting actions.
Debug.Log(string.Format(“OnPurchaseFailed: FAIL. Product: ‘{0}’, PurchaseFailureReason: {1}”, product.definition.storeSpecificId, failureReason));
}
public void GoldBarReduce()
{
int.TryParse(goldBarAmount.text, out goldBar);
goldBarAmount.text = goldBar.ToString();
goldBarStore = goldBar - 1;
PlayerPrefs.SetInt (“GoldBar :”, goldBarStore);
}
public void CheckGoldBar()
{
if (PlayerPrefs.GetInt (“GoldBar :”) >= 1) {
goldBarButton.interactable = true;
}
}
public void CheckGoldBarLess()
{
if (PlayerPrefs.GetInt (“GoldBar :”) == 0)
{
goldBarButton.interactable = false;
}
}
}