コンテンツにスキップ

Android Play Store レビュー ガイドラインの IAP

GitHub

Google PlayでAndroidアプリを承認するには、特にアプリ内課金やサブスクリプションがあるアプリの場合、Googleのポリシーに準拠する必要があります。このガイドでは、レビューを通過するために必要なすべての内容をカバーしています。

  1. 署名されたAndroidアプリバンドルを作成する

    新しいGoogle Playアプリは、.aabではなく、サイドロードされたデバッグAPKとしてアップロードするのではなく、アンドロイドアプリバンドルとしてアップロードする必要があります。

    アプリを安全に保管する versionCode アップロードごとに

    アプリバンドルフロー

  2. Play Consoleでアプリレコードを作成する

    開発者アカウントを持っていない場合は、ここから始めてください Play Console のサインアップ. Then, in Home > アプリ作成、言語、アプリ/ゲームの種類、無料/有料のステータス、サポートメール、必要な宣言を受け入れる。

    無料/有料の設定を慎重に選択してください。 Google は、有料アプリを無料に変更することを許可していますが、無料で提供されたアプリは有料に変更することはできません。

    Play Console でアプリを作成

  3. アプリの内容とストアのリスト

    生産レビュー前に、必要な Play Console の宣言を完了してください:

    • プライバシーポリシー
    • 広告
    • アプリへのアクセス
    • 対象読者とコンテンツ
    • コンテンツ評価
    • データセキュリティ
    • 適用する場合の敏感なパーミッションの宣言
  4. Play-インストールされたテストトラックを実行

    開始する 内部テスト 迅速なQAのために。開発者アカウントが個人アカウントで、2023年11月13日以降に作成されている場合、また、14日間連続して閉鎖テストを実施し、少なくとも12名のテスターをオプティンする必要があります。 閉鎖テスト Play Consoleの内部テスト

    請求の終端までの検証

  5. Google Playからアプリをインストールせず、ローカルにエクスポートされたAPKからインストールしないよう確認する

    __CAPGO_KEEP_0__

    • Playから正しく商品が読み込まれます
    • ライセンステスター向けの購入シートに表示される テスト購入 ライセンステスター向けの購入シートに表示される
    • 購入後、エンタイトルメントが解除されます
    • 購入とサブスクリプションの管理フローが正常に動作します

Google Play Billing Requirements

Google Play Billing Requirements

Mandatory Billing System

Mandatory Billing System

デジタル商品やサービスを扱う場合、必ず must Google Playの請求システムを使用する:

Digital Goods (Play Billingを使用する必要があります):

  • プレミアム機能のサブスクリプション
  • インゲーム通貨またはクレジット
  • デジタルコンテンツ(eブック、音楽、ビデオ)
  • ゲームアップグレードとパワーアップ
  • アプリのアンロックとプレミアム階層

Physical Goods (Play Billingを使用することができません):

  • 実物品
  • 実世界のサービス
  • 非営利団体への一時的な寄付

:::note サブスクリプション設定 Play Consoleで、現在のAndroidサブスクリプションを設定する サブスクリプション -> 基本プラン -> 提供 モデル。 In native-purchases, 基本プランIDをパスする planIdentifier. :::

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Ensure billing is available on the device
const { isBillingSupported } = await NativePurchases.isBillingSupported();
if (!isBillingSupported) throw new Error('Google Play Billing not available');
// Fetch subscription products (Store data is required—never hardcode pricing)
const { products } = await NativePurchases.getProducts({
productIdentifiers: ['premium_monthly', 'premium_yearly'],
productType: PURCHASE_TYPE.SUBS,
});
// Plan identifiers are the Base Plan IDs you create in Google Play Console
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly',
planIdentifier: 'monthly-plan', // REQUIRED on Android, ignored on iOS
productType: PURCHASE_TYPE.SUBS,
});
console.log('Purchase token for server validation:', transaction.purchaseToken);

購入前にすべてのコストを明確に開示することが必要です:

必要な要素:

Google Playは購入前にすべてのコストを明確に開示することを義務付けていて

