Android Play Store IAP 审核指南
让您的 Android 应用在 Google Play 上获得批准需要遵守 Google 的政策,特别是对于具有应用内购买和订阅的应用。本指南涵盖了成功通过审核所需的一切。
Google Play 计费要求
Section titled “Google Play 计费要求”强制性计费系统
Section titled “强制性计费系统”对于数字商品和服务,您必须使用 Google Play 的计费系统:
数字商品(必须使用 Play 计费):
- 高级功能订阅
- 应用内货币或积分
- 数字内容(电子书、音乐、视频)
- 游戏升级和道具
- 应用解锁和高级层级
实体商品(不能使用 Play 计费):
- 实体商品
- 真实世界服务
- 向非营利组织的一次性捐赠
:::caution 2025 要求
新应用必须使用 monetization.subscriptions API 来处理订阅目录。旧版计费 API 已弃用。
:::
使用 Native Purchases 实现
Section titled “使用 Native Purchases 实现”import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// 确保设备上可用计费const { isBillingSupported } = await NativePurchases.isBillingSupported();if (!isBillingSupported) throw new Error('Google Play Billing not available');
// 获取订阅产品(需要商店数据——绝不硬编码定价)const { products } = await NativePurchases.getProducts({ productIdentifiers: ['premium_monthly', 'premium_yearly'], productType: PURCHASE_TYPE.SUBS,});
// 方案标识符是您在 Google Play Console 中创建的基础方案 IDconst transaction = await NativePurchases.purchaseProduct({ productIdentifier: 'premium_monthly', planIdentifier: 'monthly-plan', // 在 Android 上必需,在 iOS 上被忽略 productType: PURCHASE_TYPE.SUBS,});
console.log('Purchase token for server validation:', transaction.purchaseToken);透明度和披露要求
Section titled “透明度和披露要求”预先定价披露
Section titled “预先定价披露”Google Play 要求在购买前清楚披露所有费用:
必需元素:
- 用户本地货币的准确价格
- 计费频率(每月、每年等)
- 订阅包含的内容
- 引导性优惠的总费用
- 何时收费

合规 UI 示例:
function SubscriptionCard({ product }) { return ( <div className="subscription-card"> <h3>{product.title}</h3>
{/* 显示引导优惠(如果有)*/} {product.introductoryPrice && ( <div className="intro-offer"> <p className="intro-price">{product.introductoryPriceString}</p> <p className="intro-period"> for {product.introductoryPricePeriod} </p> </div> )}
{/* 常规价格 */} <div className="regular-price"> <p className="price">{product.priceString}</p> <p className="period">per {product.subscriptionPeriod}</p> </div>
{/* 清楚的描述 */} <p>{product.description}</p>
{/* 续订条款 */} <p className="terms"> 自动续订。随时在 Google Play 中取消。 </p>
<button onClick={() => handlePurchase(product)}> 立即订阅 </button> </div> );}自动续订披露
Section titled “自动续订披露”在订阅自动续订之前,Google 要求:
- 清楚通知将发生续订
- 提醒价格
- 轻松访问取消
跨平台价格一致性
Section titled “跨平台价格一致性”**关键规则:**价格必须在您的应用可用的所有平台上保持一致。
违规示例:
- iOS: $9.99/月
- Android: $7.99/月
- Web: $11.99/月
**为什么重要:**用户可以截图价格差异并向 Google 报告,触发政策违规。
隐私政策要求
Section titled “隐私政策要求”强制隐私政策
Section titled “强制隐私政策”如果您的应用包含应用内购买,您必须:
-
在 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>设置</h2>
<button onClick={openPrivacyPolicy}> 隐私政策 </button>
<button onClick={openTerms}> 服务条款 </button>
<button onClick={() => NativePurchases.showManageSubscriptions()}> 管理订阅 </button> </div> );}数据安全部分
Section titled “数据安全部分”Google Play 要求在数据安全部分进行详细披露:
对于 IAP 应用,声明:
- 购买历史收集
- 电子邮件地址(用于收据)
- 设备 ID(用于防欺诈)
- 支付信息处理
- 分析数据收集
数据安全部分具有法律约束力。不准确的声明可能导致应用被移除。
常见拒绝原因
Section titled “常见拒绝原因”1. 缺失或不正确的计费实现
Section titled “1. 缺失或不正确的计费实现”失败原因:
- 未对数字商品使用 Google Play 计费
- 使用已弃用的计费 API
- 为订阅实现自定义支付解决方案
预防:
// ✅ 正确:使用 native-purchases(使用 Google Play 计费)await NativePurchases.purchaseProduct({ productIdentifier: 'premium_monthly'});
// ❌ 错误:为订阅使用自定义支付处理器// await CustomPayment.charge(user, 9.99);2. 不清楚的定价或隐藏费用
Section titled “2. 不清楚的定价或隐藏费用”失败原因:
- 仅在点击购买后显示价格
- 未预先披露额外费用
- 含糊的订阅条款
预防:
function PurchaseScreen({ product }) { return ( <div> {/* 预先显示所有费用 */} <h2>高级订阅</h2>
<div className="pricing"> <p className="price">{product.priceString}/月</p> <p className="taxes">税费可能根据位置而定</p> </div>
<div className="features"> <h3>包含:</h3> <ul> <li>无广告体验</li> <li>无限云存储</li> <li>优先支持</li> </ul> </div>
<div className="terms"> <p> 订阅自动续订,除非在当前期间结束前至少 24 小时取消。 </p> <p> 在 Google Play 订阅中管理或取消。 </p> </div>
<button onClick={handlePurchase}> 开始订阅 </button> </div> );}3. 欺骗性订阅模式
Section titled “3. 欺骗性订阅模式”失败原因:
- 预先选择高级选项
- 隐藏更便宜的替代方案
- 使取消变得困难
- 虚假紧迫性(“仅剩 3 个名额!”)


