InAppPurchaseUtil 是一个基于 in_app_purchase: ^3.2.3 封装的内购工具类,提供了简单易用的 API 来处理应用内购买功能。
在应用启动或需要使用内购的页面初始化:
final InAppPurchaseUtil _iapUtil = InAppPurchaseUtil.instance;
// 初始化并设置回调
await _iapUtil.initialize(
onSuccess: (purchaseDetails) {
print('购买成功: ${purchaseDetails.productID}');
// 处理购买成功逻辑
},
onError: (purchaseDetails) {
print('购买失败: ${purchaseDetails.error?.message}');
},
onCancelled: (purchaseDetails) {
print('购买取消');
},
onPending: (purchaseDetails) {
print('购买处理中');
},
onRestore: (purchaseDetails) {
print('恢复购买成功: ${purchaseDetails.productID}');
},
);
// 定义产品 ID
final productIds = {
'com.yourapp.weekly', // 周订阅
'com.yourapp.monthly', // 月订阅
'com.yourapp.yearly', // 年订阅
'com.yourapp.lifetime', // 终身会员
};
// 加载产品
bool success = await _iapUtil.loadProducts(productIds);
if (success) {
// 获取产品列表
List<ProductDetails> products = _iapUtil.products;
// 显示产品信息
for (var product in products) {
print('${product.title}: ${product.price}');
}
}
// 方法 1: 通过产品 ID 购买(推荐)
await _iapUtil.purchaseProductById('com.yourapp.yearly');
// 方法 2: 通过产品详情购买
final product = _iapUtil.getProductById('com.yourapp.yearly');
if (product != null) {
await _iapUtil.purchaseProduct(product);
}
// 购买消耗型产品
await _iapUtil.purchaseProduct(product, isConsumable: true);
await _iapUtil.restorePurchases();
// 恢复结果会在初始化时设置的 onRestore 回调中返回
参考 in_app_purchase_example.dart 文件查看完整使用示例。
class MyController extends GetxController {
final InAppPurchaseUtil _iapUtil = InAppPurchaseUtil.instance;
final isLoading = false.obs;
final products = <ProductDetails>[].obs;
@override
void onInit() {
super.onInit();
_initIAP();
}
Future<void> _initIAP() async {
// 初始化
await _iapUtil.initialize(
onSuccess: _handleSuccess,
onError: _handleError,
);
// 加载产品
await _loadProducts();
}
Future<void> _loadProducts() async {
final productIds = {'com.yourapp.premium'};
await _iapUtil.loadProducts(productIds);
products.value = _iapUtil.products;
}
void _handleSuccess(PurchaseDetails details) {
// 更新用户状态
// 解锁高级功能
// 显示成功提示
}
void _handleError(PurchaseDetails details) {
// 显示错误提示
}
// 购买
Future<void> purchase(String productId) async {
await _iapUtil.purchaseProductById(productId);
}
// 恢复购买
Future<void> restore() async {
await _iapUtil.restorePurchases();
}
}
initialize()初始化内购功能并设置回调。
参数:
onUpdate: 购买状态更新回调(可选)onSuccess: 购买成功回调(可选)onError: 购买失败回调(可选)onCancelled: 购买取消回调(可选)onPending: 购买等待中回调(可选)onRestore: 恢复购买成功回调(可选)返回值: Future<bool> - 是否初始化成功
loadProducts(Set<String> productIds)加载产品信息。
参数:
productIds: 产品 ID 集合返回值: Future<bool> - 是否加载成功
getProductById(String productId)根据产品 ID 获取产品详情。
参数:
productId: 产品 ID返回值: ProductDetails? - 产品详情,未找到返回 null
purchaseProduct(ProductDetails productDetails, {bool isConsumable = false})购买产品。
参数:
productDetails: 产品详情isConsumable: 是否是消耗型产品,默认 false返回值: Future<bool> - 是否发起购买成功
purchaseProductById(String productId)通过产品 ID 购买产品。
参数:
productId: 产品 ID返回值: Future<bool> - 是否发起购买成功
restorePurchases()恢复购买。
返回值: Future<bool> - 是否发起恢复成功
completePurchase(PurchaseDetails purchaseDetails)完成购买(通常由工具类自动调用)。
dispose()清理资源(在应用退出时调用)。
Runner/Info.plist 中添加必要的配置AndroidManifest.xml 中添加必要的权限⚠️ 重要: 当前工具类中的 _verifyPurchase() 方法只是一个占位实现。在生产环境中,你必须:
示例验证流程:
Future<bool> _verifyPurchase(PurchaseDetails purchaseDetails) async {
try {
// 发送到服务器验证
final response = await dio.post('/api/verify-purchase', data: {
'receipt': purchaseDetails.verificationData.serverVerificationData,
'productId': purchaseDetails.productID,
'platform': Platform.isIOS ? 'ios' : 'android',
});
return response.data['valid'] == true;
} catch (e) {
debugPrint('验证购买失败: $e');
return false;
}
}
Q: 为什么产品加载失败?
A: 检查以下几点:
Q: 购买后如何同步到服务器?
A: 在 onSuccess 回调中:
Q: 如何处理离线购买?
A: 工具会自动保存未完成的购买,在下次启动时自动处理。确保在应用启动时调用 initialize()。
如有问题,请查看示例代码或提交 Issue。