Google Playは購入前にすべてのコストを明確に開示することを義務付けていて

  • ユーザーのローカル通貨での正確な価格
  • 請求頻度(月額、年額など)
  • サブスクリプションに含まれるもの
  • 導入オファーの合計コスト
  • 課金が発生する時期

UI デザインのベスト プラクティス

例:UI の適切な実装

function SubscriptionCard({ product }) {
return (
<div className="subscription-card">
<h3>{product.title}</h3>
{/* Show intro offer if available */}
{product.introductoryPrice && (
<div className="intro-offer">
<p className="intro-price">{product.introductoryPriceString}</p>
<p className="intro-period">
for {product.introductoryPricePeriod}
</p>
</div>
)}
{/* Regular price */}
<div className="regular-price">
<p className="price">{product.priceString}</p>
<p className="period">per {product.subscriptionPeriod}</p>
</div>
{/* Clear description */}
<p>{product.description}</p>
{/* Renewal terms */}
<p className="terms">
Renews automatically. Cancel anytime in Google Play.
</p>
<button onClick={() => handlePurchase(product)}>
Subscribe Now
</button>
</div>
);
}

Google は、サブスクリプションが自動更新される前に、以下の条件を満たす必要があります。

  • 再生期の通知が明確に表示される
  • __CAPGO_KEEP_0__
  • キャンセルを簡単に実行できる

プラットフォーム間の価格明確性

「プラットフォーム間の価格明確性」

同じエンタイトルメントを複数のプラットフォームで販売する場合、製品名、請求期間、付属サービス、更新の言語を統一して、ユーザーが驚かれないようにしてください。

価格は税金、ローカル通貨、またはストアの経済的要因によって異なる場合がありますが、購入UIはそれらの差異を隠すことはできず、Google Playが請求する更新コストと異なる更新コストを暗示することはできません。

プライバシーポリシーの要件

「プライバシーポリシーの要件」

プライバシーポリシーは必須です

Section titled “Mandatory Privacy Policy”

If your app includes in-app purchases, you must:

  1. Link in Play Store Listing

    • Add privacy policy URL in Play Console
    • Must be publicly accessible
    • Must be in the same language as your app
  2. Link Within App

    • Display privacy policy in app settings
    • Show before collecting any user data
    • Make easily discoverable

Example Implementation:

function SettingsScreen() {
const openPrivacyPolicy = () => {
window.open('https://yourapp.com/privacy', '_blank');
};
const openTerms = () => {
window.open('https://yourapp.com/terms', '_blank');
};
return (
<div>
<h2>Settings</h2>
<button onClick={openPrivacyPolicy}>
Privacy Policy
</button>
<button onClick={openTerms}>
Terms of Service
</button>
<button onClick={() => NativePurchases.manageSubscriptions()}>
Manage Subscriptions
</button>
</div>
);
}

Google Playでは、データセキュリティセクションで詳細な披露が必要です:

IAPアプリの場合、次のことを宣言してください:

  • 購入履歴の収集
  • 受領のためのメールアドレス
  • 不正防止のためのデバイスID
  • 決済情報の取り扱い
  • 分析データの収集

データセキュリティセクションは法的拘束力があります。不正確な宣言はアプリの削除につながる可能性があります。

Google Playのレビューは、バイナリだけに限ったものではありません。生産用のリリース前に、以下のことを確認してください。 ポリシーとプログラム > アプリの内容.

レビューするには、以下の最低限の情報を確認してください:

  • プライバシーポリシー: Play Consoleの公開URL、必要に応じてインストール時に表示されるエントリポイント
  • 広告: アプリが広告を含んでいるかどうかを宣言する
  • アプリへのアクセス: ゲートされたスクリーンがあれば、レビュアーにワークイングクレデンシャルまたは明確なテストパスを提供する
  • 対象読者とコンテンツ: アプリの実際の対象読者と一致させる
  • コンテンツの評価: __CAPGO_KEEP_0__を完了してアプリが未評価でないようにする
  • データセーフティ: 正確に収集、共有、セキュリティの実践を宣言する

