引言
你以为苹果支付很复杂?其实搞懂这两步,虚拟商品内购就能轻松搞定。本文手把手教你用 Swift 实现苹果 IAP 内购功能,从发起购买到验单闭环,代码可直接抄用,适合 Swift 新手和老鸟复习。
✅ 第一步:发起购买请求(用商品 ID 唤起支付面板)
苹果的 IAP(In-App Purchase)机制专门用于虚拟商品,比如:
- 会员订阅
- 游戏道具
- 解锁完整版 App
首先你需要在 App Store Connect 后台配置商品 ID,例如 com.example.pro。
然后在代码中通过 StoreKit 框架实现以下逻辑 👇
🧱 1. 添加支付观察者
SKPaymentQueue.default().add(self) // self 遵循 SKPaymentTransactionObserver
这一步确保你能收到支付完成的回调。
🔍 2. 请求商品信息并发起支付
let productID = "com.example.pro"
let request = SKProductsRequest(productIdentifiers: [productID])
request.delegate = self
request.start()
然后在回调中触发支付:
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
if let product = response.products.first {
let payment = SKPayment(product: product)
SKPaymentQueue.default().add(payment)
}
}
此时用户会看到熟悉的 App Store 支付面板,确认后开始扣款。
✅ 第二步:支付完成后验单(防白嫖、防越狱)
苹果支付完成后,系统不会告诉你“这个人真的买了”,你得自己验证。
这就是所谓的“验单”:拿到凭证(receipt),向苹果服务器查询这个订单是否真实有效。
📦 1. 监听支付回调
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch transaction.transactionState {
case .purchased:
// 付款成功,开始验单
verifyReceipt(transaction: transaction)
case .failed:
// 用户取消或失败,直接结束
SKPaymentQueue.default().finishTransaction(transaction)
default:
break
}
}
}
🔐 2. 客户端获取 receipt
func verifyReceipt(transaction: SKPaymentTransaction) {
guard let appStoreReceiptURL = Bundle.main.appStoreReceiptURL,
let receiptData = try? Data(contentsOf: appStoreReceiptURL) else {
return
}
let base64Receipt = receiptData.base64EncodedString()
// 👉 把 base64Receipt 传给你们服务端
}
🧾 3. 服务端请求苹果接口验证(示意)
POST https://buy.itunes.apple.com/verifyReceipt
Content-Type: application/json
{
"receipt-data": "base64Receipt",
"password": "你的共享密钥(用于订阅)"
}
苹果会返回一份完整的交易记录,包含:
- 商品 ID
- 购买时间
- 是否有效
- 是否为沙盒等信息
你们服务端可根据这些内容判断该用户是否已经付费,是否重复消费。
🎯 总结一下
苹果 IAP 的完整流程其实就是:
前端发起购买 → 拿到 receipt → 后端验单 → 返回结果给 App
只要把这套逻辑跑通,内购会员、订阅、道具解锁等功能就能稳定上线。
🧩 附加建议
- 正式上线前记得切换到正式环境的验证地址。
- 苹果会缓存 receipt,遇到无法触发回调时可用 restoreCompletedTransactions() 恢复。
- 沙盒测试账号每次付款最多持续 5 分钟,注意测试节奏。
- 如果你用 RevenueCat 这类 SDK,可以省掉一堆细节,但建议先理解原理。