Search Unity

Unity IAP Weird Stuck Transactions Not Finishing

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

  1. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    @icortesp Using the sample project that I have provided, how would I reproduce this issue? The sample project allows you to return Pending or Complete at runtime for testing.
     
  2. ncortesp

    ncortesp

    Joined:
    Oct 28, 2016
    Posts:
    42
    Following those steps;

    Try to make a purchase and set it to pending instead of complete.
    Close your app (Stop the editor).
    When you reopen the app (Play in the editor), there should be a TransactionId + Payload attached to the product you previously set to Pending. If that doesn't happens, your project workflow does not work (That's what happened to me, that's why I could not reproduce it with your project).

    If so, then you can reproduce it with iOS. Set any product to pending, and then add a Coroutine with a delay, (emulating a S2S communication), which confirms the pending purchase after that. Once that happens, close your app.
    Once you reopen the app there should not be a TransactionId + Payload attached to the product you previously Confirmed, if so... there you have the problem.

    Hope this helps.

    Greetings,
    Nacho.
     
  3. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    Yes, my project has that workflow using the Toggle and Complete buttons. This is expected behavior. After a purchase, Apple will refresh the receipt which is sent the next time the app starts. You should notice that ProcessPurchase is not called in this situation, so you potentially could add logic to check both the payload and the fact that ProcessPurchase is not called.
     
  4. ncortesp

    ncortesp

    Joined:
    Oct 28, 2016
    Posts:
    42
    I know that the ProcessPurchase is not called in that situation (I've already implemented a logic I need in order to deal with it), what I do is try to validate all the pending purchases with my Backend, and when I get the coins back (we give coins as a reward for a purchase), then I ConfirmPendingPurchase.

    The problem is that after resolving all the pending purchases, If I reload my application what I see is that the last product I've restored, still has attached a new Payload + TransactionID. It seems like there is no way to ConfirmPendingPurchase. I do not know if you follow me.

    This ends in a loop where each time I reload the application, I'm asking my backend To ConfirmPendingPurchases on products that have been previously redeemed (because there is always a Payload + TransactionId attached).


    This is an example;

    Code (CSharp):
    1. <b><color=yellow>[09:24:24]</color></b> Marmita - Una marmita llena de monedas - EUR - 1.99 - 1,99- 1000000396771443 - {"Store":"AppleAppStore","TransactionID":"1000000396771443","Payload":"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"}
    2. SGOLibrary.SGO:Log(Object, SGOColor)
    3. Purchaser:OnInitialized(IStoreController, IExtensionProvider)
    4. UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
    5. UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
    6. UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
    7. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    8.  
    9. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    10.  
    11. 2018-05-10 09:24:24.213029+0200 deluxe[632:226306] UnityIAP:Restore transactions
    12. 2018-05-10 09:24:24.213193+0200 deluxe[632:226306] UnityIAP:RestorePurchase
    13. Already recorded transaction 1000000396771443
    14. UnityEngine.Purchasing.PurchasingManager:ProcessPurchaseIfNew(Product)
    15. UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
    16. UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
    17. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    18. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    19.  
    20. 2018-05-10 09:24:24.215276+0200 deluxe[632:226306] UnityIAP:Transaction 1000000396771443 not found!
    21. Already recorded transaction 1000000396704837
    22. UnityEngine.Purchasing.PurchasingManager:ProcessPurchaseIfNew(Product)
    23. UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
    24. UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
    25. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    Those logs have no sense, the first one corresponds to the function OnInitialized (); (I'm showing you the log of one product).

    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. //        SGO.Log ("Products: " + controller.products.all.Length);
    9.         // Store specific subsystem, for accessing device-specific store features
    10.         m_StoreExtensionProvider = extensions;
    11.         m_AppleExtensions = extensions.GetExtension<IAppleExtensions>();
    12.  
    13.         // On Apple platforms we need to handle deferred purchases caused by Apple's Ask to Buy feature.
    14.         // On non-Apple platforms this will have no effect; OnDeferred will never be called.
    15.         m_AppleExtensions.RegisterPurchaseDeferredListener(OnDeferred);
    16.  
    17.         foreach (var item in controller.products.all)
    18.         {
    19.             if (item.availableToPurchase)
    20.             {
    21.                 SGO.Log (string.Join (" - ", new[] {
    22.                     item.metadata.localizedTitle,
    23.                     item.metadata.localizedDescription,
    24.                     item.metadata.isoCurrencyCode,
    25.                     item.metadata.localizedPrice.ToString (),
    26.                     item.metadata.localizedPriceString,
    27.                     item.transactionID,
    28.                     item.receipt
    29.                 }));
    30.  
    31.                 if (!string.IsNullOrEmpty ((string) item.transactionID))
    32.                     _pendingProducts.Add (item.transactionID, item);
    33.             }
    34.         }
    35. }
     
    Last edited: May 10, 2018
  5. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    @icortesp Yes, the payload is expected as the receipt is refreshed, there is no need to call ConfirmPendingPurchase. You will get a refreshed receipt each time on next app launch if you do, and you will see the behavior you are seeing. It is not a pending purchase, it has already been completed, you are just seeing the receipt refresh. You should not see the payload on the NEXT app launch (as long as you don't call ConfirmPendingPurchase). Can you try that test?
     
  6. ncortesp

    ncortesp

    Joined:
    Oct 28, 2016
    Posts:
    42
    That's not happening to me, I'm not calling ConfirmPendingPurchase and there is a product that keeps stuck with a Payload + TransactionId attached to it.

    I see those logs each time I launch the app;

    Code (CSharp):
    1. <b><color=yellow>[18:22:31]</color></b> Bolsita - Una bolsita llena de monedas - EUR - 0.99 - 0,99- 1000000396704837 - {"Store":"AppleAppStore","TransactionID":"1000000396704837","Payload":"MIIVcgYJKoZIhvcNAQcCoIIVYzCCFV8CAQExCzAJBgUrDgMCGgUAMIIFEwYJKoZIhvcNAQcBoIIFBASCBQAxggT8MAoCAQgCAQEEAhYAMAoCARQCAQEEAgwAMAsCAQECAQEEAwIBADALAgEDAgEBBAMMATAwCwIBCwIBAQQDAgEAMAsCAQ4CAQEEAwIBeTALAgEPAgEBBAMCAQAwCwIBEAIBAQQDAgEAMAsCARkCAQEEAwIBAzAMAgEKAgEBBAQWAjQrMA0CAQ0CAQEEBQIDAa5+MA0CARMCAQEEBQwDMS4wMA4CAQkCAQEEBgIEUDI1MDAYAgEEAgECBBBbBHRniBIndCwJ2i8ToNtRMBsCAQACAQEEEwwRUHJvZHVjdGlvblNhbmRib3gwHAIBBQIBAQQU1FL+3HknTbMoxqG2bbUv7SruZT4wHgIBDAIBAQQWFhQyMDE4LTA1LTEwVDE2OjIxOjE1WjAeAgESAgEBBBYWFDIwMTMtMDgtMDFUMDc6MDA6MDBaMD4CAQICAQEENgw0Y29tLnNsb3QubWFxdWluYS5iYXIudHJhZ2FwZXJyYXMucGVybGEuY2FyaWJlLmRlbHV4ZTBNAgEHAgEBBEUskVA2S/op+K5yyozT9bb2CkAbVDqAoJcEoqT0PUiOwwap3U/Zv2I7s94r6bc6BwkD2a+BykylbVIrvk2WTEbxnauJLGgwWQIBBgIBAQRRsC1QsudZ6TD8a4cn5gPVmbfY3gI1VjKNGZvZVxxP65qCenFLVvr8DN+DnyCnsl/JjtTmgZ2wttsja9CiOZBOlc8P/l+0uEmZgWrj2n9xRuaCMIIBYwIBEQIBAQSCAVkxggFVMAsCAgasAgEBBAIWADALAgIGrQIBAQQCDAAwCwICBrACAQEEAhYAMAsCAgayAgEBBAIMADALAgIGswIBAQQCDAAwCwICBrQCAQEEAgwAMAsCAga1AgEBBAIMADALAgIGtgIBAQQCDAAwDAICBqUCAQEEAwIBATAMAgIGqwIBAQQDAgEBMAwCAgauAgEBBAMCAQAwDAICBq8CAQEEAwIBADAMAgIGsQIBAQQDAgEAMBsCAganAgEBBBIMEDEwMDAwMDAzOTY3MDQ4MzcwGwICBqkCAQEEEgwQMTAwMDAwMDM5NjcwNDgzNzAfAgIGqAIBAQQWFhQyMDE4LTA1LTA4VDExOjQwOjU5WjAfAgIGqgIBAQQWFhQyMDE4LTA1LTA4VDExOjQwOjU5WjApAgIGpgIBAQQgDB5ib2xzaXRhX2xhcGVybGFkZWxjYXJpYmVkZWx1eGUwggFjAgERAgEBBIIBWTGCAVUwCwICBqwCAQEEAhYAMAsCAgatAgEBBAIMADALAgIGsAIBAQQCFgAwCwICBrICAQEEAgwAMAsCAgazAgEBBAIMADALAgIGtAIBAQQCDAAwCwICBrUCAQEEAgwAMAsCAga2AgEBBAIMADAMAgIGpQIBAQQDAgEBMAwCAgarAgEBBAMCAQEwDAICBq4CAQEEAwIBADAMAgIGrwIBAQQDAgEAMAwCAgaxAgEBBAMCAQAwGwICBqcCAQEEEgwQMTAwMDAwMDM5NzU1MjQ1MzAbAgIGqQIBAQQSDBAxMDAwMDAwMzk3NTUyNDUzMB8CAgaoAgEBBBYWFDIwMTgtMDUtMTBUMTY6MjE6MTVaMB8CAgaqAgEBBBYWFDIwMTgtMDUtMTBUMTY6MjE6MTVaMCkCAgamAgEBBCAMHmJvbHNpdGFfbGFwZXJsYWRlbGNhcmliZWRlbHV4ZaCCDmUwggV8MIIEZKADAgECAggO61eH554JjTANBgkqhkiG9w0BAQUFADCBljELMAkGA1UEBhMCVVMxEzARBgNVBAoMCkFwcGxlIEluYy4xLDAqBgNVBAsMI0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zMUQwQgYDVQQDDDtBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9ucyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNTExMTMwMjE1MDlaFw0yMzAyMDcyMTQ4NDdaMIGJMTcwNQYDVQQDDC5NYWMgQXBwIFN0b3JlIGFuZCBpVHVuZXMgU3RvcmUgUmVjZWlwdCBTaWduaW5nMSwwKgYDVQQLDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQClz4H9JaKBW9aH7SPaMxyO4iPApcQmyz3Gn+xKDVWG/6QC15fKOVRtfX+yVBidxCxScY5ke4LOibpJ1gjltIhxzz9bRi7GxB24A6lYogQ+IXjV27fQjhKNg0xbKmg3k8LyvR7E0qEMSlhSqxLj7d0fmBWQNS3CzBLKjUiB91h4VGvojDE2H0oGDEdU8zeQuLKSiX1fpIVK4cCc4Lqku4KXY/Qrk8H9Pm/KwfU8qY9SGsAlCnYO3v6Z/v/Ca/VbXqxzUUkIVonMQ5DMjoEC0KCXtlyxoWlph5AQaCYmObgdEHOwCl3Fc9DfdjvYLdmIHuPsB8/ijtDT+iZVge/iA0kjAgMBAAGjggHXMIIB0zA/BggrBgEFBQcBAQQzMDEwLwYIKwYBBQUHMAGGI2h0dHA6Ly9vY3NwLmFwcGxlLmNvbS9vY3NwMDMtd3dkcjA0MB0GA1UdDgQWBBSRpJz8xHa3n6CK9E31jzZd7SsEhTAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFIgnFwmpthhgi+zruvZHWcVSVKO3MIIBHgYDVR0gBIIBFTCCAREwggENBgoqhkiG92NkBQYBMIH+MIHDBggrBgEFBQcCAjCBtgyBs1JlbGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMDYGCCsGAQUFBwIBFipodHRwOi8vd3d3LmFwcGxlLmNvbS9jZXJ0aWZpY2F0ZWF1dGhvcml0eS8wDgYDVR0PAQH/BAQDAgeAMBAGCiqGSIb3Y2QGCwEEAgUAMA0GCSqGSIb3DQEBBQUAA4IBAQANphvTLj3jWysHbkKWbNPojEMwgl/gXNGNvr0PvRr8JZLbjIXDgFnf4+LXLgUUrA3btrj+/DUufMutF2uOfx/kd7mxZ5W0E16mGYZ2+FogledjjA9z/Ojtxh+umfhlSFyg4Cg6wBA3LbmgBDkfc7nIBf3y3n8aKipuKwH8oCBc2et9J6Yz+PWY4L5E27FMZ/xuCk/J4gao0pfzp45rUaJahHVl0RYEYuPBX/UIqc9o2ZIAycGMs/iNAGS6WGDAfK+PdcppuVsq1h1obphC9UynNxmbzDscehlD86Ntv0hgBgw2kivs3hi1EdotI9CO/KBpnBcbnoB7OUdFMGEvxxOoMIIEIjCCAwqgAwIBAgIIAd68xDltoBAwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMB4XDTEzMDIwNzIxNDg0N1oXDTIzMDIwNzIxNDg0N1owgZYxCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDKOFSmy1aqyCQ5SOmM7uxfuH8mkbw0U3rOfGOAYXdkXqUHI7Y5/lAtFVZYcC1+xG7BSoU+L/DehBqhV8mvexj/avoVEkkVCBmsqtsqMu2WY2hSFT2Miuy/axiV4AOsAX2XBWfODoWVN2rtCbauZ81RZJ/GXNG8V25nNYB2NqSHgW44j9grFU57Jdhav06DwY3Sk9UacbVgnJ0zTlX5ElgMhrgWDcHld0WNUEi6Ky3klIXh6MSdxmilsKP8Z35wugJZS3dCkTm59c3hTO/AO0iMpuUhXf1qarunFjVg0uat80YpyejDi+l5wGphZxWy8P3laLxiX27Pmd3vG2P+kmWrAgMBAAGjgaYwgaMwHQYDVR0OBBYEFIgnFwmpthhgi+zruvZHWcVSVKO3MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUK9BpR5R2Cf70a40uQKb3R01/CF4wLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDovL2NybC5hcHBsZS5jb20vcm9vdC5jcmwwDgYDVR0PAQH/BAQDAgGGMBAGCiqGSIb3Y2QGAgEEAgUAMA0GCSqGSIb3DQEBBQUAA4IBAQBPz+9Zviz1smwvj+4ThzLoBTWobot9yWkMudkXvHcs1Gfi/ZptOllc34MBvbKuKmFysa/Nw0Uwj6ODDc4dR7Txk4qjdJukw5hyhzs+r0ULklS5MruQGFNrCk4QttkdUGwhgAqJTleMa1s8Pab93vcNIx0LSiaHP7qRkkykGRIZbVf1eliHe2iK5IaMSuviSRSqpd1VAKmuu0swruGgsbwpgOYJd+W+NKIByn/c4grmO7i77LpilfMFY0GCzQ87HUyVpNur+cmV6U/kTecmmYHpvPm0KdIBembhLoz2IYrF+Hjhga6/05Cdqa3zr/04GpZnMBxRpVzscYqCtGwPDBUfMIIEuzCCA6OgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQGEwJVUzETMBEGA1UEChMKQXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxFjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwHhcNMDYwNDI1MjE0MDM2WhcNMzUwMjA5MjE0MDM2WjBiMQswCQYDVQQGEwJVUzETMBEGA1UEChMKQXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxFjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkkakJH5HbHkdQ6wXtXnmELes2oldMVeyLGYne+Uts9QerIjAC6Bg++FAJ039BqJj50cpmnCRrEdCju+QbKsMflZ56DKRHi1vUFjczy8QPTc4UadHJGXL1XQ7Vf1+b8iUDulWPTV0N8WQ1IxVLFVkds5T39pyez1C6wVhQZ48ItCD3y6wsIG9wtj8BMIy3Q88PnT3zK0koGsj+zrW5DtleHNbLPbU6rfQPDgCSC7EhFi501TwN22IWq6NxkkdTVcGvL0Gz+PvjcM3mo0xFfh9Ma1CWQYnEdGILEINBhzOKgbEwWOxaBDKMaLOPHd5lc/9nXmW8Sdh2nzMUZaF3lMktAgMBAAGjggF6MIIBdjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUK9BpR5R2Cf70a40uQKb3R01/CF4wHwYDVR0jBBgwFoAUK9BpR5R2Cf70a40uQKb3R01/CF4wggERBgNVHSAEggEIMIIBBDCCAQAGCSqGSIb3Y2QFATCB8jAqBggrBgEFBQcCARYeaHR0cHM6Ly93d3cuYXBwbGUuY29tL2FwcGxlY2EvMIHDBggrBgEFBQcCAjCBthqBs1JlbGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMA0GCSqGSIb3DQEBBQUAA4IBAQBcNplMLXi37Yyb3PN3m/J20ncwT8EfhYOFG5k9RzfyqZtAjizUsZAS2L70c5vu0mQPy3lPNNiiPvl4/2vIB+x9OYOLUyDTOMSxv5pPCmv/K/xZpwUJfBdAVhEedNO3iyM7R6PVbyTi69G3cN8PReEnyvFteO3ntRcXqNx+IjXKJdXZD9Zr1KIkIxH3oayPc4FgxhtbCS+SsvhESPBgOJ4V9T0mZyCKM2r3DYLP3uujL/lTaltkwGMzd/c6ByxW69oPIQ7aunMZT7XZNn/Bh1XZp5m5MkL72NVxnn6hUrcbvZNCJBIqxw8dtk2cXmPIS4AXUKqK1drk/NAJBzewdXUhMYIByzCCAccCAQEwgaMwgZYxCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkCCA7rV4fnngmNMAkGBSsOAwIaBQAwDQYJKoZIhvcNAQEBBQAEggEAV+IbrjzJc0LRK3pwUR5Ud7H2Gy/u7NqWN1xhhKsqx/EVEL1bm1CS+XCb0U4td1CRjQlxBWX5NsaA5JUBdJpjp4bICpBW7zD7xpMT25OHNTEAoM7cmB7+ASafZNtrpfyyIg/sYsYyFMlT4s5b0rNlNQF3WfMK1jWPYJ95GRvCrl+rr7zm+tZ/02QlyZJy90dVBV08CYautPr2oGBWJaRYh93lXKCnsIXPqrT+At5s8OgMNBLg6eo8UOADPOO4kOviFevPsV9gZam27g6QrMZRIh/JPqz1uH4+AheZAjUSLIZ9ZH21MaoUHb/Nd9kz1h3NeUfFUjyuato26zLeqZzfiA=="}
    2. SGOLibrary.SGO:Log(Object, SGOColor)
    3. Purchaser:OnInitialized(IStoreController, IExtensionProvider)
    4. UnityEngine.Purchasing.PurchasingManager:CheckForInitialization()
    5. UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
    6. UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
    7. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    8. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    9.  
    10. 2018-05-10 18:22:31.398886+0200 deluxe[1523:682669] UnityIAP:Restore transactions
    11. 2018-05-10 18:22:31.398978+0200 deluxe[1523:682669] UnityIAP:RestorePurchase
    12. Already recorded transaction 1000000396704837
    13. UnityEngine.Purchasing.PurchasingManager:ProcessPurchaseIfNew(Product)
    14. UnityEngine.Purchasing.PurchasingManager:OnProductsRetrieved(List`1)
    15. UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
    16. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    17. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    18.  
    19. 2018-05-10 18:22:31.399592+0200 deluxe[1523:682669] UnityIAP:Transaction 1000000396704837 not found!
    20. UnityIAP: Promo is ready
    21. UnityEngine.Purchasing.Promo:ProvideProductsToAds(HashSet`1)
    22. UnityEngine.Purchasing.AppleStoreImpl:OnProductsRetrieved(String)
    23. UnityEngine.Purchasing.Extension.UnityUtil:Update()
    24. (Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
    25.  
    26. 2018-05-10 18:22:31.408170+0200 deluxe[1523:682669] UnityIAP:Add transaction observer
    27. 2018-05-10 18:22:31.408251+0200 deluxe[1523:682669] UnityIAP UnityEarlyTransactionObserver: Request to initiate queued payments
    28. 2018-05-10 18:22:31.784037+0200 deluxe[1523:682669] UnityIAP:PaymentQueueRestoreCompletedTransactionsFinished
     
  7. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    @icortesp For clarity, did you call ConfirmPendingPurchase (only) once for this product? And then each subsequent time you launch the app, you do NOT receive a ProcessPurchase callback, yet there is still a Payload + TransactionID each time? And you receive the "Restore transactions" log message each time you relaunch the app multiple times? And these are logs from an iOS device.
     
    Last edited: May 10, 2018
  8. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    @icortesp I am seeing the same behavior in the Sample project. In checking with the IAP team, this turns out to be expected behavior (I misspoke earlier). Expected - "For the Apple store for non-consumables, the payload and transactionID should be returned every time the app is launched"
     
    Last edited: May 10, 2018
  9. ncortesp

    ncortesp

    Joined:
    Oct 28, 2016
    Posts:
    42
    I ConfirmPendingPurchase once for product.
    Each time I launch the app I receive a ProcessPurchase callback, I'm not calling ConfirmingPendingPurchase (cause I did before).
    I'm receiving the Restore transactions log each time I relaunch the app, and nothing happens, it says "UnityIAP:Transaction 1000000399171343 not found!", and nothing happens.

    I'm seeing it again and again each time I relaunch the app.

    With Android this does not happen. I don't get it.

    But I'm talking about consumables. I'm seeing this behaviour with consumable products.

    Greetings,
    Nacho.
     
    Last edited: May 17, 2018
  10. ncortesp

    ncortesp

    Joined:
    Oct 28, 2016
    Posts:
    42
    @engin_gg Could you fix it?

    @JeffDUnity3D this user resumes the behaviour i'm experiencing with the App.

    That's exactly what happens to me.

    I expect this to be fixed soon.

    Greetings,
    Nacho.
     
  11. govind

    govind

    Joined:
    Nov 28, 2017
    Posts:
    2
    @JeffDUnity3D

    Please use the following method to test the problem. The problem is that once a purchase has been made in iOS. The product.hasReceipt will always be true for that product even after it is confirmed. So every time I check for pending purchases (purchases which may not have been confirmed due to network issue or app crash) I get all the purchases ever made in iOS and not just the pending one.

    void CheckPendingPurchase()
    {
    var validator = new CrossPlatformValidator(GooglePlayTangle.Data(), AppleTangle.Data(), Application.identifier);
    foreach (Product product in m_StoreController.products.all)
    {
    if (!product.hasReceipt)
    {
    continue;
    }

    try
    {
    var result = validator.Validate(product.receipt);
    foreach (IPurchaseReceipt productReceipt in result)
    {
    GooglePlayReceipt google = productReceipt as GooglePlayReceipt;
    if (google != null)
    {
    //Server side validation code
    }

    AppleInAppPurchaseReceipt apple = productReceipt as AppleInAppPurchaseReceipt;
    if (null != apple)
    {
    var appleReceipt = MiniJSON.Json.Deserialize(product.receipt) as Dictionary<string, object>;
    if (appleReceipt != null && appleReceipt.ContainsKey("Payload"))
    {
    string receipt = appleReceipt["Payload"] as string;
    if (!string.IsNullOrEmpty(receipt))
    {
    //Server side validation code
    }
    }
    }
    }
    }
    catch (IAPSecurityException)
    {
    m_StoreController.ConfirmPendingPurchase(product);
    }
    }
    }
     
  12. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    In IAP 1.17 and 1.18, yes we are returning the receipt each time. We have fixed this in the next release which should be available any day now. In the upcoming version, the consumed product will only have a receipt once (when it is purchased).
     
  13. ncortesp

    ncortesp

    Joined:
    Oct 28, 2016
    Posts:
    42
    Hey Jeff, I've been testing this and there is something that bothers me. The workflow is better than it was, but I can still stuck products, which worries me so much, I would not like this to happen in my Production environment (I'm still testing).

    What I see right now is that if I set a Purchase to Pending and then I close my app. When I re launch the application I won't see any payload + transactionId attached to my Pending Product once I display all the data attached to the controller.products.all, which I don't like because that's not true. I must see this data just in case there is a pending product.

    By the other hand, and following the this example, what I see is that the Unity IAP is trying to Restore that Pending Purchase on it's own which I do like so much. What has no sense is that there isn't any payload + TransactionId attached to any product (when I list all the data attached to controller.products.all) but the plugin is trying to close a pending purchase on it's own (which really exists).

    @JeffDUnity3D can you take a look at this?

    Greetings,
    Nacho.


     
    Last edited: May 23, 2018
  14. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    @icortesp Can you provide the device logs? How do you know that it is trying to Restore? Separate from the payload behavior, are you seeing ProcessPurchase called?
     
  15. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    @icortesp I should add that we only return the payload once, upon initial purchase. If you return Pending on the initial purchase, then you would expect to see a ProcessPurchase callback on next app launch for this product.
     
  16. ncortesp

    ncortesp

    Joined:
    Oct 28, 2016
    Posts:
    42
    iOS:
    I mean that If I set a purchase to pending and I close my app, when I relaunch it I see that there is no transaction Id + Payload attached to that product inside the controller.products.all, but the ProcessPurchase callback is called itself (which I do like).
     
  17. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    @icortesp That is expected behavior. We only return the payload and the transactionID when the transaction is complete.
     
  18. erfan

    erfan

    Joined:
    Dec 21, 2012
    Posts:
    7
    How can we know that ProcessPurchase which is called by Unity is a result of an auto Restoring non-consumable item is or not.

    I mean, if we manually restore them, we know that and we can set up a flag, but in this situation which is called automatically how can we find?
     
  19. JeffDUnity3D

    JeffDUnity3D

    Joined:
    May 2, 2017
    Posts:
    14,446
    There is not a direct way to determine the difference. But you could set your own boolean flag to true that is triggered on a purchase button click. In ProcessPurchase, you check this flag. If false, you are dealing with a Restore.