なぜ失敗するのか:

  • デジタル商品の購入にGoogle Play Billingを使用していない
  • 古い課金APIを使用している
  • サブスクリプションのためのカスタムの支払いソリューションを実装している

防止法:

// ✅ Correct: Use native-purchases (uses Google Play Billing)
await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly',
planIdentifier: 'monthly-plan',
productType: PURCHASE_TYPE.SUBS,
});
// ❌ Wrong: Custom payment processor for subscriptions
// await CustomPayment.charge(user, 9.99);

2. 不明確な価格または非公開のコスト

「2. 不明確な価格または非公開のコスト」のセクション

なぜ失敗するのか:

  • 購入ボタンをクリックするまで価格が表示されない
  • 追加の料金が事前に明示されていない
  • 曖昧なサブスクリプションの条項

予防対策:

function PurchaseScreen({ product }) {
return (
<div>
{/* Show ALL costs upfront */}
<h2>Premium Subscription</h2>
<div className="pricing">
<p className="price">{product.priceString}/month</p>
<p className="taxes">Taxes may apply based on location</p>
</div>
<div className="features">
<h3>Includes:</h3>
<ul>
<li>Ad-free experience</li>
<li>Unlimited cloud storage</li>
<li>Priority support</li>
</ul>
</div>
<div className="terms">
<p>
Subscription renews automatically unless cancelled at least
24 hours before the end of the current period.
</p>
<p>
Manage or cancel in Google Play Subscriptions.
</p>
</div>
<button onClick={handlePurchase}>
Start Subscription
</button>
</div>
);
}

3. 欺瞞的なサブスクリプション パターン

セクション「3. 欺瞞的なサブスクリプション パターン」

なぜ失敗するのか:

  • プレミアムオプションの事前選択
  • 安価な代替品を隠す
  • キャンセルを困難にする
  • 偽の緊急性(「残り 3 つだけ!」)

説明のベスト プラクティス

マーケティング ガイドライン

予防対策:

  • すべてのサブスクリプションのレベルを同等に表示する
  • キャンセルを明確かつアクセス可能に表示する
  • カウントダウンタイマーや偽の限界感を避ける
  • 高額なオプションを押し付けるために暗いパターンを使わない

なぜ失敗するのか:

  • 購入時にアプリがクラッシュする
  • 製品が読み込まれない
  • 購入確認画面が表示されない
  • プレミアム機能が購入後に解除されない
  • テストはサイドロードされたビルドのみで行われ、Playストアでインストールされたテストトラックでは行われなかった

予防:

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Comprehensive testing before submission
async function testPurchaseFlow() {
try {
// 1. Test product loading
const { products } = await NativePurchases.getProducts({
productIdentifiers: ['premium_monthly', 'premium_yearly'],
productType: PURCHASE_TYPE.SUBS,
});
console.log('✓ Products loaded:', products.length);
// 2. Test purchase flow
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly',
planIdentifier: 'monthly-plan',
productType: PURCHASE_TYPE.SUBS,
});
console.log('✓ Purchase completed', transaction.transactionId);
// 3. Verify entitlements
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
if (
purchases.some(
(purchase) =>
purchase.productIdentifier === 'premium_monthly' &&
['PURCHASED', '1'].includes(purchase.purchaseState ?? '') &&
purchase.isAcknowledged,
)
) {
console.log('✓ Premium features unlocked');
}
// 4. Test restore
await NativePurchases.restorePurchases();
console.log('✓ Restore works');
} catch (error) {
console.error('✗ Test failed:', error);
}
}

なぜ失敗するのか:

  • アプリ内にプライバシーポリシーへのリンクがない
  • プライバシーポリシーへのアクセスができない
  • データ収集の明示がされていない
  • データセーフティのセクションが不正確

予防:

  • プレイストアのリストにプライバシーポリシーを追加
  • アプリの設定にリンクを含める
  • データセキュリティのセクションを正確に埋めます
  • 新しいデータ収集を追加するときにポリシーを更新します

