Flutter如何实现in_app_purchase苹果内购
在Flutter中集成in_app_purchase插件实现苹果内购时,遇到以下问题:1. 插件初始化后无法获取商品列表,控制台显示SKRequest报错;2. 支付流程完成后,苹果服务器验证收据总是返回invalid状态;3. 沙盒环境测试正常,但上架App Store后真实用户无法完成购买。请问该如何排查和解决这些具体问题?需要检查哪些关键配置?
2 回复
在Flutter中实现苹果内购,需要使用in_app_purchase插件。以下是基本实现步骤:
- 添加依赖
在
pubspec.yaml中添加:
dependencies:
in_app_purchase: ^3.1.7
- 配置iOS项目
- 在App Store Connect中创建商品
- 在Xcode中启用In-App Purchase功能
- 添加StoreKit配置文件(可选)
- 基本代码实现
import 'package:in_app_purchase/in_app_purchase.dart';
class IAPManager {
final InAppPurchase _iap = InAppPurchase.instance;
// 初始化
Future<void> initialize() async {
// 检查是否可用
final bool available = await _iap.isAvailable();
if (!available) return;
// 监听购买更新
final Stream purchaseUpdated = _iap.purchaseStream;
_subscription = purchaseUpdated.listen(
_handlePurchaseUpdate,
onDone: () => _subscription.cancel(),
onError: (error) => print('Purchase error: $error'),
);
}
// 获取商品
Future<void> loadProducts() async {
const Set<String> productIds = {'your_product_id'};
final ProductDetailsResponse response =
await _iap.queryProductDetails(productIds);
if (response.notFoundIDs.isNotEmpty) {
print('未找到商品: ${response.notFoundIDs}');
}
List<ProductDetails> products = response.productDetails;
// 显示商品列表
}
// 购买商品
Future<void> buyProduct(ProductDetails product) async {
final PurchaseParam purchaseParam = PurchaseParam(
productDetails: product,
);
await _iap.buyConsumable(purchaseParam: purchaseParam);
}
// 处理购买结果
void _handlePurchaseUpdate(List<PurchaseDetails> purchaseDetailsList) {
purchaseDetailsList.forEach((PurchaseDetails purchaseDetails) async {
if (purchaseDetails.status == PurchaseStatus.purchased) {
// 验证收据并发放商品
await _verifyAndDeliverProduct(purchaseDetails);
// 完成交易
await _iap.completePurchase(purchaseDetails);
}
});
}
Future<void> _verifyAndDeliverProduct(PurchaseDetails purchaseDetails) async {
// 实现收据验证和商品发放逻辑
// 建议在服务器端验证收据
}
void dispose() {
_subscription?.cancel();
}
}
- 重要注意事项
- 必须在真机上测试,模拟器不支持内购
- 需要有效的Apple开发者账号
- 商品审核通过后才能正常测试
- 建议在服务器端验证收据以确保安全
- 错误处理
- 处理网络异常
- 处理用户取消购买
- 处理交易失败情况
记得在pubspec.yaml文件更新后运行flutter pub get,并在iOS项目的Info.plist中添加相应的权限描述。


