不正行為や不正使用に対処する¶
このドキュメントでは、不正行為や不正使用に対するXGの仕組みや仕様について説明します。
レシート検証¶
課金アイテム¶
ストア共通¶
課金アイテム購入APIのリクエストに含まれる商品IDがXGに登録されている商品IDであることを確認します。
課金アイテム購入APIのリクエストの購入トークン(PurchaseToken)やトランザクションID(TransactionID)が使用済みでないことを確認します。
リクエストのユーザーと同一ユーザーで使用済みの場合は、処理済みとして成功レスポンスを返却します。
リクエストのユーザーと異なるユーザーで使用済みの場合は、クライアントエラーとしてエラーレスポンスを返却します。
App Store¶
App Store Server APIの Get Transaction Info が成功することを確認します。
XG Developer Siteに登録されている認証情報と 課金アイテム購入(App Store)API のリクエストの商品ID・トランザクションID(TransactionID)を使用します。
XG 本番環境: App Store Server APIの本番環境にリクエストして失敗した場合(エラーコード4040010)はサンドボックス環境にリクエストします。
XG サンドボックス環境: App Store Server APIのサンドボックス環境にリクエストします。
Get Transaction Info のレスポンスに返金理由(revocationReason)が含まれないことを確認します。
Get Transaction Info のレスポンスのproductIdと購入処理APIのリクエストの商品IDが一致することを確認します。
Get Transaction Info のレスポンスのpriceとXGに登録されている商品情報の価格が一致することを確認します。
Get Transaction Info のレスポンスのappAccountTokenと購入処理APIのリクエストのXGユーザーIDが一致することを確認します。
appAccountTokenが設定されている場合のみ検証します。
DMM GAMES¶
Reciboサーバーからのレシート情報の取得が成功することを確認します。
XG Developer Siteに登録されている認証情報と 課金アイテム購入(DMM GAMES)API のリクエストの商品ID・購入トークン(PurchaseToken)を使用します。
取得したレシート情報のproductIdと購入処理APIのリクエストの商品IDが一致することを確認します。
取得したレシート情報のpriceとXGに登録されている商品情報の価格が一致することを確認します。
レシート情報の取得 ドキュメント一覧
Google Play¶
Google Play Developer APIの purchases.products.get が成功することを確認します。
XG Developer Siteに登録されている認証情報と 課金アイテム購入(Google Play)API のリクエストの商品ID・購入トークン(PurchaseToken)を使用します。
purchases.products.get のレスポンスの購入ステータス(purchaseState)が購入済み(0)であることを確認します。
purchases.products.get のレスポンスのobfuscatedExternalAccountIdと購入処理APIのリクエストのXGユーザーIDが一致することを確認します。
obfuscatedAccountIdが設定されている場合のみ検証します。
サブスクリプション¶
ストア共通¶
サブスクリプション購入APIのリクエストのトランザクションID(TransactionID)が使用済みでないことを確認します。
リクエストのユーザーと同一ユーザーで使用済みの場合は、処理済みとして成功レスポンスを返却します。
リクエストのユーザーと異なるユーザーで使用済みの場合は、クライアントエラーとしてエラーレスポンスを返却します。
サブスクリプション購入APIのリクエストで指定したサブスクリプションが、他ストアでアクティブなサブスクリプションとして利用されていないことを確認します。
他ストアで同一のアクティブなサブスクリプションが存在する場合はエラーレスポンスを返却します。
同一サブスクリプションかどうかはサブスクリプション商品マスタのサブスクリプションIDで判定します。
App Store¶
Get Transaction Info のレスポンスの商品タイプ(type)がサブスクリプションであることを確認します。
消耗型(Consumable) / 非消耗型(NonConsumable)はサブスクリプションでは対象外のためエラーレスポンスを返却します。
Get Transaction Info のレスポンスのトランザクション理由(transactionReason)とリクエストの種別が一致することを確認します。
サブスクリプション購入APIに継続時のトランザクションID(TransactionID)が指定されている場合はエラーレスポンスを返却します。
サブスクリプション継続APIに購入時のトランザクションID(TransactionID)が指定されている場合はエラーレスポンスを返却します。
Get Transaction Info のレスポンスのproductIdと購入処理APIのリクエストの商品IDが一致することを確認します。
Get Transaction Info のレスポンスに返金理由(revocationReason)が含まれないことを確認します。
Get Transaction Info のレスポンスのpriceとXGに登録されている価格が一致することを確認します。
オファーが適用されていない場合は、XGに登録されている商品情報の価格と一致することを確認します。
オファーが適用されている場合は、オファーの種別(offerDiscountType)に応じて以下の価格と一致することを確認します。
初回無料(FreeTrial): priceが0であることを確認します。
初回割引(PayUpFront): XGに登録されているオファーの価格と一致することを確認します。
都度払い(PayAsYouGo): XGでは未対応のオファー種別のためエラーレスポンスを返却します。
Get Transaction Info のレスポンスのappAccountTokenと購入処理APIのリクエストのXGユーザーIDが一致することを確認します。
サブスクリプションでは
appAccountTokenの設定が必須のため、未設定の場合はエラーレスポンスを返却します。
DMM GAMES¶
Reciboサーバーの 購入済み定期購入取得API による定期購入情報の取得が成功することを確認します。
XG Developer Siteに登録されている認証情報と サブスクリプション購入(DMM GAMES)API のリクエストの商品ID・購入トークン(PurchaseToken)を使用します。
購入済み定期購入取得API のレスポンスのacknowledgementStateが
Pendingであることを確認します。購入済み定期購入取得API のレスポンスのsubscriptionStateが
Activeであることを確認します。購入済み定期購入取得API のレスポンスのproductIdと サブスクリプション購入(DMM GAMES)API のリクエストの商品IDが一致することを確認します。
オファーが適用されている場合、 購入済み定期購入取得API のレスポンスのofferIdとXGに登録されているオファーのオファーIDが一致することを確認します。
Google Play¶
Google Play Developer APIの purchases.subscriptionsv2.get および orders.get が成功することを確認します。
XG Developer Siteに登録されている認証情報と サブスクリプション購入(Google Play)API のリクエストの商品ID・購入トークン(PurchaseToken)を使用します。
purchases.subscriptionsv2.get のレスポンスのsubscriptionStateが
SUBSCRIPTION_STATE_ACTIVEであることを確認します。subscriptionStateが
SUBSCRIPTION_STATE_ACTIVE以外の場合は、それぞれの状態に応じたエラーレスポンスを返却します。
purchases.subscriptionsv2.get のレスポンスのproductIdと サブスクリプション購入(Google Play)API のリクエストの商品IDが一致することを確認します。
オファーが適用されている場合、 purchases.subscriptionsv2.get のレスポンスのofferIdとXGに登録されているオファーのオファーIDが一致することを確認します。
purchases.subscriptionsv2.get のレスポンスのobfuscatedExternalAccountIdと サブスクリプション購入(Google Play)API のリクエストのXGユーザーIDが一致することを確認します。
サブスクリプションでは
obfuscatedAccountIdの設定が必須のため、未設定の場合はエラーレスポンスを返却します。