Googleの代替請求プログラムは地域によって異なり、変更される可能性があります。標準のGoogle Play Billing以外のものを使用したい場合は、実装前にPlay Consoleで市場の適格性、必要なAPI、披露言語を確認してください。

ユーザーは次のことができる必要があります:

  • アクティブなサブスクリプションを簡単に表示する
  • サポートに連絡することなくキャンセルする
  • キャンセルの効果がいつ発生するかを理解する

実装:

import { NativePurchases } from '@capgo/native-purchases';
function ManageSubscriptionButton() {
const openManagement = async () => {
try {
// Opens Google Play subscription management
await NativePurchases.manageSubscriptions();
} catch (error) {
// Fallback to direct URL
const playStoreUrl = 'https://play.google.com/store/account/subscriptions';
window.open(playStoreUrl, '_blank');
}
};
return (
<button onClick={openManagement}>
Manage Subscription in Google Play
</button>
);
}

必要な披露:

  • キャンセルがいつ効果を発揮する?
  • 期間終了までユーザーはアクセスを維持する?
  • 部分的な返金は利用可能?
function CancellationInfo() {
return (
<div className="cancellation-info">
<h3>Cancellation Policy</h3>
<ul>
<li>Cancel anytime in Google Play</li>
<li>Access continues until end of billing period</li>
<li>No refunds for partial periods</li>
<li>Resubscribe anytime to regain access</li>
</ul>
<button onClick={() => NativePurchases.manageSubscriptions()}>
Manage in Google Play
</button>
</div>
);
}

提出前に確認する

  1. 請求実装を確認する

    • ネイティブ購入 (native-purchases) を使用して Google Play Billing
    • Play Console で作成したすべてのサブスクリプション製品
    • 基本プランとオファーが正しく設定されている
    • 製品が有効化され、公開されている
    • すべての対象国に価格が設定されている
  2. 購入フローのテスト

    • ライセンステストアカウントを作成する
    • __CAPGO_KEEP_0__をPlayテストトラックからビルドをインストールする
    • 各サブスクリプション階層をテストする
    • 製品が正しくロードされることを確認する
    • 購入の完了をテストする
    • __CAPGO_KEEP_1__のテスト購入 購入テストバナーが表示されることを確認する プレミアム機能がアンロックされることを確認する
    • サブスクリプションの復元をテストする
    • 複数のデバイスでテストする
    • すべてのコピーをレビューする
  3. 購入前に価格が明確に表示されることを確認する

    • __CAPGO_KEEP_0__
    • すべての料金は事前に明示されます
    • サブスクリプションの条件は明確です
    • キャンセルプロセスが説明されています
    • 誤解を招くような主張はありません
  4. アプリのコンテンツとプライバシー

    • プライバシーポリシーはPlay Consoleでリンクされています
    • プライバシーポリシーはアプリ内でアクセス可能です
    • 広告の宣言は完了しています
    • アプリへのアクセス方法が追加されました。アプリがゲートされていれば
    • データの安全性のセクションは正確に完了しています
    • 許可された権限は説明されています
  5. コンテンツの評価と対象者

    • 全コンテンツレーティングアンケートを完了
    • ターゲットアウディエンスとコンテンツセクションを完了
    • 実際のコンテンツとレーティングが一致するようにする
    • アンケートでインアプリ購入を宣言する
  6. ストアリストを準備する

    • アプリの説明が正確である
    • 短い説明は80文字以内である
    • 長い説明は4000文字以内である
    • 少なくとも2つの電話画面のスクリーンショットをアップロードする
    • 1024x500の特徴グラフィックをアップロードする
    • スクリーンショットは現在のバージョンを表示する
    • 必要なすべてのアセットをアップロードする

新規個人アカウントの生産アクセス: 通常、申請後7日以内 初回の生産レビュー: しばしば数日、場合によっては請求やポリシーの質問が挙がった場合、長くなる 更新: 初回リリースよりも速い場合もあるが、依然としてレビューされる アピール: 数日間を計画し、正確な修正とレビューワーの指示を提供する

