App Store 应用内支付如何创建优惠代码,别和付费应用促销代码搞混

如果你的 iOS App 是免费下载,然后通过应用内购买(In-App Purchase)解锁高级功能,比如「Pro 版」「终身会员」「高级模板包」,想给测试用户、老用户或活动用户发一批兑换码,应该创建的是 Offer Codes,优惠代码

很多人第一次进 App Store Connect 会踩坑:看到侧边栏里有 Promo Codes,促销代码,以为这就是给用户解锁高级功能的兑换码。实际上它们不是一回事。

一句话先说结论:

应用内购买解锁高级功能,用「优惠代码 Offer Codes」;付费 App 本体免费送,用「促销代码 Promo Codes」。

本文以 App 内解锁高级功能为例,说明如何创建优惠代码、用户如何使用,以及和促销代码的关键区别。


一、先弄清楚两个概念

1. Offer Codes:应用内购买的优惠代码

Apple 官方对 In-App Purchase Offer Codes 的描述是:开发者可以通过免费或折扣的方式,让用户获得应用内购买项目的访问权限。用户可以通过兑换链接、App Store 输入代码,或者在 App 内兑换。

它适合这些场景:

  • 免费 App 中,通过非消耗型内购解锁「高级版」「Pro 功能」;
  • 订阅 App 给用户发 1 个月免费、首月折扣等订阅优惠;
  • 活动、社群、抽奖、内测、老用户回馈;
  • 给客服补偿用户一个高级功能兑换资格。

如果你的高级功能是一个应用内购买商品,比如:

  • pro_lifetime:非消耗型内购,买一次永久解锁;
  • premium_monthly:自动续期订阅;
  • archive_1_year:非续期订阅;

那么要围绕这个 IAP 商品创建 Offer Codes。

2. Promo Codes:付费 App 本体的促销代码

Promo Codes 是给 App 本体 用的。典型场景是你的 App 本身是付费下载,比如售价 18 元,你想给媒体、朋友、评测人员发一个免费下载 App 的代码。

Apple 官方说明里提到,Promo Codes 可以让潜在客户或评测人员免费获得 iOS、macOS 或 tvOS App 的副本。每个代码自生成之日起有效 4 周,只能使用一次。用户使用促销代码下载 App 后,App 表现得就像已经购买过一样,但用户不能对 App 评分或评论。

也就是说:

  • 它解决的是「免费下载这个付费 App」;
  • 它不是「解锁 App 里的某个内购商品」;
  • 免费 App + 内购高级功能的模式,重点看 Offer Codes,而不是 Promo Codes。

二、创建优惠代码前的准备

以「用户兑换后解锁高级功能」为例,通常建议使用 非消耗型内购(Non-Consumable) 来承载高级功能。

非消耗型内购的特点是:用户购买一次,不会过期,也不会因为使用而消耗。比如游戏里的赛道、App 的永久高级版、一次性解锁的功能包。

准备工作:

  1. App Store Connect 中已经创建 App;
  2. 已经在「App 内购买项目」里创建对应 IAP 商品;
  3. IAP 商品类型选择合理:永久解锁用非消耗型,周期权益用订阅;
  4. IAP 商品已经提交审核并处于 Approved 状态;
  5. App 生产环境生成正式一次性代码或自定义代码时,App 需要处于 Ready for Distribution / Ready for Sale 相关可分发状态;
  6. App 内已经实现 StoreKit 购买状态校验,能根据交易记录解锁高级功能。

这里最容易忽略第 6 点:

优惠代码只是帮用户以免费或折扣方式拿到一笔合法的 App Store 交易;真正解锁高级功能,仍然要靠你的 App 识别这笔交易。

也就是说,用户兑换代码后,App 里应该通过 StoreKit、收据校验、App Store Server API 或你自己的会员系统,识别该用户已经拥有对应 IAP 权益。


三、在 App Store Connect 创建应用内购买优惠代码

下面按 App 内购买 Offer Codes 的流程说明。

1. 进入应用内购买商品

