docs.unity3d.com
    目次を表示する/隠す

    UDP パッケージを使用したアプリ内課金 (IAP) の実装

    UDP 用にゲームにアプリ内課金 (IAP) を実装するには、以下を行います。

    1. パートナーストアのインベントリの照会
    2. IAP プロダクトの購入
    3. 購入プロダクトの消費
    4. クライアント側のインテグレーションの検証
    5. サーバーで購入を検証
    6. IAP カタログの入力

    これらのステップを終了後に、 ゲームのビルド を行えます。

    パートナーストアのインベントリを照会 (クエリ)

    初期化が成功したら、QueryInventory メソッドを呼び出します。このメソッドはパートナーストアのインベントリを照会します。

    このメソッドを以下に使用できます。

    • 消費していない IAP プロダクトを確認
    • 配信されていない購入済プロダクトを確認
    • プロダクトの詳細を照会

    このメソッドは、非消費型の購入 とまだ消費されていない 消費型の購入 のプロダクト情報 (プロダクト名、ID、価格、説明) を返します。

    例えば、これにより、アプリケーションのクラッシュ後に未消費の購入を復元できます。


    ゲームから UDP インベントリにクエリを送信

    プロダクト ID を指定すると、指定した IAP プロダクトのプロダクト情報を取得できます。

    StoreService.QueryInventory(List<string> productIds, IPurchaseListener listener);
    

    プロダクト ID を指定しなければ、すべての IAP プロダクトのプロダクト情報を取得できます。

    StoreService.QueryInventory(IPurchaseListener listener);
    

    購入サービスに関連するイベントの リスナー を実装します。

    以下は例です。

    using UnityEngine;
    using UnityEngine.UDP;
    
    public class PurchaseListener : IPurchaseListener
    {
        public void OnPurchase(PurchaseInfo purchaseInfo)
        {
            // 購入は成功しました。
             //購入したプロダクトが消費型の場合は、ここで消費する必要があります。
            // そうでない場合は、プロダクトを配信します。
        }
    
        public void OnPurchaseFailed(string message, PurchaseInfo purchaseInfo)
        {
            Debug.Log("Purchase Failed: " + message);
        }
    
        public void OnPurchaseRepeated(string productCode)
        {
            //  queryInventory をサポートしないストアもあります
    
        }
    
        public void OnPurchaseConsume(PurchaseInfo purchaseInfo)
        {
            // 消費は成功しました。
             //ここでプロダクトを配信する必要があります。     
        }
    
        public void OnPurchaseConsumeFailed(string message, PurchaseInfo purchaseInfo)
        {
            // 消費が失敗しました
        }
    
        public void OnQueryInventory(Inventory inventory)
        {
            // クエリしたインベントリは成功しました
        }
    
        public void OnQueryInventoryFailed(string message)
        {
            // クエリしたインベントリは失敗しました
        }
    
        public void OnPurchasePending(string message, PurchaseInfo purchaseInfo)
        {
            // 購入は保留中です
        }
    }
    

    IAP プロダクトの購入

    ゲームから購入リクエストを開始するには、ユーザーがアイテムを購入するときに Purchase メソッドを呼び出します。UDP は購入レシートを自動的にチェックして、購入が有効であることを確認します。


    ゲームから UDP に購入リクエストを送信

    Purchase メソッドを呼び出すときは、以下の情報を入力してください。

    • productId - プレイヤーが購入したい IAP プロダクトの一意の識別子。
    • developerPayload - UDP SDK に送信する情報。
    • IPurchaseListener - すべての購入関連イベントの結果を通知するリスナー。

    例:

    StoreService.Purchase(string productId, string developerPayload, IPurchaseListener listener);
    

    ノート: IAP を用いるゲームには Purchase メソッドが必要です。

    購入が完了すると、UDPはゲームに情報を返します。

    一部のパートナーストアの支払いゲートウェイは、リアルタイムで支払いのコールバックを取得できません。これにより、UDP が支払いの SUCCESS または FAILED コールバックをすばやく受信することが妨げられる場合があります。このような場合、UDP はコールバックを FAILED と見なします。この問題を解決するために、サーバーで 注文の照会 を行い最新のステータスを取得することをお勧めします。

    オンラインゲームの場合、コールバック通知を通してゲームサーバーで購入を確認できます。UDP は、Unity Distribution Portal 設定 で指定した URL にコールバック通知を送信します。

    プロダクトの消費

    消費型プロダクトでは、ゲームが Consume (消費) 要求を UDP SDK に送信する必要があります。ゲームは、プロダクトが消費されると、それを配信します。こうすることにより、プロダクトが消費される前に繰り返し配信されるのを防ぎます。

    ノート: OnPurchase は PurchaseInfo を返します。

    PurchaseListener クラスの OnPurchase イベントで、アイテムが消費型であるかどうかを確認します。アイテムが消費型である場合は、アイテムを消費し、PurchaseListener クラスの OnPurchaseConsume イベントで購入したプロダクトのゲームロジックを実装します。以下はその例です。

    StoreService.ConsumePurchase(PurchaseInfo, IPurchaseListener);
    // 購入のゲームロジックを実装
    


    ゲームから UDP に消費リクエストを送信

    クライアント側のインテグレーションを検証

    UDP は、クライアント側の検証を自動的に実行します。ユーザーが IAP プロダクトを購入すると、パートナーストアはペイロードと署名を返します。次に、UDP SDK が署名を検証します。検証が失敗すると、購入も失敗します。

    サーバーで購入を検証

    以下のいずれかの方法でサーバー側で購入を検証できます。

    • 注文の照会
    • コールバック通知を受信

    ノート: Huawei AppGallery ストアでは、現在、コールバック通知はサポートされていません。

    UDP のサンドボックス環境でサーバー側の実装をテストできます。

    注文の照会

    ゲームは、HTTP GET リクエストを呼び出すことで、注文について UDP に照会できます。


    注文について UDP に照会 (クエリ)

    GET https://distribute.dashboard.unity.com/udp/developer/api/order?orderQueryToken=<orderQueryToken>&orderId=<orderId>&clientId=<clientId>&sign=<sign>

    API は、以下の理由で "未確認" ステータスを返します。

    • 現在、このストアの注文ステータスを取得できない
    • このストアは、リアルタイムの注文ステータスクエリをサポートしていない

    このような場合、間隔を置いて QueryOrder API を再試行してください。ストアは (ほぼリアルタイムで) コールバックを UDP に送信し、UDP はステータスをゲームに返すことができます。

    OrderQuery パラメーター の情報は、こちらを参照してください。

    コールバック通知の受信

    購入が成功した後、Callback URL を指定すると、UDP サーバーはゲームサーバーに支払い結果を通知します。HTTP POST リクエストを実装し、JSON 形式で以下のリクエストボディを受信してください。

    属性名 形式 必須/任意 Description (説明)
    payload JSON 文字列 必須 購入注文の内容。詳しくは、JSON ペイロード を参照してください。
    signature 文字列 必須 PKCS1v1.5 ペイロード署名

    署名の使用

    証明書の検証には、Unity クライアント RSA 公開鍵を使用します。証明書が検証に合格した場合は、証明書から RSA 公開鍵を抽出し、この鍵を使用して署名を検証します。署名を生成するには、RSA-SHA1 アルゴリズムを使用してペイロードを暗号化します。

    以下は例です。

    公開鍵

    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4qxbtUqsrvwk2FZ+F2J0EkUDKLdZSVE3qPgxzKxOrgScGrCZULLav9CPzRP91HN9GccvmShH2bsegP3RVtMdwU1eV7C2JdOW1sylCyKIgylCT8tLdQeUMRaIlt7fOfl+k3bkUouWJx8WnrQYM6a7oDeCGklIlekvpQ2NcS1eg7Jp646vBzyu8FMBiuj5LZOhCJg/XXs0kRpvSOBAPndUu/HgqD9aFaXNZBxMN++efxq6PnAVRzRdTtRur+OZSBGjXxgaBKrdbXCkEM3fkMgXP9egq6vnzCiQhZ7UDFXtXQ3DPqviqrTY5WsR9t4X6JxCXo6yGlQAEK/ft9MWN13nrQIDAQAB
    

    リクエストボディ

    {
        "signature": "swWWZpg0/Y26XBohvqqC/for4nyhS5zwzru5s8AJI7YYC+ECHOk7KQjOyFw7cWxM3QNpd7N7E7Umy3vYwDXjV2Y4BLnuJy5gGIpO5jKU4xBNQf793FmI0Fk93YrU31QyiIjXymg1O/H1nKSJXqMz6bycBugiStqsuGp1/CctTHE0Dpv4hC6fZoNWIHYpPJQuKh4DyP1lgE32omcuKUh7IAQduRPDa+qiYJRCA8bV17xK6T8ajS3RlhKue9hjE2a21t8p017ViaOS5OWdzptUwgnWaFi6gs1k0cjdn7o/0QJEgk5j6a8WYE/S8F7YfsYcAwUQV4KY3ex0ULsH3GQEGA==",
    
        "payload": "{\"ClientId\":\"Q_sX9CXfn-rTcWmpP9VEfw\",\"CpOrderId\":\"0bckmoqhel5yd13f\",\"ProductId\":\"com.mystudio.mygame.productid1\",\"ChannelType\":\"APTOIDE\",\"Currency\":\"APPC\",\"Amount\":\"1.01\",\"Country\":\"CHINA\",\"Quantity\":1,\"Rev\":\"0\",\"Status\":\"SUCCESS\",\"PaidTime\":\"2018-09-28T06:43:20Z\",\"Extension\":\"{\\\"key\\\":\\\"value\\\"}\"}"
    }
    

    証明書の検証方法を示すコードサンプル

    func verify(data []byte, publicKey string, sign string) bool {
        decodePublic, err := base64.StdEncoding.DecodeString(publicKey)
        if err != nil {
            panic(err)
        }
    
        pubInterface, err := x509.ParsePKIXPublicKey(decodePublic)
        if err != nil {
            panic(err)
        }
    
        pub := pubInterface.(*rsa.PublicKey)
        decodeSign, err := base64.StdEncoding.DecodeString(sign)
        if err != nil {
            return false
        }
    
        sh1 := sha1.New()
        sh1.Write(data)
        hashData := sh1.Sum(nil)
    
        err = rsa.VerifyPKCS1v15(pub, crypto.SHA1, hashData, decodeSign)
        if err != nil {
            return false
        }
        return true
    }
    

    IAP カタログの入力

    Unity は、UDP コンソールに IAP プロダクトを加えることをお勧めします。これにより、IAP を定義するためのより多くのオプションが提供されるからです。 ただし、Unity エディターと UDP コンソールが正しく同期することをテストするために、エディターに少なくとも 1 つの IAP を作成することをお勧めします。

    ノート: ゲームクライアントで IAP カタログ を使用しない場合 (例えば、IAP アイテムがゲームサーバーでのみ維持されている場合など) であっても、UDP コンソールで IAP カタログを作成する必要があります。

    1. Unity エディターバージョン 2020.1 以降の場合は、[Project Settings] ウィンドウで Unity Distribution Portal 設定を開き、Go to IAP Catalog を選択します。
      Unity エディターバージョン 2019.4 以下の場合は、UDP Settings インスペクターウィンドウを開きます。
    2. IAP Catalog で、各 IAP プロダクトの情報を入力します。
      1. アプリストアで有効になるように、Product ID の要件に従います。
      2. ゲームで定義した IAP プロダクトに、IAP カタログで設定したものと同じ Product ID を使用してください。
    3. 個々の IAP プロダクトを UDP コンソールに保存するには、プロダクトの横にあるドロップダウンで Push を選択します。
      1. すべての IAP プロダクトを UDP コンソールに保存するには、上のほうにある Push を選択します。
    4. さらにプロダクトを加えるには、Add new IAP を選択します。

    IAP Catalog が正しく保存されていることを確認するには、加えたアイテムが UDP コンソールに表示されていることを確認します。

    UDP を実装、設定したら、 手順に従って ゲームのビルド を行ってください。

    トップに戻る
    Copyright © 2023 Unity Technologies — 商標と利用規約
    • 法律関連
    • プライバシーポリシー
    • クッキー
    • 私の個人情報を販売または共有しない
    • Your Privacy Choices (Cookie Settings)