:::tip ローリングレビュー Appleと異なり、Googleはアプリを継続的にレビューします。アプリはレビュー期間中いつでも公開されることがあり、固定時間でない

  1. テストアカウントを追加:

    • プレイコンソールに移動
    • 設定 > ライセンステスト
    • テスト用にGmailアカウントを追加
  2. サンドボックスでテスト:

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Test purchases with license test account
async function testInSandbox() {
const { isBillingSupported } = await NativePurchases.isBillingSupported();
if (!isBillingSupported) {
console.error('Billing not supported in this environment');
return;
}
// Fetch products (returns test pricing when using a license tester)
const { products } = await NativePurchases.getProducts({
productIdentifiers: ['premium_monthly'],
productType: PURCHASE_TYPE.SUBS,
});
console.log('Test products:', products);
// Make test purchase (no charge)
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly',
planIdentifier: 'monthly-plan',
productType: PURCHASE_TYPE.SUBS,
});
console.log('Test purchase complete:', transaction.transactionId);
}
  1. テストバナーを検証:
    • テストアカウントで購入する場合
    • 「テスト購入」通知を確認する
    • 実際の料金は発生しません

内部テストとクローズドテスト

内部テストとクローズドテスト

リリース前の生産

  1. Capgoで 内部テスト のための迅速なQA用の 内部テスト のためのより広範なテスト
  2. 署名された .aab とテストリリースを公開
  3. テスターのメールアドレスを追加して、オプティンリンクを共有
  4. Google Playでビルドをインストールするテスターに指示してください
  5. Playでインストールされたビルドで、購入フローのエンドツーエンドのテストを実行してください
  6. 開発者アカウントが2023年11月13日以降に作成された場合は、少なくとも12人のテスターを14日間続けて閉鎖テストにオプティンさせて、生産適用前に実行してください

Google Play Billingの検証のために、Playでインストールされたテストビルドがサイドロードされたデバッグビルドではありません

ネイティブ購入のベストプラクティス

ネイティブ購入のベストプラクティス

すべての購入状態を処理する

すべての購入状態を処理する
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
async function handlePurchase(productId: string, planIdentifier?: string) {
try {
setLoading(true);
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: productId,
planIdentifier,
productType: planIdentifier ? PURCHASE_TYPE.SUBS : PURCHASE_TYPE.INAPP,
});
console.log('Purchase token:', transaction.purchaseToken ?? transaction.receipt);
// Success - check entitlements from the store
const { purchases } = await NativePurchases.getPurchases({
productType: planIdentifier ? PURCHASE_TYPE.SUBS : PURCHASE_TYPE.INAPP,
});
const isOwned = purchases.some(
(purchase) =>
purchase.productIdentifier === productId &&
(purchase.purchaseState === 'PURCHASED' || purchase.purchaseState === '1') &&
purchase.isAcknowledged,
);
if (isOwned) {
unlockPremiumFeatures();
showSuccess('Premium activated!');
}
} catch (error: any) {
// Handle specific error cases
switch (error.code) {
case 'USER_CANCELLED':
// User backed out - no error needed
console.log('Purchase cancelled');
break;
case 'ITEM_ALREADY_OWNED':
// They already own it - restore instead
showInfo('You already own this! Restoring...');
await NativePurchases.restorePurchases();
break;
case 'ITEM_UNAVAILABLE':
showError('This subscription is currently unavailable. Please try again later.');
break;
case 'NETWORK_ERROR':
showError('Network error. Please check your connection and try again.');
break;
default:
showError('Purchase failed. Please try again.');
console.error('Purchase error:', error);
}
} finally {
setLoading(false);
}
}

購入の復元を実装する