路径大致是:

  1. 打开 App Store Connect;
  2. 进入 Apps
  3. 选择你的 App;
  4. 在侧边栏点击 In-App Purchases
  5. 选择要创建优惠的 IAP 商品,例如「Pro 永久版」;
  6. 滚动到 Offer Codes 区域;
  7. 点击 Create Offer

如果是订阅商品,入口会在 Subscriptions 相关页面中,逻辑类似,但订阅还会涉及订阅组、优惠周期、是否自动续订到标准价格等选项。

2. 创建 Offer

创建 Offer 时需要配置:

  • Reference Name:内部识别名称。创建后不能修改,建议写清楚活动目的,例如 202606_pro_lifetime_launch_gift
  • 用户资格:哪些用户可以兑换;
  • 国家或地区:优惠在哪些 App Store storefront 生效;
  • 优惠类型:免费或付费折扣;
  • 价格:如果是付费优惠,需要设置折扣价。

用户资格对应用内购买 Offer Codes 来说非常关键。Apple 提供的选项包括:

  • 从未在 App 内购买过;
  • 最近 30 天内购买过;
  • 30 天前购买过。

如果三个都选,相当于这个 Offer 对所有用户开放。

注意:Offer 创建后不能随意编辑。如果用户资格设置错了,通常需要重新创建一个新的 Offer。


四、选择哪种优惠代码类型

App Store Connect 里有三类 Offer Codes:

1. One-Time-Use Codes:一次性代码

特点:

  • Apple 随机生成,每个代码只能被一个用户兑换一次;
  • 适合小范围、定向发放;
  • 用户可以通过兑换链接、App Store 输入代码,或 App 内兑换;
  • 每次创建数量最少 500 个,最多 25,000 个;
  • 有效期最长 6 个月;
  • 创建后可能最多需要约 1 小时才可兑换。

适合场景:

  • 给内测用户一人一个码;
  • 给中奖用户单独发码;
  • 给线下活动参会者发码;
  • 需要严格控制「一个码只能一个人用」。

2. Custom Codes:自定义代码

特点:

  • 代码名称由你自己定义,比如 SUMMER25VIPACCESS
  • 一个自定义代码可以被多个用户兑换,直到达到你设置的兑换上限;
  • 适合大规模营销活动;
  • 用户可以通过兑换链接或 App 内兑换;
  • 单次可设置最多 25,000 个兑换名额;
  • 可设置过期时间,最长 6 个月;也可以选择无结束日期;
  • 创建后可能最多需要约 1 小时才可兑换。

适合场景:

  • 在公众号、社群、官网发一个统一兑换码;
  • 活动海报上印一个容易记住的代码;
  • 给某个渠道专属代码,用于后续统计。

3. Sandbox Codes:沙盒测试代码

特点:

  • 只用于测试;
  • 不影响真实用户和生产数据;
  • 每个 App 每季度最多 10,000 个;
  • 创建数量最少 10 个,最多 10,000 个;
  • 适合在上线前验证兑换流程。

建议:正式发码前,先用 Sandbox Codes 把完整链路测通,尤其是「兑换成功后 App 是否立刻解锁高级功能」。


五、用户如何使用优惠代码解锁高级功能

用户兑换 Offer Codes 主要有三种方式。

方式一:通过兑换链接

这是最推荐的方式。你可以把代码拼成 Apple 提供的 redemption URL,用户点击链接后进入系统兑换页。

优点:

  • 用户不用手动输入一长串代码;
  • 适合短信、邮件、社群、网页按钮;
  • 没安装 App 的用户,会先被引导安装 App,再完成兑换。

对于一次性代码,App Store Connect 下载的 CSV 文件里通常会包含代码和兑换链接,直接分发即可。

方式二:在 App Store 输入代码

一次性代码可以在 App Store 的「兑换礼品卡或代码」流程中输入。

大致路径:

  1. 打开 App Store;
  2. 点击右上角头像;
  3. 选择「兑换礼品卡或代码」;
  4. 输入优惠代码;
  5. 完成兑换;
  6. 回到 App,App 识别购买权益并解锁高级功能。

