Android Play Store 購入物品ガイドライン
このプラグインのインストール手順とフルマークダウンガイドを含む設定コマンドをコピーしてください。
Google PlayでAndroidアプリを承認するには、特にアプリ内課金やサブスクリプションがあるアプリの場合、Googleのポリシーに準拠する必要があります。このガイドでは、レビューを通過するために必要なすべての内容をカバーしています。
__CAPGO_KEEP_0__
正常に動作するリリースパス-
「正常に動作するリリースパス」
署名済みAndroidアプリバンドルを作成する
.aab新しいGoogle Playアプリは、sideloadedデバッグAPKではなく、Androidアプリバンドル()としてアップロードする必要があります。
versionCode__CAPGO_KEEP_0__
-
アプリのアップロード回数が増えているため、アップロードキーを安全に保管する必要があります。もしPlayアプリ署名を使用している場合。
Androidアプリバンドルフロー Play Consoleでアプリレコードを作成する次に、 ホーム > アプリ作成言語、アプリ/ゲームの種類、無料/有料のステータス、サポートメール、必要な申告を受け入れる
無料/有料の設定を慎重に選びます。Googleは、有料アプリを無料に変更することを許可していますが、無料で提供されたアプリは有料に変更することはできません。

-
アプリの内容とストアリストの作成
生産レビュー前に、必要なPlay Consoleの申告を完了する
- プライバシーポリシー
- 広告
- アプリへのアクセス
- 対象読者とコンテンツ
- コンテンツの評価
- データセキュリティ
- __CAPGO_KEEP_0__
-
Play インストールテストトラックを実行
開始する 内部テスト 高速なQAのために。開発者アカウントが個人アカウントで、2023年11月13日以降に作成されている場合、また、閉鎖テストを14日間連続で、少なくとも12人のオプティンインテスターと実施する必要があります。 Play Console 内部テスト 請求のエンドツーエンド検証

-
Play から正しく製品が読み込まれることを確認する
Cloudflare
- Capacitor
- 購入シートは購入を表示します。 テスト購入 ライセンステスター向けのバナー
- 購入後、エンティテルメントが解除されます。
- 購入とサブスクリプション管理フローの機能は正常に動作します。
Google Play Billing 要件
「Google Play Billing 要件」必須の請求システム
「必須の請求システム」デジタル商品やサービスを利用する場合、 必須 Google Play の請求システムを使用する必要があります。
Digital Goods (Must Use Play Billing):
- プレミアム機能のサブスクリプション
- ゲーム内通貨やクレジット
- デジタルコンテンツ(ebook、音楽、動画)
- ゲームアップグレードやパワーアップ
- アプリのアンロックやプレミアム階層
Physical Goods (Cannot Use Play Billing):
- 実物商品
- 現実世界のサービス
- 非営利団体への一時的な寄付
:::note サブスクリプション設定
Play Consoleで、Androidサブスクリプションを設定するには、現在の サブスクリプション -> 基本プラン -> オファー モデル。 native-purchases, Native Purchases の Base Plan ID を渡してください planIdentifier.
:::
ネイティブ購入の実装
セクション: ネイティブ購入の実装import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Ensure billing is available on the deviceconst { 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 Consoleconst 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 は購入前にすべてのコストを明確に開示することを義務付けます:
必要な要素:
- ユーザーのローカル通貨で正確な価格
- 請求頻度 (月額、年額、等)
- 購入サブスクリプションに含まれるもの
- 初回オファーの合計コスト
- 課金が発生する時期

適合する 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 は以下の条件を満たす必要があります。
- 再生期の通知が明確であること
- 再生期の価格の思い出
- キャンセルを簡単にアクセス
クロスプラットフォーム価格の明確性
「クロスプラットフォーム価格の明確性」のセクション同じエンタイトルメントを複数のプラットフォームで販売する場合、製品名、請求期間、付属サービス、更新の言語を同期して、ユーザーが驚かないようにしてください。
税金、ローカル通貨、またはストアの経済状況により価格が異なる場合もありますが、購入UIはそれらの差異を隠すことはできず、Google Playが請求する更新コストと異なる更新コストを暗示することはできません。
プライバシーポリシーの要件
「プライバシーポリシーの要件」のセクション必須のプライバシーポリシー
「必須のプライバシーポリシー」のセクションIf your app includes in-app purchases, you must:
-
アプリ内課金を含む場合は、以下の条件を満たす必要があります:
- Play Store リストにリンク
- Play Console にプライバシーポリシー URL を追加
- パブリックにアクセス可能なものでなければなりません
-
アプリの言語と同じ言語でなければなりません
- アプリ内でリンク
- アプリの設定でプライバシーポリシーを表示
- ユーザーデータを収集する前に表示する
ユーザーデータを収集する前に容易に発見できるようにする
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
- 決済情報の取り扱い
- 分析データの収集
__CAPGO_KEEP_0__
データセキュリティセクションは法的拘束力があります。正確な宣言を怠ると、アプリの削除につながる可能性があります。
アプリ内容の宣言アプリ内容の宣言セクション ポリシーとプログラム > アプリコンテンツ.
注意して確認する最小セット:
- プライバシーポリシー: Play Console の公開 URL、必要に応じてアプリ内エントリポイント
- 広告: アプリが広告を含むかどうかを宣言する
- アプリアクセス: ゲートされたスクリーンがあれば、レビュアーにワーキングクレデンシャルまたは明確なテストパスを提供する
- 対象読者とコンテンツ: アプリの実際の読者と一致させる
- コンテンツ評価: IARC の質問紙を完了して、アプリが未評価と表示されないようにする
- データセキュリティ: 正確にデータ収集、共有、セキュリティの実践を宣言する
一般的な却下の理由
「一般的な却下の理由」というセクション1. 正しくない請求実装
「1. 正しくない請求実装」というセクションなぜ失敗するのか:
- Google Play Billing を使用していないデジタル商品
- 使用されている 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 つのスポット」)