購入の復元を実装する
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
function RestorePurchasesButton() {
const [loading, setLoading] = useState(false);
const handleRestore = async () => {
setLoading(true);
try {
await NativePurchases.restorePurchases();
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
const hasSubscription = purchases.some(
(purchase) => purchase.productType === 'subs' && purchase.isAcknowledged,
);
if (hasSubscription) {
unlockPremiumFeatures();
showSuccess('Subscriptions restored!');
return;
}
// Check one-time unlocks if needed
const { purchases: iaps } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.INAPP,
});
const hasInApp = iaps.some((purchase) => purchase.productIdentifier === 'premium_unlock');
if (hasInApp) {
unlockPremiumFeatures();
showSuccess('Previous purchases restored!');
return;
}
showInfo('No previous purchases found.');
} catch (error) {
showError('Failed to restore purchases. Please try again.');
} finally {
setLoading(false);
}
};
return (
<button onClick={handleRestore} disabled={loading}>
{loading ? 'Restoring...' : 'Restore Purchases'}
</button>
);
}

サブスクリプションのステータスを確認

サブスクリプションのステータスを確認するセクション
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
async function checkSubscriptionStatus() {
try {
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
const subscription = purchases.find(
(purchase) =>
purchase.productIdentifier === 'premium_monthly' &&
(purchase.purchaseState === 'PURCHASED' || purchase.purchaseState === '1') &&
purchase.isAcknowledged,
);
if (!subscription) {
showPaywall();
return;
}
console.log('Subscription active:', {
productId: subscription.productIdentifier,
expiresAt: subscription.expirationDate,
willRenew: subscription.willCancel === false,
purchaseToken: subscription.purchaseToken,
});
unlockPremiumFeatures();
} catch (error) {
console.error('Failed to check subscription:', error);
}
}

料金ポリシー:

  • Google Play Billingを使用していない
  • 誤解を招くサブスクリプションの条件
  • 非表示のコスト

ユーザーデータポリシー:

  • プライバシーポリシーの欠如
  • データセキュリティの宣言の不正確さ
  • 過剰な権限
  1. 違反通知を確認する

    • 特定のポリシーを読む
    • Googleがフラグした内容を理解する
    • 提供された例を確認する
  2. 問題を修正する

    • 根本的な原因を解決せずに症状だけを治す
    • 修正後、徹底的にテストする
    • すべての変更をドキュメント化
  3. 提出できる場合は申し立て

    説明と申し立てのプロセス

    Subject: Policy Violation Appeal - [App Name]
    Dear Google Play Review Team,
    I have received notification that my app violates [Policy X.Y].
    I have made the following changes to comply:
    1. [Specific change made]
    2. [Specific change made]
    3. [Specific change made]
    The updated version [version number] addresses all concerns raised.
    Test account for verification:
    Email: test@example.com
    Password: TestPass123
    Thank you for your consideration.

    ドキュメントの例を要求

  4. 再提出または更新

    • 修正版をアップロード
    • 再提出のためのレビュー
    • Play Consoleでステータスを監視

Play Store のレビューをナビゲートすることは複雑です。特に、請求書の準拠、App のコンテンツの宣言、テスト トラックの設定を組み合わせる必要がある場合です。個別のアシスタンスが必要な場合:

Capgo のチームとカスタマイズされたカウントを予約する の助けが必要です:

  • Play Store のレビュー用の完全な準備
  • テスト トラックの設定とテスターの募集
  • IAP実装レビュー
  • データセキュリティとプライバシーの適合性
  • 却下トラブルシューティングと申し立て
  • アプリの完全な提出プロセス

Capgoの専門家は、成功したPlayストアの提出を数百のアプリを導き、現在の要件を導くのに役立ちます。

実装の助けが必要ですか?

Android Play StoreのIAPガイドラインから続けてください

「Android Play StoreのIAPガイドラインから続けてください」のセクション

Capgoを使用している場合 Android Play StoreのIAPガイドライン セキュリティとコンプライアンスの計画に使用するには、Capgoを Using @capgo/native-purchases for the native capability in Using @capgo/native-purchases, 暗号化 暗号化の実装詳細 コンプライアンス Complianceの実装詳細について Capgo セキュリティ スキャナー Capgo セキュリティ スキャナーにおける製品ワークフローについて、 Capgo セキュリティ Capgo セキュリティ スキャナーにおける製品ワークフローについて、