这个方式适合用户已经习惯 App Store 兑换流程的情况,但输入成本较高,最好配合说明截图。

方式三:App 内兑换

如果你的 App 实现了对应 StoreKit 方法,可以在 App 内直接拉起系统兑换界面。

需要注意系统版本要求。Apple 文档中提到,应用内兑换应用内购买的一次性代码和自定义代码,需要用户设备运行 iOS 16.3、macOS 15.0、visionOS 1.0 或更高版本,并且 App 支持相应 StoreKit 方法。

所以 App 内兑换体验最好,但要考虑低版本系统用户的兜底方案:给他们提供兑换链接或提示去 App Store 兑换。


六、兑换后 App 如何解锁高级功能

从业务逻辑看,优惠代码兑换成功后,本质上和用户正常购买 IAP 一样,都会产生一笔 Apple 交易。你的 App 需要做的是:

  1. 监听 StoreKit 交易更新;
  2. 校验交易是否合法;
  3. 判断交易对应的 productId 是否是高级功能商品;
  4. 给用户本地或服务端账号写入权益;
  5. 刷新 UI,展示「已解锁」。

如果是非消耗型内购,典型逻辑是:

1
2
3
4
5
6
7
8
9
// 伪代码,只表达思路
for await result in Transaction.updates {
if case .verified(let transaction) = result {
if transaction.productID == "pro_lifetime" {
unlockProFeatures()
await transaction.finish()
}
}
}

如果你的 App 有账号体系,建议把权益同步到服务端。这样用户换设备、重装 App 后,也能通过恢复购买或登录账号重新获得高级功能。


七、和付费 App 促销代码的区别:重点避坑

这里还有一个时间点很容易误会:2026 年 3 月 26 日之前,App Store Connect 里确实还能创建应用内购买的 Promo Codes。所以如果你 3 月份还用过「应用内购买促销码」,记忆并没有错。

Apple 在 2025 年 10 月 29 日的开发者新闻里说明,Offer Codes 扩展到所有应用内购买类型,同时从 2026 年 3 月 26 日 开始,App Store Connect 将不再允许创建新的 In-App Purchase Promo Codes。已经创建的 IAP Promo Codes 可以继续兑换到过期,但新建应用内购买兑换码要改用 Offer Codes。

所以现在的规则可以理解为:

  • Promo Codes 仍然存在,但主要用于「付费 App 本体免费下载」;
  • 应用内购买的免费 / 折扣兑换,改用 Offer Codes
  • 3 月 26 日前创建的旧 IAP Promo Codes,没过期前还能继续被兑换;
  • 3 月 26 日后,新的 IAP 兑换码入口就是 Offer Codes。

下面这张表最重要:

对比项 Offer Codes 优惠代码 Promo Codes 促销代码
作用对象 应用内购买商品或订阅 App 本体
典型用途 解锁 Pro、高级功能、订阅优惠 让用户免费下载付费 App
适合免费 App + 内购吗 适合 不适合解锁内购
用户兑换后获得什么 对应 IAP 权益或订阅优惠 App 的一个免费副本
是否能解锁高级功能 可以,但 App 需要识别 IAP 交易 不会自动解锁 IAP 高级功能
代码规模 每个 App 每季度最多 100 万次兑换额度 每个 App 每个平台每个版本最多 100 个
有效期 一次性代码最长 6 个月;自定义代码可设置无结束日期 生成后 4 周有效
用户能否评分评论 按 IAP 交易逻辑走 使用 Promo Code 下载的用户不能评分评论
入口 In-App Purchases 或 Subscriptions 下的 Offer Codes App 侧边栏 Promo Codes

最常见的坑有四个。

坑 1:拿 2026 年 3 月之前的经验套现在的 App Store Connect

如果你之前给应用内购买创建过 Promo Codes,现在发现找不到入口或兑换逻辑变了,不一定是你操作错了,而是 Apple 已经把 IAP 兑换码迁移到 Offer Codes 体系里了。

