由于我们的项目IOS 端使用Flutter 进行实现,所以可以使用flutter官方的内购插件flutter_in_app_purchase plugin pub dev 地址: pub.dev/packages/in…
- 安装插件
dependencies:
in_app_purchase: ^3.2.1
- 代码使用 获取InAppPurchase 实例:
final InAppPurchase _inAppPurchase = InAppPurchase.instance;
List<ProductDetails> _products = [];
bool _isAvailable = false;
void _listenToPurchaseUpdated() {
_inAppPurchase.purchaseStream
.listen((List<PurchaseDetails> purchaseDetailsList) {
_handlePurchaseUpdates(purchaseDetailsList);
});
}
Future<void> _initialize() async {
_isAvailable = await _inAppPurchase.isAvailable();
if (_isAvailable) {
await _loadProducts();
_listenToPurchaseUpdated();
}
}
void _verifyPurchase(PurchaseDetails purchaseDetails) {
// 在这里验证购买凭证,通常需要将凭证发送到服务器进行验证
final receiptData = purchaseDetails.verificationData.serverVerificationData;
print('Receipt data: $receiptData');
const passwd = "你们后台自定义的password";
if (orderId == null) {
_buyProduct(_products[selectIndex]);
return;
}
// 后台写的接口,调用以下接口
//生产环境:https://buy.itunes.apple.com/verifyReceipt
//沙箱环境:https://sandbox.itunes.apple.com/verifyReceipt
controller.verifyReceipt(
receiptData: receiptData,
password: passwd,
orderId: orderId!,
onSucceedDeal: (m) {
// 支付成功,刷新状态
if (m == 0) {
toast("支付成功");
// 执行后续逻辑
} else {
toast("会员购买失败,请联系客服,苹果支付错误码:$m");
}
},
);
}
void _handlePurchaseUpdates(List<PurchaseDetails> purchaseDetailsList) {
purchaseDetailsList.forEach((PurchaseDetails purchaseDetails) async {
dismissLoading();
if (purchaseDetails.status == PurchaseStatus.purchased) {
// 处理购买成功逻辑
_verifyPurchase(purchaseDetails);
} else if (purchaseDetails.status == PurchaseStatus.error) {
// 处理购买失败逻辑
toast("购买失败");
}
if (purchaseDetails.pendingCompletePurchase) {
await _inAppPurchase.completePurchase(purchaseDetails);
}
});
}
Future<void> _loadProducts() async {
showLoading();
// 购买项目
const Set<String> _kProductIds = {
'com.test_subscription',// 购买项目,订阅对应的productId(自定义)
};
ProductDetailsResponse response =
await _inAppPurchase.queryProductDetails(_kProductIds);
setState(() {
// 产品根据价格排序展示
_products = response.productDetails
..sort((pre, current) => pre.rawPrice.compareTo(current.rawPrice));
});
dismissLoading();
}
//触发购买
void _buyProduct(ProductDetails productDetails) {
controller.createApplePayOrder(
appleProductId: productDetails.id,
onSucceedDeal: (m) {
orderId = m.id;
final PurchaseParam purchaseParam =
PurchaseParam(productDetails: productDetails);
_inAppPurchase.buyNonConsumable(purchaseParam: purchaseParam);
},
);
}