预防:
- 平等显示所有订阅层级
- 使取消清楚易访问
- 避免倒计时器或虚假稀缺性
- 不要使用暗模式推动昂贵选项
4. 不完整的测试
Section titled “4. 不完整的测试”失败原因:
- 购买时应用崩溃
- 产品加载失败
- 购买确认不显示
- 购买后高级功能未解锁
预防:
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// 提交前的全面测试async function testPurchaseFlow() { try { // 1. 测试产品加载 const { products } = await NativePurchases.getProducts({ productIdentifiers: ['premium_monthly', 'premium_yearly'], productType: PURCHASE_TYPE.SUBS, }); console.log('✓ Products loaded:', products.length);
// 2. 测试购买流程 const transaction = await NativePurchases.purchaseProduct({ productIdentifier: 'premium_monthly', planIdentifier: 'monthly-plan', productType: PURCHASE_TYPE.SUBS, }); console.log('✓ Purchase completed', transaction.transactionId);
// 3. 验证权限 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. 测试恢复 await NativePurchases.restorePurchases(); console.log('✓ Restore works');
} catch (error) { console.error('✗ Test failed:', error); }}5. 隐私政策违规
Section titled “5. 隐私政策违规”失败原因:
- 应用中没有隐私政策链接
- 隐私政策不可访问
- 数据收集未披露
- 数据安全部分不准确
预防:
- 将隐私政策添加到 Play Store 列表
- 在应用设置中包含链接
- 准确填写数据安全部分
- 添加新数据收集时更新政策
替代计费系统(2025 更新)
Section titled “替代计费系统(2025 更新)”Google 现在在某些地区允许替代计费系统:
符合条件的地区:
- 欧洲经济区(EEA)
- 韩国
- 印度(即将推出)
使用替代计费的要求:
- 仍必须提供 Google Play 计费作为选项
- 向用户清楚传达选择
- 遵守当地法规
- 仍需支付服务费(减少)
用户必须能够:
- 轻松查看活动订阅
- 无需联系支持即可取消
- 了解取消何时生效
实现:
import { NativePurchases } from '@capgo/native-purchases';
function ManageSubscriptionButton() { const openManagement = async () => { try { // 打开 Google Play 订阅管理 await NativePurchases.showManageSubscriptions(); } catch (error) { // 回退到直接 URL const playStoreUrl = 'https://play.google.com/store/account/subscriptions'; window.open(playStoreUrl, '_blank'); } };
return ( <button onClick={openManagement}> 在 Google Play 中管理订阅 </button> );}必需披露:
- 取消何时生效?
- 用户是否保持访问权限直到期间结束?
- 是否提供部分退款?
function CancellationInfo() { return ( <div className="cancellation-info"> <h3>取消政策</h3> <ul> <li>随时在 Google Play 中取消</li> <li>访问权限持续到计费期间结束</li> <li>部分期间不退款</li> <li>随时重新订阅以重新获得访问权限</li> </ul>
<button onClick={() => NativePurchases.showManageSubscriptions()}> 在 Google Play 中管理 </button> </div> );}提交前检查清单
Section titled “提交前检查清单”
-
验证计费实现
- 使用 Google Play 计费(通过 native-purchases)
- 所有订阅产品在 Play Console 中创建
- 产品已激活并发布
- 为所有目标国家设置定价
-
测试购买流程
- 创建许可测试账户
- 测试每个订阅层级
- 验证产品正确加载
- 测试购买完成
- 验证高级功能解锁
- 测试订阅恢复
- 在多个设备上测试
-
审核所有文案
- 购买前清楚显示定价
- 预先披露所有费用
- 订阅条款清楚
- 解释取消流程
- 没有误导性声明
-
隐私合规
- 在 Play Console 中链接隐私政策
- 隐私政策在应用中可访问
- 准确完成数据安全部分
- 权限合理并记录
-
内容分级
- 完成内容分级问卷
- 确保分级与实际内容匹配
- 在问卷中声明应用内购买
-
准备商店列表
- 应用描述准确
- 截图显示当前版本
- 特色图符合要求
- 上传所有必需资产
**初次审核:**平均 7 天(可能更快) **更新:**通常比初次提交更快 **政策违规:**可能立即暂停 **申诉:**审核需 7-14 天
:::tip 滚动审核 与 Apple 不同,Google 持续审核应用。您的应用可能在审核期间的任何时间上线,而不是在固定时间。 :::
-
添加测试账户:
- 转到 Play Console
- 设置 > 许可测试
- 添加 Gmail 账户进行测试
-
在沙盒中测试:
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// 使用许可测试账户测试购买async function testInSandbox() { const { isBillingSupported } = await NativePurchases.isBillingSupported(); if (!isBillingSupported) { console.error('Billing not supported in this environment'); return; }
// 获取产品(使用许可测试者时返回测试定价) const { products } = await NativePurchases.getProducts({ productIdentifiers: ['premium_monthly'], productType: PURCHASE_TYPE.SUBS, });
console.log('Test products:', products);
// 进行测试购买(不收费) const transaction = await NativePurchases.purchaseProduct({ productIdentifier: 'premium_monthly', planIdentifier: 'monthly-plan', productType: PURCHASE_TYPE.SUBS, });
console.log('Test purchase complete:', transaction.transactionId);}- 验证测试横幅:
- 使用测试账户购买时
- 应看到”测试购买”通知
- 不会发生实际收费
内部测试轨道
Section titled “内部测试轨道”在生产发布之前:
- 在 Play Console 中创建内部测试轨道
- 上传 APK/AAB
- 添加测试者电子邮件地址
- 测试者从 Play Store 下载(测试轨道)
- 验证购买流程端到端工作
Native Purchases 的最佳实践
Section titled “Native Purchases 的最佳实践”处理所有购买状态
Section titled “处理所有购买状态”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);
// 成功 - 从商店检查权限 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) { // 处理特定错误情况 switch (error.code) { case 'USER_CANCELLED': // 用户退出 - 无需错误 console.log('Purchase cancelled'); break;
case 'ITEM_ALREADY_OWNED': // 他们已经拥有它 - 改为恢复 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); }}实现恢复购买
Section titled “实现恢复购买”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; }
// 如果需要,检查一次性解锁 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> );}检查订阅状态
Section titled “检查订阅状态”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); }}如果您的应用被拒绝
Section titled “如果您的应用被拒绝”常见政策违规
Section titled “常见政策违规”支付政策:
- 未使用 Google Play 计费
- 误导性订阅条款
- 隐藏费用
用户数据政策:
- 缺少隐私政策
- 不准确的数据安全声明
- 过度权限
-
审核违规通知
- 阅读引用的特定政策
- 了解 Google 标记的内容
- 查看他们提供的示例
-
修复问题
- 解决根本原因,而不仅仅是症状
- 修复后彻底测试
- 记录所有更改
-
提交申诉(如适用)
主题:政策违规申诉 - [应用名称]尊敬的 Google Play 审核团队,我收到了我的应用违反 [政策 X.Y] 的通知。我已进行以下更改以符合要求:1. [所做的具体更改]2. [所做的具体更改]3. [所做的具体更改]更新的版本 [版本号] 解决了提出的所有问题。用于验证的测试账户:电子邮件:test@example.com密码:TestPass123感谢您的考虑。
-
重新提交或更新
- 上传修复版本
- 重新提交审核
- 在 Play Console 中监控状态
需要专家帮助?
Section titled “需要专家帮助?”浏览 Play Store 审核可能很复杂,特别是对于 2025 年的新测试要求。如果您需要个性化援助:
预约与我们团队的咨询电话,获取以下帮助:
- 完整的 Play Store 审核准备
- 测试轨道设置和测试者招募
- IAP 实现审核
- 数据安全和隐私合规
- 拒绝故障排除和申诉
- 完整的应用提交流程
我们的专家已指导数百个应用成功通过 Play Store 提交,可以帮助您应对 2025 年的要求。
需要实现帮助?