正确做法:新活动、新批次、新的应用内购买兑换码,统一从 IAP 或 Subscription 的 Offer Codes 入口创建。

坑 2:免费 App 想解锁高级功能,却生成了 Promo Codes

如果 App 本身是免费的,Promo Codes 基本帮不上忙。用户本来就能免费下载 App,用 Promo Codes 不会获得你的「Pro 内购」。

正确做法:给「Pro 内购商品」创建 Offer Codes。

坑 3:以为用户兑换后 App 会自动变 Pro

Apple 负责兑换和交易,App 负责识别和解锁。你的 App 如果没有正确处理 StoreKit 交易、恢复购买、收据校验,用户兑换成功后也可能看不到高级功能。

正确做法:把优惠代码兑换当作一次真实购买来处理,完整测试购买状态刷新。

坑 4:生产代码创建条件没满足

Apple 允许在 App 不同状态下创建 Offer 和 Sandbox Codes,但要生成正式的一次性代码或自定义代码,App 和 IAP 商品需要满足可分发、已审核等条件。

正确做法:上线前先用 Sandbox Codes 测流程;上线后确认 App 状态和 IAP 状态,再生成正式代码。


八、推荐实践

我的建议是这样做:

  1. 永久高级功能用非消耗型内购承载,例如 pro_lifetime
  2. 先创建 Sandbox Codes 测试完整链路,包括兑换、交易监听、权益刷新、恢复购买;
  3. 小规模发放用 One-Time-Use Codes,一人一码,方便控制;
  4. 大规模活动用 Custom Codes,代码短、好记、适合海报和社群;
  5. 每个 Offer 的 Reference Name 写清楚活动目的,方便日后查账;
  6. 不要把 Promo Codes 当作新的内购兑换码,尤其是 2026-03-26 之后的新活动;
  7. 如果手里还有旧的 IAP Promo Codes,确认是否还在有效期内;
  8. 发给用户时优先发兑换链接,而不是裸代码;
  9. 在用户说明里写清楚兑换步骤、有效期、适用地区和适用 Apple ID;
  10. 对重要用户发码后,保留代码批次、发放对象和发放时间,方便排查售后问题。

九、一个实际发放模板

如果要给用户发高级功能兑换码,可以这样写:

1
2
3
4
5
6
7
8
9
10
11
12
13
这是「高级版」兑换链接:
https://apps.apple.com/redeem?ctx=offercodes&id=你的AppId&code=你的Code

使用方式:
1. 用 iPhone 打开上面的链接;
2. 按系统提示登录 Apple ID 并完成兑换;
3. 打开 App,进入「设置 - 恢复购买」或重新进入高级功能页面;
4. 如果没有立即解锁,请稍等几分钟后重试,或联系我并提供兑换截图。

注意:
- 每个代码只能按活动规则兑换一次;
- 请使用下载 App 的同一个 Apple ID 兑换;
- 兑换成功后,高级功能由 App 内购买权益控制。

如果是自定义代码,也可以写成:

1
2
兑换码:VIPACCESS
请在 App 内兑换入口输入,或点击兑换链接完成兑换。

不过从用户体验看,链接优先,裸码兜底


十、总结

做 App Store 兑换码时,最核心的判断是:你要送的是 App 本体,还是 App 里的高级权益?

  • 送付费 App 本体:用 Promo Codes,促销代码
  • 送应用内购买权益:用 Offer Codes,优惠代码
  • 免费 App + 内购解锁 Pro:基本就是 Offer Codes
  • 2026-03-26 之后,App Store Connect 不再允许创建新的 IAP Promo Codes;
  • 兑换后是否变 Pro:取决于 App 是否正确识别 IAP 交易。

所以,别在免费 App 上折腾 Promo Codes。真正该配置的是 In-App Purchases 或 Subscriptions 里的 Offer Codes,然后把 StoreKit 交易处理、恢复购买和权益刷新做好。


参考资料