Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

Unity IAP Weird Stuck Transactions Not Finishing

Discussion in 'Unity IAP' started by ernesb, Feb 8, 2018.

  1. ernesb

    ernesb

    Joined:
    Feb 12, 2017
    Posts:
    32
    Hello,

    I'm having a problem with Unity IAP 1.15.0 and IOS 10.3
    The problem is some particular non consumable product gets triggered over and over again, at the moment with the iap product stuck this repro steps below would always trigger this issue.

    Let's say that the consumable iap is IAP_A and non consumable is IAP_B

    Here is the steps:
    1. Install App
    2. Purchase IAP_A, transactions finished (Log showed that the transaction for this id did finish)
    3. Relaunch App
    4. ProcessPurchase gets triggered for this IAP_B, with transactionID X (it gets stuck)

    Even when reinstalling the app and following the above steps, would still get the same product.transactionID X.

    This might be because we're using PurchaseProcessingResult.Pending because we have our own server side validation. I've seen the docs on https://docs.unity3d.com/Manual/UnityIAPProcessingPurchases.html that Pending purchase will call process purchase on the next application launch, so far the docs looks correct.

    But even when this purchase gets triggered, and we tried to fix it by returning it with PurchaseProcessingResult.Complete, it still will be triggered on the next purchase.

    So far we tried
    1. Returning Complete on the next relaunch app, when ProcessPurchase triggered with IAP_B
    2. Confirming pending purchase with IStoreController.ConfirmingPendingPurchase, not on the same function but on a different frame, we've seen some thread with people having problem with ConfirmingPendingPurchase inside ProcessPurchase

    But this IAP_B status so far is not finished and will keep triggering over and over again.

    Purchasing this non consumable id is showing the normal iap prompt "You already purchase this item, should we restore?" and gets process purchase with a new transactionID XY. But after purchasing IAP_A and restore the app again, transactionID X still gets triggered

    We use Facebook SDK for iap logging and admob for showing ads, might be related from the issue stated on https://forum.unity.com/threads/unity-iap-faqs.388069/ No. 18, but we're not sure yet.

    Any particular Idea on how to fix this?
     
  2. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    Can you clarify, how is ProcessPurchase being triggered for IAP_B, was it purchased previously and/or being purchased now?
     
  3. ernesb

    ernesb

    Joined:
    Feb 12, 2017
    Posts:
    32
    Our guess that it was triggered by normal purchase previously on the old app version, but never finishes the transactions and then it got stuck.

    Note that fresh install of the app never trigger the IAP_B ProcessPurchase(), only after we purchase IAP_A and IAP_A finish it's transaction, then relaunch the app, IAP_B suddenly get ProcessPurchase() after iap initialization finishes with transaction id say id_123.

    We try to finish this IAP_B but it UnityIAP never log a "Finishing Transaction id_123"
    Then after deleting the app, reinstall, and doing the same repro steps (Purchase IAP_A, finish then relaunch) it will trigger IAP_B ProcessPurchase after iap initialization with the same transaction id id_123
     
  4. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    Sorry, I meant, when/where is IAP_B being purchased originally?
     
  5. ernesb

    ernesb

    Joined:
    Feb 12, 2017
    Posts:
    32
    We don't know when/where for sure, we just know that it gets stuck somewhere/sometime ago. Probably because of internet connection not finishing the purchase or something
    But we know for certain that the purchase happens with the same app id with the one currently being tested.
     
  6. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    I meant, was this product EVER purchased? I'm trying to understand your flow. Are you able to consistently reproduce? Does clearing your Google Play cache help? Generally you would go to the Settings app and tap Apps. Tap the Google Play Store app listed here and long press on 'Storage'. When you release the 'Storage' section, a new screen will appear showing you the 'Clear Cache' and 'Clear Data' buttons for the Google Play Store app
     
  7. ernesb

    ernesb

    Joined:
    Feb 12, 2017
    Posts:
    32
    No, we never trigger that purchase manually, we only buy IAP_A.
     
  8. ernesb

    ernesb

    Joined:
    Feb 12, 2017
    Posts:
    32
    Yes we could constantly reproduce this issue, as I stated that even when reinstalling this issue still occurs.
    And we say that above (maybe you're missing this) that we're using IOS not Google Play
     
  9. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    Sorry about the Google mention, you clearly did mention iOS, sorry about that. Regarding reproducing, I meant how I might reproduce the issue here. I see you are doing server side validation, so that might be difficult. Regarding consistent, I meant does this happen for every new user? Or is this only occurring for a single user on a single device. Since the user NEVER purchased IAP_B, is your thought that purchasing IAP_A somehow also triggers a partial purchase of IAP_B? This is not behavior that we would be familiar with. I will also check with the IAP team and get their feedback also.
     
    Last edited: Feb 9, 2018
  10. ernesb

    ernesb

    Joined:
    Feb 12, 2017
    Posts:
    32
    Hi Jeff, no problems don't worry about that, we'll get back to you on monday since it's already weekend here,

    Currently we're only testing it on one device and with the same user, we'll try to reproduce with other device and using new user.

    Yes we think that purchasing IAP_A somehow also triggers partial purchase of IAP_B
    What we're wondering is, since the documentation clearly states that "The application is still processing the purchase and ProcessPurchase will be called again the next time the Application starts.", we thought that if we confirm the pending purchase of IAP_B, it would finish the purchase, but Unity_IAP log nevew shows a particular "Finishing transaction xxx" log

    You could probably reproduce using this steps (just a wild guess)
    1. Make a non consumable purchase returned PurchaseProcessingResult.Pending and not confirming it,
    2. Reinstall the test app.
    3. Purchase a consumable on the next install, relaunch app
    4. Hopefully it will trigger the ProcessPurchase of the last pending nonconsumable

    Also we're initializing the product with this sequence

    ConfigurationBuilder builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
    builder.AddProduct("IAP_A", ProductType.Consumable);
    builder.AddProduct("IAP_B", ProductType.NonConsumable);
    builder.AddProduct("IAP_C", ProductType.Subscription);
    UnityPurchasing.Initialize(this, builder);

    Whether the sequence of the product related or not we don't know, we're just adding more information if it could help reproduce this issue
     
  11. engin_gg

    engin_gg

    Joined:
    Dec 9, 2016
    Posts:
    14
    We are currently having a similar issue right now. We were using an old version of Unity Purchasing. On that version we had problems about ProcessPurchase not being called when purchase is interrupted by something like connection loss.

    We updated to latest version. and we saw that UnityPurchasing started to call ProcessPurchase for those stuck purchases. We tried some tests for people if we migrate people from old version to new version and we saw that for new version even we are returning PurchaseProcessingResult.Complete unity sends those purchases every time app starts. And some of the purchases stuck behind them (mostly non-consumables) even we return PurchaseProcessingResult.Complete for them also. When we close and re-open app Unity Purchasing says on the log And when we uninstall and install the app it enters the same loop again, but this time "already recorded transaction {TRANSACTION_NO}". When uninstall and re-install this time ProcessPurchase is being called again like it did before and returning PurchaseProcessingResult.Complete still does not work. I think we are in the same state with ernesb.

    We are using Unity 5.6.5-p1 and latest version of Unity Purchasing (1.16.0) and we were using 1.2.3 before.

    We are trying on iOS 11.0

    Engin
     
    Last edited: Feb 21, 2018
  12. ap-unity

    ap-unity

    Unity Technologies

    Joined:
    Aug 3, 2016
    Posts:
    1,519
  13. ernesb

    ernesb

    Joined:
    Feb 12, 2017
    Posts:
    32
    Hi, @ap-unity I already post to the support ticket system. I didn't get any ticket number though

    Anyway, I tried reproducing the bug with a newly fresh apple sandbox account but on the same device (IOS 10.3), the steps to reproduce it is still the same.

    1. Purchase consumable IAP_A, then purchase non consumable IAP_B. Both transactions looks finished because unity showing "Finishing tracaction xxx"
    2. Reinstall the app
    3. Purchase consumable, this transaction also finished, then kill app
    4. Launch app, non consumable with receipt IAP_B get triggered

    here is the receipt for the nonconsumable
    MgrIAP: Purchase unitynoncon transaction id 1000000378206587 receipt {"Store":"AppleAppStore","TransactionID":"1000000378206587","Payload":"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"}

    Hope anyone from unity would take a look at this since this bug also happens to @engin_gg, we're probably not the only one getting this weird behavior, and more visibility means more eyes taken for this to be resolved
     
    Last edited: Feb 27, 2018
  14. engin_gg

    engin_gg

    Joined:
    Dec 9, 2016
    Posts:
    14
    Hi;

    We did this transaction in sandbox. What we did
    1) install app
    2) open app
    3) start non-consumable transaction
    4) on apple buy screen after click buy cut internet connection
    5) because we clicked buy apple will finish transaction but not on application (no ProcessPurchase callback from Unity Purchasing framework)
    6) we open internet and restart the app, then Unity calls ProcessPurchase and we return ProcessPurchaseResult.Complete .
    7) We close the app and restart it then get the log like: "already recorded transaction {TRANSACTION_NO}". Probablu Unity tries to recover that transaction but in it's own queue it is marked completed (but again probably not on Apple iOS trx queue).
    8) We uninstall and install the game Unity again tries to recover the unfinished transaction non-consumable (probably getting from Apple iOS trx queue) and calls back ProcessPurchase for that non-consumable again in the app during initialization process.


    I stripped down the test code we use to reproduce this problem (it is super simple btw)

    Code (CSharp):
    1. public class Store : IStoreListener
    2. {
    3.  
    4.     public static Store = null;
    5.  
    6.     private static IStoreController m_StoreController;                  // Overall Purchasing system, configured with products for this application.
    7.     private static IExtensionProvider m_StoreExtensionProvider;         // Store specific subsystem, for accessing device-specific store features.
    8.  
    9.  
    10.     public static bool Initialized { get { return m_StoreController != null && m_StoreExtensionProvider != null; } }
    11.  
    12.     public static void Initialize()
    13.     {
    14.         if (Instance == null)
    15.             Instance = new Store();
    16.  
    17.         Instance.InitializeInstance();
    18.     }
    19.  
    20.     private void InitializeInstance()
    21.     {
    22.         if (Initialized)
    23.             return;
    24.  
    25.  
    26.  
    27.         ConfigurationBuilder builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
    28.  
    29.         foreach (PackDef item in PackDef.Definitions)
    30.         {
    31.             builder.AddProduct(item.UnityID, ProductType.Consumable, new IDs() { { item.AppleProductID, AppleAppStore.Name }, { item.GooglePlayProductID, GooglePlay.Name } });
    32.         }
    33.  
    34.         UnityPurchasing.Initialize(Instance, builder);  
    35.  
    36.     }
    37.  
    38.     public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
    39.     {
    40.         m_StoreController = controller;
    41.         m_StoreExtensionProvider = extensions;
    42.  
    43.         // ... (internal stuff)
    44.         // ... (logging etc.)
    45.     }
    46.  
    47.     public void OnInitializeFailed(InitializationFailureReason error)
    48.     {
    49.         // ... (internal stuff)
    50.         // ... (logging etc.)
    51.     }
    52.  
    53.  
    54.     // internal method
    55.     public void StartPurchase(PackDef pack)
    56.     {
    57.         // ... (internal stuff)
    58.  
    59.         Product product = m_StoreController.products.WithID(pack.UnityID);
    60.         if (product != null && product.availableToPurchase)
    61.         {
    62.             // ... (logging etc.)
    63.             m_StoreController.InitiatePurchase(product);
    64.         }
    65.         else
    66.         {
    67.             // ... (logging etc.)
    68.         }
    69.  
    70.         // ... (internal stuff)
    71.     }
    72.  
    73.  
    74.     public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
    75.     {
    76.         // ... (logging etc.)
    77.         // ... (internal stuff)
    78.         return PurchaseProcessingResult.Complete;
    79.     }
    80.  
    81.     public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason)
    82.     {
    83.         // ... (logging etc.)
    84.         // ... (internal stuff)
    85.     }
    86.  
    87.  
    88.  
    89. }

    Our receipt is:

     
    Last edited: Feb 27, 2018
  15. engin_gg

    engin_gg

    Joined:
    Dec 9, 2016
    Posts:
    14
    I also tried to call to call ConfirmPendingPurchase after I returned Complete to
    ProcessPurchase. And also I tried to return Pending on ProcessPurchase and then after that call ConfirmPendingPurchase manually.

    My theory here is there is an synchronization problem between Unity Purchasing transaction queue and Apple's internal transaction queue. My clue is "already recorded transaction {TRANSACTION_NO}" logs during startup. It seems like Apple queue sends some unfinished transactions bu Unity Purchasing thinks that these are completed. But cannot mark the trx on Apple queue as completed and remove it.

    And like @ernesb said probably we are not the only ones. But it is hard do get notified about this problem in wild. People should inform the developer about this is happening. And if user upgraded Unity Purchasing to latest version from panel, it will work fine until you have or artificially create these problems to test. And I think it is really crucial.
     
  16. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    @ernesb, @engin_gg

    Are you able to confirm which iPhone models are affected? Alternatively can you specify which phones you tested with? Does this reproduce on an iPhone 6 for example?
     
  17. ernesb

    ernesb

    Joined:
    Feb 12, 2017
    Posts:
    32
    We tested previously on iPhone 5s (ios 10.3 14E277)

    Today we just reproduced it on iPhone 7 (ios 10.3.3 14G60) and iPhone 6 (ios 10.3.1 14E304)
     
  18. engin_gg

    engin_gg

    Joined:
    Dec 9, 2016
    Posts:
    14
    We tried this on iPhone6s, iPhone7 and couple of iPads and iPad Minis. all are ios 11.
     
  19. ap-unity

    ap-unity

    Unity Technologies

    Joined:
    Aug 3, 2016
    Posts:
    1,519
    That looks like expected behavior. When you re-install the app, all non-consumable purchases are restored.

    Are there any issues in your app when this happens?

    Aside for the notice in the logs, what is the behavior in your app that this affects? Are users still able to make purchases successfully? Is the existing non-consumable restored after the app install?
     
  20. engin_gg

    engin_gg

    Joined:
    Dec 9, 2016
    Posts:
    14
    @ap-unity yes, because ProcessPurchase is being called back every time I reinstall the app and it is being called for both consumable stuck transaction and non-consumables.

    I understand the non-consumables, but as I said this is not expected behavior. First of all stuck transaction is not something we want, I think nobody will want that. Yes it will be only in the logs when we open and close the game ProcessPurchase will not be called again. But as I said, if we uninstall and re-install the game yes ProcessPurchase being called for non-cosumables can be expected, but for consumable purchases that are being stuck in previous installation is not something we want. Because we cannot distinguish if it is a stuck one or a new one. So we are giving the value of the purchase to the user every time they re-install the application. And as I said before returning back Complete or manually calling ConfirmPendingPurchase is not working. That transaction is being kept in Apple's in device queue but it is marked in Unity queue. But in re-install state unity purchasing queue is empty, so it thinks that it should pop the trx from Apple's queue. But again it cannot mark it as Complete in any way. This is a weird behavior.
     
    Last edited: Mar 1, 2018
  21. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    @engin_gg Does this also occur in the Apple TestFlight environment? We will try to reproduce here.
     
  22. engin_gg

    engin_gg

    Joined:
    Dec 9, 2016
    Posts:
    14
    @JeffDUnity3D yes we can reproduce it in both sandbox and production environment.
    Currently I have a device just in this state. Is there any log or something like it that I can collect for you?
     
  23. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    @engin_gg Thank you for the information, our next step is to try to reproduce here.
     
  24. engin_gg

    engin_gg

    Joined:
    Dec 9, 2016
    Posts:
    14
    Hi;
    Any luck on reproducing the problem?
     
  25. ernesb

    ernesb

    Joined:
    Feb 12, 2017
    Posts:
    32
  26. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    We are continuing to work on this, hoping to have more information within the next few days.
     
  27. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    @ernesb @engin_gg It appears we may be discussing two separate issues in this thread. One set of repro steps says the cut the Internet connection so a transaction is left in a pending state, the other does not. Can we get confirmation?
     
  28. ernesb

    ernesb

    Joined:
    Feb 12, 2017
    Posts:
    32
    I can confirm that it is because of pending state, the way of making it into a pending state quickly would be by cutting internet connection
     
  29. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    @ernesb Understood, your 4 steps from above didn't mention pending transactions, so I wanted to confirm. We are still investigating.
     
  30. ernesb

    ernesb

    Joined:
    Feb 12, 2017
    Posts:
    32
  31. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    Apologies on the delay, I have been able to 100% reproduce the following iOS scenario and have let the IAP team know.

    1. Purchase consumable IAP_A, then purchase non consumable IAP_B. Both transactions looks finished because unity showing "Finishing tracaction xxx"
    2. Reinstall the app
    3. Purchase consumable, this transaction also finished, then kill app
    4. Launch app, non consumable with receipt IAP_B get triggered
    5. Subsequent app launches don't receive the ProcessPurchase event mentioned in 4. above

    I have not yet tested the scenario where the Internet connection is cut immediately after the Buy button is selected as the transaction happens too fast. I'll need to use a local router here at the office to quickly kill the connection. I also still need to test the scenario of returning PurchaseProcessingResult.Pending followed by ConfirmPendingPurchase. My hope is that these scenarios are related. I will keep this thread updated.
     
    Last edited: Mar 30, 2018
  32. engin_gg

    engin_gg

    Joined:
    Dec 9, 2016
    Posts:
    14
    Hi;

    as I said earlier upgrading 1.16.0 solved 1 problem and caused another one. I can confirm that I can reproduce that bug on every ios device we have. I’ve tried nearly 10 of them. I could reproduce in all of them. So it sounds weird after all this time you could not reporoduce this issue.

    Then I saw that there was a 1.17.0 release. So I give it a shot, and yes. It solved the issue. So it confirms that there is something buggy in 1.16.0 and solved in 1.17.0 (even it is nor written in changelog).

    I saw that now 1.18.0 released. It seems like 1.17.0 is a stable version at least for us. And right now I cannot be sure to upgrade newer versions because as we can see it can be broken randomly, nobody can reporoduce it on unity side somehow and could not get help about it. I was mostly on positive side with UnityIAP but this experince made me think about it again.

    Thanks for your support even if it did not solve the problem within this thread, at least you seem like you tried @JeffDUnity3D .
     
  33. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    @engin_gg It seems you misread my post. I was indeed able to reproduce this issue, and the IAP team is now investigating. Hopefully it will be fixed soon!
     
    Last edited: Mar 30, 2018
  34. ernesb

    ernesb

    Joined:
    Feb 12, 2017
    Posts:
    32
    @JeffDUnity3D any ETA for this? we've already wait long enough for any fix that could be released on next iap version
     
  35. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    @ernesb The IAP team is actively working on this issue at high priority, I will try to get an update this week.
     
  36. ernesb

    ernesb

    Joined:
    Feb 12, 2017
    Posts:
    32
    @JeffDUnity3D no news? please don't tell me that if its still on highest priority while in reality it's not fixed yet
     
  37. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    @ernesb Yes, that is correct. We are still working on it.
     
  38. govind

    govind

    Joined:
    Nov 28, 2017
    Posts:
    2
    @JeffDUnity3D Any update on this. returning PurchaseProcessingResult.Pending followed by ConfirmPendingPurchase is not working.
     
  39. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    @govind I have confirmed that returning PurchaseProcessingResult.Pending followed by ConfirmPendingPurchase is working as expected using IAP 1.18. I have created this test project that I used for my testing. I purchase an item and return Pending, then several seconds later call ConfirmPendingPurchase. When I relaunch the app, I do not see any ProcessPurchase calls. If I don't call ConfirmPendingPurchase, I continue to see ProcessPurchase each time on launch. Can you identify a flow that I may have missed that would result in the behavior that you are seeing? If anyone is continuing to see "stuck transactions", please provide device logs as described in the post https://forum.unity.com/threads/sample-iap-project.529555/
     
  40. ncortesp

    ncortesp

    Joined:
    Oct 28, 2016
    Posts:
    42
    I'm having issues as the users above. Here's the workflow I'm following.

    Note:
    ========================================================
    All my products are consumables, and I've also a ServerSide Validation.
    I've tested it just with Sandbox.
    I've the last IAP version (1.18.0).
    ========================================================

    I purchase a product, when It says it has been purchase I return PurchaseProcessingResult.Pending, then I send the product receipt to my Backend which validates with the store if the receipt i'm sending is correct or not. Let's suppose I get a 200 StatusCode (that's what is happening) from my Backend. Now I ConfirmPendingPurchase, and I give the coins to the user.

    I close my app.

    When I reload the application it says that there is a PurchaseToBeRestored, which I had ConfirmPendingPurchase previously (I've seen it in my logs, otherwise I could not give the coins to the user). I don't get it, it just happens to me with iOS, works perfect with Android.

    The stranger thing is that the product that it says that needs to be restored, it's free to be purchased, so I can buy it again and again no matter what.

    I think that's an IAP problem, otherwise I'd like to know how can I fix it. I could ask my Backend to create a new Endpoint and validate previously if the TransactionID i'm given, has been redeemed previously, this way I can ignore it knowing it's an error from the IAP.

    In this function is where I do notice about that, (hope it helps);

    Code (CSharp):
    1. public void OnInitialized (IStoreController controller, IExtensionProvider extensions)
    2.     {
    3.         // Purchasing has succeeded initializing. Collect our Purchasing references.
    4.  
    5.         // Overall Purchasing system, configured with products for this application
    6.         m_StoreController = controller;
    7.  
    8.         // Store specific subsystem, for accessing device-specific store features
    9.         m_StoreExtensionProvider = extensions;
    10.         m_AppleExtensions = extensions.GetExtension<IAppleExtensions>();
    11.  
    12.         // On Apple platforms we need to handle deferred purchases caused by Apple's Ask to Buy feature.
    13.         // On non-Apple platforms this will have no effect; OnDeferred will never be called.
    14.         m_AppleExtensions.RegisterPurchaseDeferredListener(OnDeferred);
    15.  
    16.         foreach (var item in controller.products.all)
    17.         {
    18.             if (item.availableToPurchase)
    19.             {
    20.                 SGO.Log (string.Join (" - ", new[] {
    21.                     item.metadata.localizedTitle,
    22.                     item.metadata.localizedDescription,
    23.                     item.metadata.isoCurrencyCode,
    24.                     item.metadata.localizedPrice.ToString (),
    25.                     item.metadata.localizedPriceString,
    26.                     item.transactionID,
    27.                     item.receipt
    28.                 }));
    29.             }
    30.         }
    31. }
    Those logs are the ones that show me that there are pendingPurchases.

    I think that you can reproduce it @JeffDUnity3D.

    Greetings,
    Nacho.
     
  41. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    @icortesp Please provide the corresponding logs. Yes, my test was specific to Android. When you say reload your app, are you reinstalling? If so, then yes, there would be a message that products need to be restored. You mentioned "I can buy it again and again", this would be expected behavior for consumables.
     
  42. ncortesp

    ncortesp

    Joined:
    Oct 28, 2016
    Posts:
    42
    Code (CSharp):
    1. 2018-05-03 18:25:46.255921+0200 deluxe[2481:3105863] UnityIAP:Requesting 6 products
    2. 2018-05-03 18:25:46.259340+0200 deluxe[2481:3105863] UnityIAP:Requesting product data...
    3. 2018-05-03 18:25:47.279043+0200 deluxe[2481:3105863] UnityIAP:Received 6 products
    4. <b><color=yellow>[18:25:47]</color></b> Cofre de Oro - Un cofre de oro que contiene un montón de mon - EUR - 49.99 - 49,99-  -
    5. SGOLibrary.SGO:Log(Object, SGOColor)
    6. Purchaser:OnInitialized(IStoreController, IExtensionProvider)
    7. UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
    8. UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
    9. UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
    10. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    11. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    12.  
    13. <b><color=yellow>[18:25:47]</color></b> Cofre de Plata - Un cofre de plata que contiene un montón de m - EUR - 24.99 - 24,99-  -
    14. SGOLibrary.SGO:Log(Object, SGOColor)
    15. Purchaser:OnInitialized(IStoreController, IExtensionProvider)
    16. UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
    17. UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
    18. UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
    19. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    20. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    21.  
    22. <b><color=yellow>[18:25:47]</color></b> Cofre de Bronce - Un cofre de bronce que contiene un montón de - EUR - 9.99 - 9,99-  -
    23. SGOLibrary.SGO:Log(Object, SGOColor)
    24. Purchaser:OnInitialized(IStoreController, IExtensionProvider)
    25. UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
    26. UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
    27. UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
    28. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    29. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    30.  
    31. <b><color=yellow>[18:25:47]</color></b> Caldero - Un caldero con un montón de monedas - EUR - 4.99 - 4,99-  -
    32. SGOLibrary.SGO:Log(Object, SGOColor)
    33. Purchaser:OnInitialized(IStoreController, IExtensionProvider)
    34. UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
    35. UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
    36. UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
    37. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    38. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    39.  
    40. <b><color=yellow>[18:25:47]</color></b> Marmita - Marmita que contiene un montón de monedas - EUR - 1.99 - 1,99- 1000000395712493 - {"Store":"AppleAppStore","TransactionID":"1000000395712493","Payload":"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"}
    41. SGOLibrary.SGO:Log(Object, SGOColor)
    42. Purchaser:OnInitialized(IStoreController, IExtensionProvider)
    43. UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
    44. UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
    45. UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
    46. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    Each time I purchase the Marmita product successfully (with ConfirmedPendingPurchase) I close my app, and then I reopen it (not reinstalling). What I see is that there is still a pending transaction on this product (that's what the logs says), with the transactionID of the last purchase attached.

    Does it helps you? @JeffDUnity3D.

    Greetings,
    Nacho.
     
  43. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    @icortesp What line in the logs above show the pending transaction? I'm seeing some HTML in the log post, and wanted to confirm.
     
  44. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    FYI I'm testing on iOS now using my same sample app listed above, and will report my findings.
     
  45. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
  46. ncortesp

    ncortesp

    Joined:
    Oct 28, 2016
    Posts:
    42
    I'll show you my code;

    Code (CSharp):
    1.  
    2. public class Purchaser : MonoBehaviour, IStoreListener
    3. {
    4.     private static Purchaser _instance = null;
    5.     public static Purchaser instance
    6.     {
    7.         get
    8.         {
    9.             if (_instance == null)
    10.             {
    11.                 GameObject pGO = Instantiate (Resources.Load ("PrefabsSGO/Purchaser", typeof(GameObject))) as GameObject;
    12.                 pGO.name = "Purchaser";
    13.             }
    14.             return _instance;
    15.         }
    16.     }
    17.     public static PurchaseToken purchaseToken;
    18.     public static ProductCoins productCoins;
    19.     public static bool selectedProduct = false;
    20.     private Product product;
    21.     private Dictionary <string, Product> _pendingProducts = new Dictionary<string, Product> ();
    22.  
    23.     private static IStoreController m_StoreController; // The Unity Purchasing system
    24.     private static IExtensionProvider m_StoreExtensionProvider; // The store-specific Purchasing subsystems
    25.     private static IAppleExtensions m_AppleExtensions;
    26.  
    27.     public bool m_PurchaseInProgress = false;
    28.     private bool interactable;
    29.  
    30.     private string _kProductNameLoyalty;
    31.     private string _kProductNameBag;
    32.     private string _kProductNameSack;
    33.     private string _kProductNameBronzeChest;
    34.     private string _kProductNameSilverChest;
    35.     private string _kProductNameGoldChest;
    36.  
    37.     private Dictionary <string, int> _rateConversion;
    38.  
    39.     void Awake ()
    40.     {
    41.         if (_instance == null)
    42.         {
    43.             DontDestroyOnLoad (gameObject);
    44.             _instance = this;
    45.         }
    46.         else if (_instance != this)
    47.             Destroy (gameObject);
    48.     }
    49.  
    50.     void Start ()
    51.     {
    52.         Initialize ();
    53.     }
    54.  
    55.     public void Initialize ()
    56.     {
    57.         _kProductNameLoyalty = GameManager.instance.settings.store.products[0].id + "_" + GameManager.instance.gameName;
    58.         _kProductNameBag = GameManager.instance.settings.store.products[1].id + "_" + GameManager.instance.gameName;
    59.         _kProductNameSack = GameManager.instance.settings.store.products[2].id + "_" + GameManager.instance.gameName;
    60.         _kProductNameBronzeChest = GameManager.instance.settings.store.products[3].id + "_" + GameManager.instance.gameName;
    61.         _kProductNameSilverChest = GameManager.instance.settings.store.products[4].id + "_" + GameManager.instance.gameName;
    62.         _kProductNameGoldChest = GameManager.instance.settings.store.products[5].id + "_" + GameManager.instance.gameName;
    63.  
    64.         // If we haven't set up the Unity Purchasing reference
    65.         if (m_StoreController == null)
    66.         {
    67.             InitializePurchasing ();
    68.         }
    69.     }
    70.  
    71.     public void InitializePurchasing ()
    72.     {
    73.         var module = StandardPurchasingModule.Instance ();
    74.  
    75.         // If we have already connected to Purchasing...
    76.         if (IsInitialized ())
    77.         {
    78.             //... we are done here.
    79.             return;
    80.         }
    81.  
    82.         // Create a builder, first passing in a suite of Unity provided stores
    83.         ConfigurationBuilder builder = ConfigurationBuilder.Instance(module);
    84.  
    85.         // TODO: To keep the public key safe from malicious users do not embed as a literal string.
    86.         // Instead, construct the string at runtime from pieces or use bit manipulation - for example XOR with some other string - to hide the actual key.
    87.         builder.Configure<IGooglePlayConfiguration> ().SetPublicKey ("PUBLIC_KEY_HERE");
    88.         m_IsGooglePlayStoreSelected = Application.platform == RuntimePlatform.Android && module.appStore == AppStore.GooglePlay;
    89.  
    90.         // Add a product to sell / restore by way of its identifier, associating the general identifier
    91.         // with its store-specific identifiers.
    92.         // All our products have the same identifier across iTunes App store and Google Play.
    93.         builder.AddProduct (_kProductNameGoldChest,  ProductType.Consumable);
    94.         builder.AddProduct (_kProductNameSilverChest,  ProductType.Consumable);
    95.         builder.AddProduct (_kProductNameBronzeChest,  ProductType.Consumable);
    96.         builder.AddProduct (_kProductNameSack,  ProductType.Consumable);
    97.         builder.AddProduct (_kProductNameBag,  ProductType.Consumable);
    98.         builder.AddProduct (_kProductNameLoyalty,  ProductType.Consumable);
    99.  
    100.         // Kick off the remainder of the set-up with an asynchrounous call, passing the configuration
    101.         // and this class' instance.
    102.         // Expect a response either in OnInitialized or OnInitializeFailed.
    103.         UnityPurchasing.Initialize(this, builder);
    104.     }
    105.  
    106.     private void OnTransactionRestored (bool success) { SGO.Log ("OnTransactionRestore..."); }
    107.  
    108.     private bool IsInitialized ()
    109.     {
    110.         return m_StoreController != null && m_StoreExtensionProvider != null;
    111.     }
    112.  
    113.     private IEnumerator InitPurchase (SelectedProduct selectedProduct, Product product)
    114.     {
    115.         // ... Internal Stuff, we ask for a token to our Backend.
    116.         m_StoreController.InitiatePurchase (product, purchaseToken.purchaseToken);
    117.     }
    118.  
    119.     private IEnumerator ValidatePurchase (PurchaseResult purchaseResult)
    120.     {
    121.         // ... Validating purchase with our Backend.
    122.         // ... Internal Stuff popup, animations...
    123.  
    124.         if (string.IsNullOrEmpty (purchaseResult.receipt.TransactionID))
    125.         {
    126.             // We must not get in here.
    127.             selectedProduct = false;
    128.             yield break;
    129.         }
    130.         else
    131.         {
    132.             SGO.Log ("ConfirmingPendingPurchase... " + product.definition.id + " liberando el producto...");
    133.             m_StoreController.ConfirmPendingPurchase (product);
    134.         }
    135.  
    136.         // ... Internal Stuff such giving coins to the user...
    137.     }
    138.  
    139.     void BuyProductID (string productId)
    140.     {
    141.         // If Purchasing has been initialized...
    142.         if (IsInitialized () && !selectedProduct) {
    143.             //...look up the Product reference with the general product identifier and the Purchasing
    144.             // system's prodicts collection
    145.             selectedProduct = true;
    146.             product = m_StoreController.products.WithID (productId);
    147.  
    148.             // If the look up found a product for this device's store and that product is ready to be sold...
    149.             if (product != null && product.availableToPurchase)
    150.             {
    151.                 // ... Internal Stuff.
    152.  
    153.                 StartCoroutine (InitPurchase (selectedProduct, product));
    154.             }
    155.             // Otherwise...
    156.             else
    157.             {
    158.                 //... report the product look-up failure situation
    159.             }
    160.  
    161.         }
    162.         // Otherwise...
    163.         else
    164.         {
    165.             //... report the fact Purchasing has not succeeded initializing yet. Consider waiting longer or
    166.             // retrying initialization
    167.         }
    168.     }
    169.  
    170.     /// <summary>
    171.     ///  Our IStoreListener implementation of OnInitialized
    172.     ///  Called when Unity IAP is ready to make purchases
    173.     /// This will be called when Unity IAP has finished initialising
    174.     /// </summary>
    175.     public void OnInitialized (IStoreController controller, IExtensionProvider extensions)
    176.     {
    177.         // Purchasing has succeeded initializing. Collect our Purchasing references.
    178.  
    179.         // Overall Purchasing system, configured with products for this application
    180.         m_StoreController = controller;
    181.  
    182.         //        SGO.Log ("Products: " + controller.products.all.Length);
    183.         // Store specific subsystem, for accessing device-specific store features
    184.         m_StoreExtensionProvider = extensions;
    185.         m_AppleExtensions = extensions.GetExtension<IAppleExtensions>();
    186.  
    187.         // On Apple platforms we need to handle deferred purchases caused by Apple's Ask to Buy feature.
    188.         // On non-Apple platforms this will have no effect; OnDeferred will never be called.
    189.         m_AppleExtensions.RegisterPurchaseDeferredListener(OnDeferred);
    190.  
    191.         foreach (var item in controller.products.all)
    192.         {
    193.             if (item.availableToPurchase)
    194.             {
    195.                 SGO.Log (string.Join (" - ", new[] {
    196.                     item.metadata.localizedTitle,
    197.                     item.metadata.localizedDescription,
    198.                     item.metadata.isoCurrencyCode,
    199.                     item.metadata.localizedPrice.ToString (),
    200.                     item.metadata.localizedPriceString,
    201.                     item.transactionID,
    202.                     item.receipt
    203.                 }));
    204.  
    205.                 if (!string.IsNullOrEmpty ((string) item.transactionID))
    206.                     _pendingProducts.Add (item.transactionID, item);
    207.             }
    208.         }
    209.  
    210.         m_AppleExtensions.RestoreTransactions (result =>
    211.         {
    212.             if (result)
    213.             {
    214.                 SGO.Log ("Restore Transactions :: Succeed");
    215.  
    216.                 if (Application.platform == RuntimePlatform.IPhonePlayer ||
    217.                     Application.platform == RuntimePlatform.OSXPlayer)
    218.                 {
    219.                     SGO.Log ("Apple Transactions");
    220.                     StartCoroutine (RestorePurchases ());
    221.                 }
    222.  
    223.                 // This does not mean anything was restored,
    224.                 // merely that the restoration process succeeded
    225.             }
    226.             else
    227.             {
    228.                 SGO.Log ("Restore Transactions :: Failed");
    229.                 // Restoration failed
    230.             }
    231.         });
    232.     }
    233.  
    234.     public IEnumerator RestorePurchases()
    235.     {
    236.         foreach (var item in _pendingProducts)
    237.         {
    238.             if (item.Value.availableToPurchase)
    239.             {
    240.                 // ... Internal Stuff
    241.  
    242.                 if (ProductExists (item.Value.definition.id))
    243.                 {
    244.                     // ... Validate Purchase with our Backend
    245.                 }
    246.                 else
    247.                 {
    248.                     SGO.Log ("Product not found!");
    249.                 }
    250.             }
    251.  
    252.             _pendingProducts = new Dictionary <string, Product> ();
    253.         }
    254.     }
    255.        
    256.     public void OnInitializeFailed (InitializationFailureReason error)
    257.     {
    258.         SGO.Log ("OnInitializedFailed...");
    259.         // Purchasing set-up has not succeeded. Check error for reason. Consider sharing this reason with the user.
    260.     }
    261.  
    262.     public bool ProductExists (string productId)
    263.     {
    264.         return _rateConversion.ContainsKey (productId);
    265.     }
    266.  
    267.     private string GetDeveloperPayloadFromReceipt (string receipt)
    268.     {
    269.         SGO.Log ("GetDeveloperPayloadFromReceipt...");
    270.         string developerPayload = "";
    271.  
    272.         var wrapper = (Dictionary<string, object>) MiniJson.JsonDecode (receipt);
    273.  
    274.         var store = (string) wrapper ["Store"];
    275.         var payload = (string) wrapper ["Payload"]; // For Apple this will be the base64 encoded ASN.1 receipt
    276.  
    277.         // For GooglePlay payload contains more JSON
    278.         if (Application.platform == RuntimePlatform.Android)
    279.         {
    280.             var gpDetails = (Dictionary<string, object>) MiniJson.JsonDecode (payload);
    281.             var gpJson = (string) gpDetails ["json"];
    282.             var gpDeveloperPayload = (Dictionary<string, object>) MiniJson.JsonDecode (gpJson);
    283.  
    284.             developerPayload = (string) gpDeveloperPayload ["developerPayload"];
    285.         }
    286.  
    287.         return developerPayload;
    288.     }
    289.  
    290.     public void FinishPurchaseProcessingResult (PurchaseEventArgs args)
    291.     {
    292.         SGO.Log ("FinishPurchaseProcessingResult ..." + args.purchasedProduct.definition.id);
    293.  
    294.         // ... Internal Stuff
    295.  
    296.         if (ProductExists (args.purchasedProduct.definition.id))
    297.         {
    298.             // ... Validating Product with our Backend.
    299.         }
    300.         else
    301.         {
    302.             SGO.Log ("Product not found!");
    303.         }
    304.     }
    305.  
    306.     /// <summary>
    307.     /// Called when a purchase completes.
    308.     ///
    309.     /// May be called at any time after OnInitialized()
    310.     /// </summary>
    311.     public PurchaseProcessingResult ProcessPurchase (PurchaseEventArgs args)
    312.     {
    313.         if (Application.platform == RuntimePlatform.Android)
    314.         {
    315.             string token = GetDeveloperPayloadFromReceipt (args.purchasedProduct.receipt);
    316.             SGO.Log ("GettingDeveloperPayload... ");
    317.  
    318.             if (purchaseToken == null) // Restaurando transacción.
    319.             {
    320.                 // Hay que cerrar la transacción siempre con token, ya que las facturas de Android incorporan **DeveloperPayload**.
    321.                 // Aquí nunca debería entrar.
    322.                 if (string.IsNullOrEmpty (token))
    323.                 {
    324.                     SGO.Log ("ERROR :: Liberamos el producto porque no hay token en Android");
    325.                     selectedProduct = false;
    326.                     m_PurchaseInProgress = false;
    327.                     return PurchaseProcessingResult.Complete;
    328.                 }
    329.                 else
    330.                 {
    331.                     // ... Internal Stuff
    332.  
    333.                     SGO.Log ("Finalizamos una compra restaurada de Android con token: " + token);
    334.                     FinishPurchaseProcessingResult (args);
    335.                 }
    336.             }
    337.             else // Compra directa sin error.
    338.             {
    339.                 SGO.Log ("Finalizamos compra de Android");
    340.                 FinishPurchaseProcessingResult (args);
    341.             }
    342.         }
    343.         else if (Application.platform == RuntimePlatform.IPhonePlayer || Application.platform == RuntimePlatform.OSXPlayer)
    344.         {
    345.             SGO.Log ("Finalizamos compra de Apple");
    346.             FinishPurchaseProcessingResult (args);
    347.         }
    348.         else
    349.         {
    350.             SGO.Log ("Finalizamos compra de ¿¿¿???");
    351.             FinishPurchaseProcessingResult (args);
    352.         }
    353.  
    354.         // Return a flag indicating whether this product has completely been received, or if the application needs
    355.         // to be reminded of this purchase at next app launch. Use PurchaseProcessingResult.Pending when still
    356.         // saving purchased products to the cloud, and when that save is delayed.
    357.  
    358.         // ENVIAR EL RECEIPT AL BACKEND Y QUAN ARRIBI LA RESPOSTA, POSAR EL PROCESSINGRESULT A COMPLETE.
    359.         //return PurchaseProcessingResult.Pending;
    360.         SGO.Log ("PurchaseProcessingResult.Pending");
    361.         return PurchaseProcessingResult.Pending;
    362.     }
    363.  
    364.     /// <summary>
    365.     /// Called when a purchase fails
    366.     /// </summary>
    367.     public void OnPurchaseFailed (Product product, PurchaseFailureReason failureReason)
    368.     {
    369.         // ... Internal Stuff
    370.         // ... Validating the purchase with our Backend.
    371.     }
    372. }
    373.  
    This way when I purchase something in iOS, what I see is that the ConfirmPendingPurchase is been called, but when I reopen the app, I see that there is a payload in the catalog attached to the last purchase.
     
  47. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    @icortesp I'm not clear on your statement "there is a payload in the catalog", can you elaborate?
    Are you getting ProcessPurchase called? Also, can you repost your logs as an attachment, there was HTML in the display.
     
  48. ncortesp

    ncortesp

    Joined:
    Oct 28, 2016
    Posts:
    42
    There is HTML in the display because we have our own Debug class, which attaches the currentTime with different color, so we can see at which time each log has been casted. And those logs have been taken with the Xcode debugger.

    What I mean with "there is a payload in the catalog" is that in those logs from OnInitialized ();

    Code (CSharp):
    1. foreach (var item in controller.products.all)
    2.         {
    3.             if (item.availableToPurchase)
    4.             {
    5.                 SGO.Log (string.Join (" - ", new[] {
    6.                     item.metadata.localizedTitle,
    7.                     item.metadata.localizedDescription,
    8.                     item.metadata.isoCurrencyCode,
    9.                     item.metadata.localizedPrice.ToString (),
    10.                     item.metadata.localizedPriceString,
    11.                     item.transactionID,
    12.                     item.receipt
    13.                 }));
    14.  
    15.                 if (!string.IsNullOrEmpty ((string) item.transactionID))
    16.                     _pendingProducts.Add (item.transactionID, item);
    17.             }
    18.         }
    What I see is that there is a transactionId and a receipt attached to the last purchased product.

    I'll attach you the logs here (I'll remove all the logs that doesn't take part of this process, hope this helps);

    Code (CSharp):
    1. UnityIAP Version: 1.18.0
    2. UnityEngine.Purchasing.StandardPurchasingModule:Instance(AppStore)
    3. Purchaser:InitializePurchasing()
    4. <CastUpdateProductNames>c__Iterator0:MoveNext()
    5. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    6. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    7.  
    8. File Path: *** Removed it for security ***
    9. UnityEngine.Purchasing.FileReference:CreateInstance(String, ILogger)
    10. UnityEngine.Purchasing.StoreCatalogImpl:CreateInstance(String, String, ILogger)
    11. UnityEngine.Purchasing.JSONStore:Initialize(IStoreCallback)
    12. UnityEngine.Purchasing.PurchasingManager:Initialize(IInternalStoreListener, HashSet`1)
    13. <CastUpdateProductNames>c__Iterator0:MoveNext()
    14. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    15. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    16.  
    17. Fetching optimized store details from *** Removed it for security ***
    18. UnityEngine.Purchasing.StoreCatalogImpl:FetchProducts(Action`1)
    19. <CastUpdateProductNames>c__Iterator0:MoveNext()
    20. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    21. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    22.  
    23. 2018-05-08 17:37:33.973809+0200 deluxe[502:143708] [BoringSSL] Function boringssl_session_errorlog: line 2871 [boringssl_session_read] SSL_ERROR_ZERO_RETURN(6): operation failed because the connection was cleanly shut down with a close_notify alert
    24. Failed to fetch IAP catalog due to unexpected http status code, attempting to use cache
    25. UnityEngine.Purchasing.<>c__DisplayClass10_0:<FetchProducts>b__1(String)
    26. UnityEngine.Purchasing.<Process>d__4:MoveNext()
    27. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    28. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    29.  
    30. 2018-05-08 17:37:34.009359+0200 deluxe[502:143622] UnityIAP:Requesting 6 products
    31. 2018-05-08 17:37:34.013008+0200 deluxe[502:143622] UnityIAP:Requesting product data...
    32. 2018-05-08 17:37:34.732767+0200 deluxe[502:143622] UnityIAP:Received 6 products
    33. <b><color=yellow>[17:37:34]</color></b> Cofre de Oro - Un cofre de Oro lleno de monedas - EUR - 49.99 - 49,99-  -
    34. SGOLibrary.SGO:Log(Object, SGOColor)
    35. Purchaser:OnInitialized(IStoreController, IExtensionProvider)
    36. UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
    37. UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
    38. UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
    39. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    40. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    41.  
    42. <b><color=yellow>[17:37:34]</color></b> Cofre de Plata - Un cofre de Plata lleno de monedas - EUR - 24.99 - 24,99-  -
    43. SGOLibrary.SGO:Log(Object, SGOColor)
    44. Purchaser:OnInitialized(IStoreController, IExtensionProvider)
    45. UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
    46. UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
    47. UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
    48. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    49. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    50.  
    51. <b><color=yellow>[17:37:34]</color></b> Cofre de Bronce - Un cofre de bronce lleno de monedas - EUR - 9.99 - 9,99-  -
    52. SGOLibrary.SGO:Log(Object, SGOColor)
    53. Purchaser:OnInitialized(IStoreController, IExtensionProvider)
    54. UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
    55. UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
    56. UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
    57. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    58. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    59.  
    60. <b><color=yellow>[17:37:34]</color></b> Caldero - Un caldero lleno de monedas - EUR - 4.99 - 4,99-  -
    61. SGOLibrary.SGO:Log(Object, SGOColor)
    62. Purchaser:OnInitialized(IStoreController, IExtensionProvider)
    63. UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
    64. UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
    65. UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
    66. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    67. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    68.  
    69. <b><color=yellow>[17:37:34]</color></b> Marmita - Una marmita llena de monedas - EUR - 1.99 - 1,99- 1000000395861978 - {"Store":"AppleAppStore","TransactionID":"1000000395861978","Payload":"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"}
    70. SGOLibrary.SGO:Log(Object, SGOColor)
    71. Purchaser:OnInitialized(IStoreController, IExtensionProvider)
    72. UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
    73. UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
    74. UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
    75. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    76. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    77.  
    78. <b><color=yellow>[17:37:34]</color></b> Bolsita - Una bolsita llena de monedas - EUR - 0.99 - 0,99-  -
    79. SGOLibrary.SGO:Log(Object, SGOColor)
    80. Purchaser:OnInitialized(IStoreController, IExtensionProvider)
    81. UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
    82. UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
    83. UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
    84. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    85. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    86.  
    87. 2018-05-08 17:37:34.800071+0200 deluxe[502:143622] UnityIAP:Restore transactions
    88. 2018-05-08 17:37:34.800179+0200 deluxe[502:143622] UnityIAP:RestorePurchase
    89. Already recorded transaction 1000000395861978
    90. UnityEngine.Purchasing.PurchasingManager:ProcessPurchaseIfNew(Product)
    91. UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
    92. UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
    93. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    94. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    95.  
    96. 2018-05-08 17:37:34.816340+0200 deluxe[502:143622] UnityIAP:Transaction 1000000395861978 not found!
    97. UnityIAP: Promo is ready
    98. UnityEngine.Purchasing.Promo:ProvideProductsToAds(HashSet`1)
    99. UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
    100. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    101. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    102.  
    103. 2018-05-08 17:37:34.818776+0200 deluxe[502:143622] UnityIAP:Add transaction observer
    104. 2018-05-08 17:37:34.818891+0200 deluxe[502:143622] UnityIAP UnityEarlyTransactionObserver: Request to initiate queued payments
    105. 2018-05-08 17:37:35.281666+0200 deluxe[502:143622] UnityIAP:PaymentQueueRestoreCompletedTransactionsFinished
    106. <b><color=yellow>[17:37:35]</color></b> Restore Transactions :: Succeed
    107. SGOLibrary.SGO:Log(Object, SGOColor)
    108. Purchaser:<OnInitialized>m__0(Boolean)
    109. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    110. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    111.  
    112. <b><color=yellow>[17:37:35]</color></b> Apple Transactions
    113. SGOLibrary.SGO:Log(Object, SGOColor)
    114. Purchaser:<OnInitialized>m__0(Boolean)
    115. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    116. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    117.  
    118. <b><color=yellow>[17:37:35]</color></b> RestorePurchases... 1
    119. SGOLibrary.SGO:Log(Object, SGOColor)
    120. <RestorePurchases>c__Iterator3:MoveNext()
    121. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    122. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    123. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    124.  
    125. <b><color=yellow>[17:37:35]</color></b> Producto encontrado!!
    126. SGOLibrary.SGO:Log(Object, SGOColor)
    127. <RestorePurchases>c__Iterator3:MoveNext()
    128. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    129. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    130. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    131.  
    132. <b><color=yellow>[17:37:35]</color></b> Validating Purchase...
    133. SGOLibrary.SGO:Log(Object, SGOColor)
    134. <ValidatePurchase>c__Iterator2:MoveNext()
    135. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    136. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    137. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    138.  
    139. <b><color=yellow>[17:37:35]</color></b> Sending: {"receipt":{"Store":"AppleAppStore","TransactionID":"1000000395861978","Payload":"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","Token":"","GameID":"laperladelcaribedeluxe"},"status":"AUTHORIZED"}
    140. SGOLibrary.SGO:Log(Object, SGOColor)
    141. <SendToServer>c__Iterator0:MoveNext()
    142. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    143. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    144. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    145.  
    146. <b><color=yellow>[17:37:37]</color></b> Status: 200
    147. SGOLibrary.SGO:Log(Object, SGOColor)
    148. APIManager:ProcessRequestResponse(HTTPRequest, HTTPResponse)
    149. BestHTTP.HTTPRequest:CallCallback()
    150. BestHTTP.ConnectionBase:HandleCallback()
    151. BestHTTP.HTTPManager:OnUpdate()
    152.  
    153. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    154.  
    155. <b><color=yellow>[17:37:37]</color></b> Validating Purchase Receipt
    156. SGOLibrary.SGO:Log(Object, SGOColor)
    157. APIManager:ProcessValidateProduct()
    158. APIManager:ProcessRequest(String)
    159. <SendToServer>c__Iterator0:MoveNext()
    160. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    161. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    162.  
    163. <b><color=yellow>[17:37:37]</color></b> ValidateStatus: 500 (It's giving 500 because this transaction has already been validated by our backend)
    164. SGOLibrary.SGO:Log(Object, SGOColor)
    165. APIManager:ProcessValidateProduct()
    166. APIManager:ProcessRequest(String)
    167. <SendToServer>c__Iterator0:MoveNext()
    168. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    169. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    170.  
    171. <b><color=yellow>[17:37:37]</color></b> Purchase Error
    172. SGOLibrary.SGO:Log(Object, SGOColor)
    173. APIManager:ProcessValidateProduct()
    174. APIManager:ProcessRequest(String)
    175. <SendToServer>c__Iterator0:MoveNext()
    176. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    177. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    178.  
    179. <b><color=yellow>[17:37:59]</color></b> Validating Purchase with TransactionID: 1000000395861978
    180. SGOLibrary.SGO:Log(Object, SGOColor)
    181. <ValidatePurchase>c__Iterator2:MoveNext()
    182. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    183. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    184.  
    185. <b><color=yellow>[17:37:59]</color></b> ConfirmingPendingPurchase... marmita_laperladelcaribedeluxe liberando el producto...
    186. SGOLibrary.SGO:Log(Object, SGOColor)
    187. <ValidatePurchase>c__Iterator2:MoveNext()
    188. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    189. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    190.  
    191. 2018-05-08 17:37:59.229652+0200 deluxe[502:143622] UnityIAP:Transaction 1000000395861978 not found!
    192. Unloading 6 Unused Serialized files (Serialized files now loaded: 0)
    193. UnloadTime: 23.736458 ms
    194.  
    195. Unloading 82 unused Assets to reduce memory usage. Loaded Objects now: 2858.
    196. Total: 29.472375 ms (FindLiveObjects: 2.239333 ms CreateObjectMapping: 0.493416 ms MarkObjects: 25.119416 ms  DeleteObjects: 1.619333 ms)
    197.  
    198. <b><color=yellow>[17:38:03]</color></b> Product selected: marmita_laperladelcaribedeluxe
    199. SGOLibrary.SGO:Log(Object, SGOColor)
    200. Purchaser:BuyProductID(String)
    201. UnityEngine.Events.UnityEvent:Invoke()
    202. UnityEngine.EventSystems.ExecuteEvents:Execute(GameObject, BaseEventData, EventFunction`1)
    203. UnityEngine.EventSystems.ExecuteEvents:ExecuteHierarchy(GameObject, BaseEventData, EventFunction`1)
    204. UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchPress(PointerEventData, Boolean, Boolean)
    205. UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchEvents()
    206. UnityEngine.EventSystems.StandaloneInputModule:Process()
    207. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    208.  
    209. <b><color=yellow>[17:38:03]</color></b> Selected Product: Marmita
    210. SGOLibrary.SGO:Log(Object, SGOColor)
    211. Purchaser:BuyProductID(String)
    212. UnityEngine.Events.UnityEvent:Invoke()
    213. UnityEngine.EventSystems.ExecuteEvents:Execute(GameObject, BaseEventData, EventFunction`1)
    214. UnityEngine.EventSystems.ExecuteEvents:ExecuteHierarchy(GameObject, BaseEventData, EventFunction`1)
    215. UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchPress(PointerEventData, Boolean, Boolean)
    216. UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchEvents()
    217. UnityEngine.EventSystems.StandaloneInputModule:Process()
    218. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    219.  
    220. <b><color=yellow>[17:38:03]</color></b> Sending: {"rateId":1,"offerId":"","gameId":"laperladelcaribedeluxe"}
    221. SGOLibrary.SGO:Log(Object, SGOColor)
    222. <SendToServer>c__Iterator0:MoveNext()
    223. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    224. UnityEngine.Events.UnityEvent:Invoke()
    225. UnityEngine.EventSystems.ExecuteEvents:Execute(GameObject, BaseEventData, EventFunction`1)
    226. UnityEngine.EventSystems.ExecuteEvents:ExecuteHierarchy(GameObject, BaseEventData, EventFunction`1)
    227. UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchPress(PointerEventData, Boolean, Boolean)
    228. UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchEvents()
    229. UnityEngine.EventSystems.StandaloneInputModule:Process()
    230.  
    231. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    232.  
    233. <b><color=yellow>[17:38:03]</color></b> Status: 200
    234. SGOLibrary.SGO:Log(Object, SGOColor)
    235. APIManager:ProcessRequestResponse(HTTPRequest, HTTPResponse)
    236. BestHTTP.HTTPRequest:CallCallback()
    237. BestHTTP.ConnectionBase:HandleCallback()
    238. BestHTTP.HTTPManager:OnUpdate()
    239. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    240.  
    241. <b><color=yellow>[17:38:03]</color></b> Request Finished Successfully!
    242. {"purchaseToken":"152bef9c-db9c-4488-9154-6efbb84d27b2"}
    243. SGOLibrary.SGO:Log(Object, SGOColor)
    244. APIManager:ProcessRequestResponse(HTTPRequest, HTTPResponse)
    245. BestHTTP.HTTPRequest:CallCallback()
    246. BestHTTP.ConnectionBase:HandleCallback()
    247. BestHTTP.HTTPManager:OnUpdate()
    248. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    249.  
    250. 2018-05-08 17:38:03.629794+0200 deluxe[502:143622] UnityIAP:PurchaseProduct: marmita_laperladelcaribedeluxe
    251. 2018-05-08 17:38:03.647574+0200 deluxe[502:143622] UnityIAP:UpdatedTransactions
    252. purchase({0}): marmita_laperladelcaribedeluxe
    253. <InitPurchase>c__Iterator1:MoveNext()
    254. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    255. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    256.  
    257. 2018-05-08 17:38:29.268801+0200 deluxe[502:143622] got didBecomeActive(out) = (null)
    258. <b><color=yellow>[17:38:29]</color></b> PurchaseProcessingResult... marmita_laperladelcaribedeluxe
    259. SGOLibrary.SGO:Log(Object, SGOColor)
    260. Purchaser:ProcessPurchase(PurchaseEventArgs)
    261. UnityEngine.Purchasing.PurchasingManager:ProcessPurchaseIfNew(Product)
    262. UnityEngine.Purchasing.JSONStore:OnPurchaseSucceeded(String, String, String)
    263. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    264. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    265.  
    266. <b><color=yellow>[17:38:29]</color></b> Finalizamos compra de Apple
    267. SGOLibrary.SGO:Log(Object, SGOColor)
    268. Purchaser:ProcessPurchase(PurchaseEventArgs)
    269. UnityEngine.Purchasing.PurchasingManager:ProcessPurchaseIfNew(Product)
    270. UnityEngine.Purchasing.JSONStore:OnPurchaseSucceeded(String, String, String)
    271. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    272. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    273.  
    274. <b><color=yellow>[17:38:29]</color></b> FinishPurchaseProcessingResult ...marmita_laperladelcaribedeluxe
    275. SGOLibrary.SGO:Log(Object, SGOColor)
    276. Purchaser:FinishPurchaseProcessingResult(PurchaseEventArgs)
    277. Purchaser:ProcessPurchase(PurchaseEventArgs)
    278. UnityEngine.Purchasing.PurchasingManager:ProcessPurchaseIfNew(Product)
    279. UnityEngine.Purchasing.JSONStore:OnPurchaseSucceeded(String, String, String)
    280. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    281. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    282.  
    283. <b><color=yellow>[17:38:29]</color></b> Producto encontrado!!
    284. SGOLibrary.SGO:Log(Object, SGOColor)
    285. Purchaser:FinishPurchaseProcessingResult(PurchaseEventArgs)
    286. Purchaser:ProcessPurchase(PurchaseEventArgs)
    287. UnityEngine.Purchasing.PurchasingManager:ProcessPurchaseIfNew(Product)
    288. UnityEngine.Purchasing.JSONStore:OnPurchaseSucceeded(String, String, String)
    289. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    290. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    291.  
    292. <b><color=yellow>[17:38:29]</color></b> Validating Purchase...
    293. SGOLibrary.SGO:Log(Object, SGOColor)
    294. <ValidatePurchase>c__Iterator2:MoveNext()
    295. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    296. Purchaser:ProcessPurchase(PurchaseEventArgs)
    297. UnityEngine.Purchasing.PurchasingManager:ProcessPurchaseIfNew(Product)
    298. UnityEngine.Purchasing.JSONStore:OnPurchaseSucceeded(String, String, String)
    299. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    300. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    301.  
    302. <b><color=yellow>[17:38:29]</color></b> Sending: {"receipt":{"Store":"AppleAppStore","TransactionID":"1000000396771443","Payload":"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","Token":"152bef9c-db9c-4488-9154-6efbb84d27b2","GameID":"laperladelcaribedeluxe"},"status":"AUTHORIZED"}
    303. SGOLibrary.SGO:Log(Object, SGOColor)
    304. <SendToServer>c__Iterator0:MoveNext()
    305. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    306. Purchaser:ProcessPurchase(PurchaseEventArgs)
    307. UnityEngine.Purchasing.PurchasingManager:ProcessPurchaseIfNew(Product)
    308. UnityEngine.Purchasing.JSONStore:OnPurchaseSucceeded(String, String, String)
    309. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    310. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    311.  
    312. <b><color=yellow>[17:38:29]</color></b> PurchaseProcessingResult.Pending
    313. SGOLibrary.SGO:Log(Object, SGOColor)
    314. Purchaser:ProcessPurchase(PurchaseEventArgs)
    315. UnityEngine.Purchasing.PurchasingManager:ProcessPurchaseIfNew(Product)
    316. UnityEngine.Purchasing.JSONStore:OnPurchaseSucceeded(String, String, String)
    317. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    318. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    319.  
    320. <b><color=yellow>[17:38:32]</color></b> Status: 200
    321. SGOLibrary.SGO:Log(Object, SGOColor)
    322. APIManager:ProcessRequestResponse(HTTPRequest, HTTPResponse)
    323. BestHTTP.HTTPRequest:CallCallback()
    324. BestHTTP.ConnectionBase:HandleCallback()
    325. BestHTTP.HTTPManager:OnUpdate()
    326. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    327.  
    328. <b><color=yellow>[17:38:32]</color></b> Request Finished Successfully!
    329. {"Coins":0}
    330. SGOLibrary.SGO:Log(Object, SGOColor)
    331. APIManager:ProcessRequestResponse(HTTPRequest, HTTPResponse)
    332. BestHTTP.HTTPRequest:CallCallback()
    333. BestHTTP.ConnectionBase:HandleCallback()
    334. BestHTTP.HTTPManager:OnUpdate()
    335. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    336.  
    337. <b><color=yellow>[17:38:32]</color></b> Validating Purchase Receipt
    338. SGOLibrary.SGO:Log(Object, SGOColor)
    339. APIManager:ProcessValidateProduct()
    340. APIManager:ProcessRequest(String)
    341. <SendToServer>c__Iterator0:MoveNext()
    342. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    343. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    344.  
    345. <b><color=yellow>[17:38:32]</color></b> ValidateStatus: 200
    346. SGOLibrary.SGO:Log(Object, SGOColor)
    347. APIManager:ProcessValidateProduct()
    348. APIManager:ProcessRequest(String)
    349. <SendToServer>c__Iterator0:MoveNext()
    350. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    351. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    352.  
    353. <b><color=yellow>[17:38:32]</color></b> Validating Purchase with TransactionID: 1000000396771443
    354. SGOLibrary.SGO:Log(Object, SGOColor)
    355. <ValidatePurchase>c__Iterator2:MoveNext()
    356. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    357. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    358.  
    359. <b><color=yellow>[17:38:32]</color></b> ConfirmingPendingPurchase... marmita_laperladelcaribedeluxe liberando el producto...
    360. SGOLibrary.SGO:Log(Object, SGOColor)
    361. <ValidatePurchase>c__Iterator2:MoveNext()
    362. UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
    363. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    364.  
    365. 2018-05-08 17:38:32.312544+0200 deluxe[502:143622] UnityIAP:Finishing transaction 1000000396771443
    366. -> applicationWillResignActive()
    367. <b><color=yellow>[17:38:32]</color></b> Going background ... Connected
    368. SGOLibrary.SGO:Log(Object, SGOColor)
    369. SignalRManager:OnApplicationFocus(Boolean)
    370. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    371.  
    372. <b><color=yellow>[17:38:51]</color></b> Status: 200
    373. SGOLibrary.SGO:Log(Object, SGOColor)
    374. APIManager:ProcessRequestResponse(HTTPRequest, HTTPResponse)
    375. BestHTTP.HTTPRequest:CallCallback()
    376. BestHTTP.ConnectionBase:HandleCallback()
    377. BestHTTP.HTTPManager:OnUpdate()
    378. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    Hopefully I'm not missing any log.

    Greetings,
    Nacho.
     
    Last edited: May 9, 2018
  49. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    These are Android logs from adb logcat "And those logs have been taken with the adb logcat"? I believe you mentioned the issue only happens on iOS "it just happens to me with iOS, works perfect with Android."
     
  50. ncortesp

    ncortesp

    Joined:
    Oct 28, 2016
    Posts:
    42
    Sorry, those logs have been taken with the XCode debugger.