在 React Native SDK 中进行应用内购买
在移动应用中展示付费墙,是向用户提供高级内容或服务访问权限的关键步骤。但只有当 Adapty 负责渲染页面时——即使用流程或旧版付费墙编辑工具构建的付费墙——展示付费墙本身才能直接支持购买操作。
如果页面由您自己的代码渲染,则需要单独调用 .makePurchase() 方法来完成购买并解锁相应内容。该方法是用户与付费墙交互、完成目标交易的入口。
如果您的付费墙为用户尝试购买的产品设置了有效的促销活动,Adapty 将在购买时自动应用该促销活动。
请注意,新用户优惠仅在由 Adapty 渲染页面时才会自动应用。
在其他情况下,您需要验证用户是否有资格享受 iOS 上的新用户优惠。跳过此步骤可能导致您的应用在发布时被拒绝,还可能向本应享受新用户优惠的用户收取全价。
请确保已完成初始配置,每一步都不能跳过。否则我们将无法验证购买。
发起购买
try {
const purchaseResult = await adapty.makePurchase(product);
switch (purchaseResult.type) {
case 'success':
const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive;
if (isSubscribed) {
// Grant access to the paid features
}
break;
case 'user_cancelled':
// Handle the case where the user canceled the purchase
break;
case 'pending':
// Handle deferred purchases (e.g., the user will pay offline with cash)
break;
}
} catch (error) {
// Handle the error
}
请求参数:
| 参数 | 是否必填 | 描述 |
|---|---|---|
| Product | 必填 | 从付费墙中获取的 AdaptyPaywallProduct 对象。 |
响应参数:
| 参数 | 描述 |
|---|---|
| Profile | 请求成功后,响应中会包含此对象。AdaptyProfile 对象提供了用户在应用内的访问等级、订阅及一次性购买的完整信息。 请检查访问等级状态,以确认用户是否拥有所需的应用访问权限。 |
注意: 如果你使用的 Apple StoreKit 版本低于 v2.0,且 Adapty SDK 版本低于 v2.9.0,则需要提供 Apple App Store 共享密钥。该方法目前已被 Apple 弃用。
购买时变更订阅
当用户选择新订阅而非续订当前订阅时,具体行为取决于应用商店:
- 对于 App Store,订阅会在同一订阅组内自动更新。如果用户在已有某个组的订阅的情况下购买了另一个组的订阅,两个订阅将同时处于激活状态。
- 对于 Google Play,订阅不会自动更新。你需要按照以下说明在移动应用代码中手动处理切换逻辑。
要在 Android 上将订阅替换为另一个订阅,请调用 .makePurchase() 方法并传入额外参数:
try {
const purchaseResult = await adapty.makePurchase(product, params);
switch (purchaseResult.type) {
case 'success':
const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive;
if (isSubscribed) {
// 授予付费功能访问权限
}
break;
case 'user_cancelled':
// 处理用户取消购买的情况
break;
case 'pending':
// 处理延迟购买(例如,用户将以现金线下支付)
break;
}
} catch (error) {
// 处理错误
}
额外请求参数:
| 参数 | 是否必填 | 描述 |
|---|---|---|
| params | 必填 | MakePurchaseParamsInput 类型的对象。 |
3.8.2+ 版本:MakePurchaseParamsInput 结构已更新。oldSubVendorProductId 和 prorationMode 现已嵌套在 subscriptionUpdateParams 下,isOfferPersonalized 已移至上层。
makePurchase(product, {
android: {
subscriptionUpdateParams: {
oldSubVendorProductId: 'old_product_id',
prorationMode: 'charge_prorated_price'
},
isOfferPersonalized: true
}
});如需了解更多关于订阅和替换模式的内容,请参阅 Google 开发者文档:
- 关于替换模式
- Google 对替换模式的建议
- 替换模式
CHARGE_PRORATED_PRICE。注意:此方法仅适用于订阅升级,不支持降级。 - 替换模式
DEFERRED。注意:实际的订阅变更仅在当前订阅计费周期结束时才会生效。
在 iOS 中兑换优惠码
关于优惠码
优惠码允许你向特定用户提供折扣或免费试用。与自动应用的常规优惠不同,优惠码通过应用外渠道分发——例如电子邮件营销、社交媒体或印刷材料。用户可通过在 App Store 中输入代码、访问兑换链接或使用应用内对话框来兑换。
要设置优惠码,请在 App Store Connect 中打开某个订阅,并进入其 Offer Codes 部分。你可以创建三种类型的优惠码:
- Free — 订阅在设定时长内免费,下次续费恢复原价。
- Pay as you go — 用户在设定时长内每个计费周期以折扣价付费,之后订阅恢复原价续费。
- Pay up front — 用户为整个优惠期限支付一次性折扣价,之后订阅恢复原价续费。
你无需将优惠码添加到 Adapty。Apple 会在优惠期间为每笔交易打上优惠码类别标签,包括初次兑换和所有后续折扣续费。Adapty 检测到该标签后,会将每笔交易记录为优惠类别 offer_code。优惠期结束、订阅以原价续费后,该标签将不再存在。你可以在 Adapty 看板中通过 Offer Code 优惠类型筛选分析数据。
收入差异排查
如果你发现 Adapty 中某笔优惠码交易显示的是产品原价而非折扣价,请在 App Store Connect 中核查以下内容:
- 优惠码已为用户可兑换的所有地区配置了正确的定价。
- 已为用户所在的特定国家或地区设置了优惠价格。Apple 在交易中发送的是地区价格。如果该优惠未配置对应地区的价格,Apple 可能会发送产品原价。
你可以在 Adapty 看板中通过 Offer Code 优惠类型和 Offer Discount Type 筛选条件来过滤和核查优惠码交易。
旧版促销码(已弃用)
Apple 于 2026 年 3 月弃用了应用内购买的促销码。优惠码以更强大的功能取而代之:可配置的使用资格、过期日期,以及每季度最多 100 万个代码。如果你此前使用促销码进行应用内购买,请在 App Store Connect 中迁移至优惠码。
旧版促销码(每个应用每个版本限 100 个)可免费授予订阅访问权限。与优惠码不同,Apple 不会在促销码交易中包含折扣信息——它在收据中发送的是产品原价。因此,Adapty 会以原价记录这些交易,导致 Adapty 分析数据与 App Store Connect 之间出现收入差异。
如果你看到历史交易以原价记录但实际上应为免费,这些很可能来自旧版促销码。由于这些代码现已弃用,请迁移至优惠码以确保收入数据准确。
要在应用中显示优惠码兑换页面:
adapty.presentCodeRedemptionSheet();
根据我们的观察,某些应用中的优惠码兑换页面可能无法稳定运行。我们建议直接将用户重定向至 App Store。
为此,您需要打开以下格式的 URL:
https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}
来自 App Store 的推广应用内购买
你的应用可以从 SDK 4.1 版本起,在 iOS 16.4 或更高版本上接管推广应用内购买。iOS 16.4 以下版本以及 Android 上,'onPromotedPurchaseReceived' 事件不会触发。
当用户从 App Store 产品页面发起购买,并且交易流转到你的应用时,SDK 会自动完成该购买——Apple 购买系统界面会立即弹出,Adapty 像处理其他购买一样处理该交易。这无需你编写任何代码。
如果推广产品附带订阅优惠,SDK 会在购买时自动应用该优惠。该优惠从 App Store 购买意图中读取,此功能仅在 iOS 18.0 及以上版本可用。在 iOS 16.4–17.x 上,购买将以原价进行。
如需自行接管购买完成流程(例如先展示自定义页面),请监听 'onPromotedPurchaseReceived' 事件,并将产品传入 makePromotedPurchase:
adapty.addEventListener('onPromotedPurchaseReceived', async product => {
const result = await adapty.makePromotedPurchase(product);
// process the purchase result
});
注册监听器后,SDK 将不再自动完成推广购买。如果你的处理函数从未调用 makePromotedPurchase,购买将无法完成:App Store 会将产品交给你的应用并等待响应。
makePromotedPurchase 不接受任何购买参数——促销产品来自 App Store 而非付费墙,因此不携带任何付费墙上下文。它返回与 makePurchase 相同的 AdaptyPurchaseResult。
监听器是累加的:如果你注册了多个监听器,每个监听器都会收到该产品,但任何一个监听器都不会替其他监听器完成购买。
管理预付费计划(Android)
如果您的应用用户可以购买预付费计划(例如,购买数月的非续期订阅),您可以为预付费计划启用待处理交易。
adapty.activate("PUBLIC_SDK_KEY", {
android: { pendingPrepaidPlansEnabled: true }
});