質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.58%

UnityIAP サブスクリプション型アイテム購入 sandboxでのテストで自動継続されたかアプリ起動中に確認できない

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 1,575

taku263-456

score 10

 前提・実現したいこと

現在、UnityIAPを使用して、自動継続型の課金アイテムを購入できるiOSアプリの開発を行っています。
公式のサンプルを参考にして、sandboxでの課金処理の確認まで完了できました。

あとは自動継続のタイミング(1ヶ月を想定しているため、sandboxでは5分後)で継続されたかリアルタイムで確認確認したいです。

 発生している問題・エラーメッセージ

【発生している問題】
アプリの起動中に自動継続のタイミングではUnityIAPのpublic PurchaseProcessingResult ProcessPurchase (PurchaseEventArgs args){}
が実行されることを想定していたのですが、アプリの起動中にはXcodeのログを見る限り、呼ばれず自動継続されたのか分かりません。

そのため、sandboxを使った課金テストで自動継続されたかリアルタイムで確認する方法を教えてください。

※ アプリを再起動し、Oninitializeが完了したタイミングで、自動継続された旨の「Finish Transaction~」は表示されますが、
※ これだとアプリの再起動が必要なうえ、自動継続のレシート検証のタイミングの検討に難儀しています。

 該当のソースコード

public class Purchase : MonoBehaviour, IStoreListener
{
    private static string kProductIDSubscription = "KakinTest_1m";
    private static string kProductNameAppleSubscription = "KakinTest_1m";
    // シングルトンの生成
    private static PurchaseManager instance;
    public static PurchaseManager Instance
    {
        get
        {
            if (instance == null)
            {
                instance = GameObject.FindObjectOfType<PurchaseManager>();
            }
            return instance;
        }
    }

    private void Awake()
    {
        if (Instance != null && Instance != this)
        {
            Destroy(gameObject);
        }
        else
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }

        // 購入済みか確認する
        if (Convert.ToInt32(NCMBUser.CurrentUser["is_Buy"]) == 1)
        {
            alreadyBuy = true;
        }

