PurchaseClientManager.initialize() 호출 통해 최초 한 번 객체 셋업을 합니다.
'purchasesUpdatedStream' 스트림에 'listen'하여 구매 완료 응답을 받을 준비를 합니다.
_listenToPurchasesUpdated 로는 구매 성공으로 구매 데이터를 응답 받습니다.
_updateStreamOnError 로는 구매 실패에 대한 응답을 전달 받습니다.
앱 종료시에 'PurchaseClientManager.dispose()' 를 호출 하여 메모리 해지 및 연결을 해지하고 청취하고 있던 _purchaseUpdatedStream 도 dispose()하여 연결을 끊어야 합니다.
구매가 성공적으로 이루졌다면 '앱에서 구매 데이터 업데이트 및 오류 응답 청취하기'에서 등록한 '_listenToPurchasesUpdated' 통해 응답을 받을 수 있습니다.
물론 구매 실패에 대한 응답도 '_updateStreamOnError' 통해 받을 수 있습니다.
스토어에서 구매 완료 응답을 받았다면, 소비(consume) 또는 확인(acknowledge) 작업을 하는 것이 매우 중요합니다.
3일 이내에 구매를 확인(acknowledge) 또는 소비(consume)를 하지 않으면 사용자에게 상품이 지급되지 않았다고 판단되어 자동으로 환불됩니다.
import 'package:flutter_onestore_inapp/onestore_in_app_wrappers.dart';
List<ProductDetail> get consumableProducts;
List<ProductDetail> get subscriptionProducts
Future<void> _listenToPurchasesUpdated(List<PurchaseData> purchasesList) async {
for (var element in purchasesList) {
if (consumableProducts.any((p) => p.productId == element.productId)) {
/// [ProductType.inapp] 상품은 [consumePurchase] 호출을 하여 소비 해야합니다.
await consumePurchase(element);
} else if (subscriptionProducts.any((p) => p.productId == element.productId)) {
/// [ProductType.subs] 상품은 [acknowledgePurchase] 호출을 하여 확인 해야합니다.
await acknowledgePurchase(element);
}
}
notifyListeners();
}
구매 소비하기 (consume)
'_clientManager.consumePurchase(PurchaseData)' 사용하여 관리형 상품의 소비를 요청합니다.
import 'package:flutter_onestore_inapp/onestore_in_app_wrappers.dart';
Future<void> consumePurchase(PurchaseData purchaseData) async {
await _clientManager
.consumePurchase(purchaseData: purchaseData)
.then((iapResult) {
// iapResult 를 통해 해당 API의 성공 여부를 판단할 수 있습니다.
if (iapResult.isSuccess()) {
fetchPurchases([ProductType.inapp]);
}
});
}
구매 인증하기 (acknowledge)
'_clientManager.acknowledgePurchase(PurchaseData)' 사용하여 관리형 상품 또는 구독 상품의 확인을 요청합니다.
import 'package:flutter_onestore_inapp/onestore_in_app_wrappers.dart';
Future<void> acknowledgePurchase(PurchaseData purchaseData) async {
await _clientManager
.acknowledgePurchase(purchaseData: purchaseData)
.then((iapResult) {
// iapResult 를 통해 해당 API의 성공 여부를 판단할 수 있습니다.
if (iapResult.isSuccess()) {
fetchPurchases([ProductType.subs]);
}
});
}
구매 내역 조회하기
'_clientManager.queryPurchases(ProductType)' 사용하여 소비되지 않은 구매 내역을 요청합니다.
import 'package:flutter_onestore_inapp/onestore_in_app_wrappers.dart';
Future<void> fetchPurchases([List<ProductType>? types]) async {
types ??= <ProductType>[ProductType.inapp, ProductType.subs];
for (var element in types) {
await _clientManager
.queryPurchases(productType: element)
.then((response) {
if (response.iapResult.isSuccess()) {
if (element == ProductType.inapp) {
for (var purchaseData in response.purchasesList) {
consumePurchase(purchaseData);
}
} else if (element == ProductType.subs) {
for (var purchaseData in response.purchasesList) {
if (!purchaseData.isAcknowledged) {
acknowledgePurchase(purchaseData);
}
}
}
notifyListeners();
} else {
_handleError('fetchPurchases($element)', response.iapResult);
}
});
}
}
업그레이드 또는 다운그레이드 하기
'_clientManager.launchUpdateSubscription(ProductDetail, PurchaseData, ProrationMode)' 를 사용하여 구매한 정기결제 상품을 새로운 상품으로 변경 합니다.
Upgrade or Downgrade 는 구매 요청 흐름과 동일하기 때문에 '구매 요청하기'와 응답 처리하는 방식이 같습니다.
'_listenToPurchasesUpdated'로 응답을 받을 수 있습니다.
원스토어 서비스가 설치되지 않았거나 v21 SDK 에서 바라는 최소 버전이 아닐경우 RESULT_NEED_UPDATE 에러가 발생합니다.
해당 에러를 전달 받았을 경우 '_clientManager.launchUpdateOrInstall()' 사용하여 원스토어 서비스 설치를 요청합니다.