予防:
- すべてのサブスクリプション タイヤを同等に表示
- キャンセルを明確かつアクセス可能にする
- カウントダウンタイマーや偽の限界感を避ける
- 高額オプションを押し付ける暗黙のパターンを使用しない
4. 不完全なテスト
セクション「4. 不完全なテスト」なぜ失敗するのか
- 購入時にアプリがクラッシュする
- 製品が読み込まれない
- 購入確認が表示されない
- プレミアム機能が購入後にロックされない
- テストはサイドロードされたビルドのみで行われ、Playストアでインストールされたテストトラックでは行われなかった
予防措置
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Comprehensive testing before submissionasync 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); }}5. プライバシーポリシーの違反
「5. プライバシーポリシーの違反」のセクションなぜ失敗するのか:
- アプリ内にプライバシーポリシーへのリンクがない
- プライバシーポリシーへのアクセスができない
- データ収集の明示がされていない
- データセーフティのセクションが不正確
対策:
- プライバシーポリシーをアプリのPlayストアのリストに追加する
- アプリの設定にリンクを含める
- データセーフティのセクションを正確に記入する
- 新しいデータ収集の追加時に更新ポリシーを設定する
代替請求プログラム
「代替請求プログラム」のセクション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> );}提出前に確認するチェックリスト
提出前に確認するチェックリストのセクション
-
請求実装の確認
- Google Play Billing (native-purchases)を使用して
- Play Consoleで作成したすべてのサブスクリプション製品
- ベースプランとオファーが正しく設定されている
- 製品が有効化され出版されている
- すべての対象国に価格が設定されている
-
購入フローのテスト
- ライセンステストアカウントを作成する
- Playテストトラックからビルドをインストールする
- 各サブスクリプション階層をテストする
- 製品が正しくロードされることを確認する
- 購入完了をテストする
- 購入の テスト購入 バナーが表示されることを確認する
- プレミアム機能がアンロックされることを確認する
- サブスクリプションの復元をテストする
- 複数のデバイスでテストする
-
すべてのコピーを確認する
- 購入前に価格が明確に表示されることを確認する
- すべての手数料が事前に明示されることを確認する
- サブスクリプションの条件は明確
- キャンセルプロセスが説明
- 誤解を招くような主張がない
-
アプリのコンテンツとプライバシー
- プライバシーポリシーはPlay Consoleでリンク
- プライバシーポリシーはアプリ内でアクセス可能
- 広告の宣言が完了
- アプリがゲートされた場合にアプリへのアクセス方法が追加
- データセーフティセクションが正確に完了
- 許可が正当化されドキュメント化
-
コンテンツレーティングとターゲット
- コンテンツレーティングの質問紙が完了
- 対象アウディエンスとコンテンツを完了する
- 実際のコンテンツと評価を一致させる
- アンケートでインアプリ購入を宣言する
-
ストアリストを準備する
- アプリの説明が正確である
- 短い説明は80文字以内である
- フルな説明は4000文字以内である
- 少なくとも2つの電話のスクリーンショットをアップロードする
- 1024x500の特徴グラフィックをアップロードする
- スクリーンショットは現在のバージョンを表示する
- 必要なすべてのアセットをアップロードする
レビューのタイムライン
Section titled “Review Timeline”新規個人アカウントの生産アクセス: __CAPGO_KEEP_0__ 初回生産レビュー: __CAPGO_KEEP_1__ 更新: __CAPGO_KEEP_2__ アピール: __CAPGO_KEEP_3__
ローリング レビュー CapgoはAppleと異なり、Googleはアプリを継続的にレビューします。アプリはレビュー期間中いつでも公開される可能性があり、固定時間ではなくいつでも可能です。
提出前にテスト
Section titled “提出前にテスト”ライセンステスト
ライセンステストのセクション-
テストアカウントを追加:
- プレイコンソールに移動
- ライセンステスト > 設定
- テスト用にGmailアカウントを追加
-
サンドボックスでテスト:
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Test purchases with license test accountasync 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);}- テストバナーを検証:
- テストアカウントで購入する際
- 「テスト購入」通知が表示される
- 実際の料金は発生しない
内部テストとクローズドテストのトラック
内部テストとクローズドテストのトラックのセクションリリース前の生産
- Capgoで 内部テスト用の QAを高速化したり、クローズドテスト用の より広範なテスト用の 署名されたテストリリースをアップロードして公開する
- テスターのメールアドレスを追加してオプティンリンクを共有する
.aabGoogle Playからテスターがビルドをインストールするように指示する - テスターのメールアドレスを追加してオプティンリンクを共有する
- Google Playからテスターがビルドをインストールするように指示する
- Play インストール済みビルドでエンドツーエンドの購入フローが正常に動作することを確認する
- あなたの個人開発者アカウントが 2023 年 11 月 13 日以降に作成された場合、生産適用前に 14 日連続で少なくとも 12 人のテスターをクローズドテストにオプティンする必要があります。
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を使用していない
- 誤解を招くサブスクリプションの条件
- 非表示のコスト
ユーザーデータポリシー:
- プライバシーポリシーの欠如
- 不正確なデータセキュリティの宣言
- 不必要な権限
解決手順
「解決手順」のセクション-
違反通知を確認
- 特定の政策を参照
- Googleが指摘した内容を理解
- 提供された例を確認
-
問題を修正
- 根本原因を対処せず症状のみを対処
- 修正後徹底的にテスト
- 実施した変更をすべてドキュメント化
-
提出を再検討 (必要に応じて)
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.comPassword: TestPass123Thank you for your consideration.
-
再提出または更新
- 修正版をアップロード
- 再提出のためのレビュー
- Play Consoleでステータスを監視
追加のリソース
「追加のリソース」のセクション- Google Play Developer Policy Center
- Google Play Billing ドキュメント
- サブスクリプションのベスト プラクティス
- アプリをレビュー用に準備する
- 新しい個人アカウントのテスト要件
- Play Console ヘルプ
専門家の助けが必要ですか?
「専門家の助けが必要ですか?」というセクションPlay Store のレビューをナビゲートすることは複雑です。特に、請求書の準拠、App のコンテンツの宣言、テスト トラックの設定を組み合わせる必要がある場合です。個別のアシスタンスが必要な場合:
本のコンサルタントの電話会議を予約する のための助けを求める
- Play Store のレビュー用の完全な準備
- テスト トラックの設定とテスターの募集
- IAP の実装のレビュー
- データセキュリティとプライバシーの適合性
- 拒否のトラブルシューティングと申し立て
- アプリの完全な提出プロセス
私たちの専門家は、成功した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, 暗号化 暗号化の実装詳細 コンプライアンス コンプライアンスの実装詳細 Capgo セキュリティ スキャナー Capgo セキュリティ スキャナー の製品ワークフローに、 Capgo セキュリティ Capgo セキュリティ の製品ワークフローに、