        if (m_StoreController == null)
        {
            InitializePurchasing();
        }
    }

    public void InitializePurchasing()
    {
        if (IsInitialized())
        {
            return;
        }
        Debug.Log("InitializePurchasing Start!!");
        var module = StandardPurchasingModule.Instance();
        var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
        string receipt = builder.Configure<IAppleConfiguration>().appReceipt;

        if (receipt != null)
        {
            Debug.Log(receipt);
        }
        builder.AddProduct(kProductIDSubscription, ProductType.Subscription, new IDs()
            {
                { kProductNameAppleSubscription,       AppleAppStore.Name },
            });

        Debug.Log("UnityPurchasing.Initialize Start!!");

        UnityPurchasing.Initialize(this, builder);
    }

    private bool IsInitialized()
    {
        return m_StoreController != null && m_StoreExtensionProvider != null;
    }

    public void BuySubscription()
    {
        if (alreadyBuy == true)
        {
            // 既に購入済みの旨を通知
            // 購入済みのため何もしない。
            return;
        }
        BuyProductID(kProductIDSubscription);
    }

    public void BuyProductID(string productId)
    {
        // 購入済みの場合、二重課金になるため何もしない
        if (alreadyBuy == true)
        {
            // 既に購入済みの旨を通知
            // 購入済みのため何もしない。
            return;
        }

        // 購入処理の途中でもう一度購入ボタンを押下された場合は何もしない
        if(nowBuyTransaction == true)
        {
            Debug.Log("購入処理中のためしばらくお待ちください。");
            return;
        }

        nowBuyTransaction = true;
        try
        {
            if (IsInitialized())
            {
                Product product = m_StoreController.products.WithID(productId);
                if (product != null && product.availableToPurchase)
                {
                    Debug.Log(string.Format("Purchasing product asychronously: '{0}' - '{1}'", product.definition.id, product.definition.storeSpecificId));
                    // 購入処理開始
                    m_StoreController.InitiatePurchase(product);
                }
                // Otherwise ...
                else
                {
                    Debug.Log("BuyProductID: FAIL. Not purchasing product, either is not found or is not available for purchase");
                    // エラーダイアログの表示
                }
            }
            // Otherwise ...
            else
            {
                Debug.Log("BuyProductID FAIL. Not initialized.");
            }
        }
        // 例外ハンドリング
        catch (Exception e)
        {
            Debug.Log("BuyProductID: FAIL. Exception during purchase. " + e);
            // エラーダイアログの表示
        }
    }

    // IStoreListener:各コールバック呼び出し時の処理
    public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
    {
        Debug.Log("OnInitialized: PASS");
        m_StoreController = controller;
        m_StoreExtensionProvider = extensions;
        m_AppleExtensions = extensions.GetExtension<IAppleExtensions>();

        Dictionary<string, string> introductory_info_dict = m_AppleExtensions.GetIntroductoryPriceDictionary();

        Debug.Log("Available items:");

        foreach (var item in controller.products.all)
        {
            if (item.availableToPurchase)
            {
                Debug.Log(string.Join(" - ",
                    new[]
                    {
                        item.metadata.localizedTitle,
                        item.transactionID,
                        item.receipt
                    }));
                if (item.receipt != null)
                {
                    if (item.definition.type == ProductType.Subscription)
                    {
                        if (CheckIfProductIsAvailableForSubscriptionManager(item.receipt))
                        {
                            string intro_json = (introductory_info_dict == null || !introductory_info_dict.ContainsKey(item.definition.storeSpecificId)) ? null : introductory_info_dict[item.definition.storeSpecificId];
                            SubscriptionManager p = new SubscriptionManager(item, intro_json);
                            SubscriptionInfo info = p.getSubscriptionInfo();

                            // 有効期限切れか確認する
                            if (Result.True == info.isSubscribed())
                            {
                                // 有効期限切れかつキャンセル処理された
                                if (Result.True == info.isCancelled())
                                {
                                    // 自動継続されないため、再購入を可能とする。
                                }
                                // キャンセルされていない場合
                                else
                                {
                                    // エラーダイアログの表示
                                 }
                            }
                        }
                        else
                        {
                            Debug.Log("This product is not available for SubscriptionManager class, only products that are purchase by 1.19+ SDK can use this class.");
                        }
                    }
                    else
                    {
                        Debug.Log("the product is not a subscription product");
                    }
                }
                else
                {
                    Debug.Log("the product should have a valid receipt");
                }
            }
        }
    }


    public void OnInitializeFailed(InitializationFailureReason error)
    {
        Debug.Log("OnInitializeFailed InitializationFailureReason:" + error.ToString());
        // エラーダイアログの表示
    }


    public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
    {
        if (String.Equals(args.purchasedProduct.definition.id, kProductIDSubscription, StringComparison.Ordinal))
        {
            Product product = args.purchasedProduct;
            string transactionID = args.purchasedProduct.transactionID; // 処理のトランザクションID
            var receipt = args.purchasedProduct.receipt;                // 受領したレシート(J-SON形式)

            StartCoroutine(ReceiptVerification(product, transactionID, receipt, ReceiptVerificationError));

            // 一旦ペンディングで返す
            return PurchaseProcessingResult.Pending;
        }
        else
        {
            Debug.Log(string.Format("ProcessPurchase: FAIL. Unrecognized product: '{0}'", args.purchasedProduct.definition.id));
            // エラーダイアログの表示
            );

        }
        return PurchaseProcessingResult.Complete;
    }


    public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason)
    {
        nowBuyTransaction = false;
        Debug.Log(string.Format("OnPurchaseFailed: FAIL. Product: '{0}', PurchaseFailureReason: {1}", product.definition.storeSpecificId, failureReason));

        string errorMsg = "";
        switch (failureReason)
        {
        }

        // エラーダイアログの表示
    }

    // レシート検証(サーバー処理)
    IEnumerator ReceiptVerification(Product product, string transactionID, string receipt, UnityAction<NCMBException> errorCallback)
    {

    }

    // エラーコールバック時の処理
    public void ReceiptVerificationError(NCMBException exeption = null)
    {

    }

    // サブスクリプションマネージャーが使える製品か判定
    private bool CheckIfProductIsAvailableForSubscriptionManager(string receipt)
    {
    }
}

 試したこと

インターネットを調査してもいい方法が思い浮かばず、unityJapanに問い合わせをしましたが、
フォーラムに記載して回答を待つか、有料サービスでご相談に乗りますといわれて頓挫しています。

 補足情報(FW/ツールのバージョンなど)

Unity:2018.2.5 UnityIAP:1.20.1 
対象はiphone、iPadのみです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • iOSに関する質問
  • UnityIAP サブスクリプション型アイテム購入 sandboxでのテストで自動継続されたかアプリ起動中に確認できない