UDP パッケージを使用したアプリ内課金 (IAP) の実装
UDP 用にゲームにアプリ内課金 (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 カタログを作成する必要があります。
- Unity エディターバージョン 2020.1 以降の場合は、[Project Settings] ウィンドウで Unity Distribution Portal 設定を開き、Go to IAP Catalog を選択します。
Unity エディターバージョン 2019.4 以下の場合は、UDP Settings インスペクターウィンドウを開きます。 - IAP Catalog で、各 IAP プロダクトの情報を入力します。
- アプリストアで有効になるように、Product ID の要件に従います。
- ゲームで定義した IAP プロダクトに、IAP カタログで設定したものと同じ Product ID を使用してください。
- 個々の IAP プロダクトを UDP コンソールに保存するには、プロダクトの横にあるドロップダウンで Push を選択します。
- すべての IAP プロダクトを UDP コンソールに保存するには、上のほうにある Push を選択します。
- すべての IAP プロダクトを UDP コンソールに保存するには、上のほうにある Push を選択します。
- さらにプロダクトを加えるには、Add new IAP を選択します。
IAP Catalog が正しく保存されていることを確認するには、加えたアイテムが UDP コンソールに表示されていることを確認します。
UDP を実装、設定したら、 手順に従って ゲームのビルド を行ってください。