Unity IAP. Валидация чека на сервере App Store

В игре встроены покупки при помощи Unity IAP. В unity editor все покупки работают замечательно. Но App Store уже 3 раз мне отказывает с вот таким сообщением:

"Guideline 2.1 - Performance - App Completeness We still found that your in-app purchase products exhibited one or more bugs when reviewed on iPad running iOS 14.1 on Wi-Fi. Specifically, when selecting all coins no action takes place to enable the in-app purchase. Next Steps When validating receipts on your server, your server needs to be able to handle a production-signed app getting its receipts from Apple’s test environment. The recommended approach is for your production server to always validate receipts against the production App Store first. If validation fails with the error code "Sandbox receipt used in production," you should validate against the test environment instead."

Искал код для валидации чека на сервере App Store, но и с этим меня не пропустили. В чем может быть проблема? Если у кого-нибудь есть готовый пример валидации чека, буду очень признателен, если поделитесь. А если разъясните, что к чему, вообще цены вам не будет. Прочитал уже тону документации, но все бестолку. Прикрепляю код валидации чека на сервере, как сделано у меня.

public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
{
    var wrapper = (Dictionary<string, object>)MiniJson.JsonDecode(args.purchasedProduct.receipt);
    if (null == wrapper)
    {
        return PurchaseProcessingResult.Complete;
    }

    var store = (string)wrapper["Store"];
    var payload = (string)wrapper["Payload"];

    StartCoroutine(PostRepict("https://buy.itunes.apple.com/verifyReceipt", args.purchasedProduct.definition.id, payload));

    return PurchaseProcessingResult.Complete;
}


IEnumerator PostRepict(string www, string payID, string gpJson)

{
    WWWForm form = new WWWForm();
    form.AddField("productId", payID);
    form.AddField("purchaseToken", gpJson);
    WWW getData = new WWW(www, form);

    yield return getData;

    if (getData.error != null)
    {
        Debug.Log(getData.text);
    }

    string srcString = getData.text;

    try
    {
        JSONNode jsonNode = JSONNode.Parse(srcString);

        if (jsonNode["code"].AsInt == 200)
        {
            if (String.Equals(payID, product_1, StringComparison.Ordinal))
            {
                PuzzleMatchManager.instance.coinsSystem.BuyCoins(15);
            }
            else if (String.Equals(payID, product_2, StringComparison.Ordinal))
            {
                PuzzleMatchManager.instance.coinsSystem.BuyCoins(50);
            }
            else if (String.Equals(payID, product_3, StringComparison.Ordinal))
            {
                PuzzleMatchManager.instance.coinsSystem.BuyCoins(100);
            }
            else if (String.Equals(payID, product_4, StringComparison.Ordinal))
            {
                PuzzleMatchManager.instance.coinsSystem.BuyCoins(250);
            }
        }
    }
    catch (System.Exception e)
    {
        Debug.LogError("Server Error:" + e.Message);
    }
}

Ответы (0 шт):