記事を書こうと思ったきっかけ
開発しているアプリでin_app_purchaseを使用しているのですが、Androidで定期購入アイテムが購入された3日後に払い戻しが行われていました。
仮定
https://pub.dev/packages/in_app_purchase の右のバーから行けるRepository (GitHub)のexampleを使用していると仮定します。
結論
/example/lib/main.dartを開きます。
・import 'package:in_app_purchase_android/billing_client_wrappers.dart';
を記述
_listenToPurchaseUpdated関数を変更します
Future<void> _listenToPurchaseUpdated(
List<PurchaseDetails> purchaseDetailsList) async {
for (final PurchaseDetails purchaseDetails in purchaseDetailsList) {
// 省略
if (purchaseDetails.pendingCompletePurchase) {
await _inAppPurchase.completePurchase(purchaseDetails);
// 必ず追加!!追加しないと払い戻しが行われる!!
BillingClient client = BillingClient((_) {});
await client.acknowledgePurchase(purchaseDetails.verificationData.serverVerificationData);
}
}
}
大変だったこと
とにかくFlutterのAndroidの払い戻しに関する情報が少なすぎる
解決した方法
まず、Googleにメールで問い合わせました。すると、以下のような返事が返ってきました。
「この度は Google Play デベロッパー サポートにお問い合わせいただきありがとうございます。
お問い合わせいただきました Google Play Billing Library の購入確認の件につきまして、ご連絡いたします。Google Play Billing Library バージョン 2.0 以降をご利用の場合、すべての購入を 3 日以内に承認していただく必要がございます。購入が適切に承認されなかった場合は払い戻しが行われます。
購入をご確認になるには、まず購入ステータスが購入済みであるかどうかをチェックします。購入が保留中である場合は、保留中のトランザクションを処理するに記載されている説明に沿って、購入を処理していただく必要がございます。onPurchaseUpdated() または queryPurchases からの購入の場合は、アプリが利用権を付与する前に、購入をさらに確認していただく必要がございます。
購入をご確認になると、アプリはユーザーに利用権を付与できます。利用権を付与した後、アプリは購入を承認する必要があります。この承認により、購入の利用権を付与したことが Google Play に通知されます。
利用権を付与して購入を承認するプロセスは、消費不可アイテムの購入か、消費可能アイテムの購入か、定期購入かによって異なります。
消費可能アイテムの場合、consumeAsync() メソッドが承認要件を履行し、アプリがユーザーに利用権を付与したことを示します。このメソッドにより、アプリは 1 回限りのアイテムを再購入可能にすることもできます。
消費不可アイテムの購入を承認するには、Google Play Billing Library の BillingClient.acknowledgePurchase() または Google Play Developer API の Product.Purchases.Acknowledge をご使用ください。購入を承認する前に、アプリは Google Play Billing Library の isAcknowledged() メソッドまたは Google Developer API の acknowledgementState フィールドを使用して、購入がすでに承認されていないかをチェックする必要があります。
定期購入は、消費不可アイテムと同様に処理されます。定期購入の承認には、Google Play Billing Library の BillingClient.acknowledgePurchase() または Google Play Developer API の Purchases.Subscriptions.Acknowledge をご使用いただけます。
購入の承認に関する詳しい手順と例につきましては、技術文書「Google Play Billing Library をアプリに統合する」(https://developer.android.com/google/play/billing/billing_library_overview#acknowledge)をご参照ください。
他にご不明な点などございましたらお知らせください。
何卒宜しくお願いいたします。」
そして、BillingClient.acknowledgePurchase()に対応するInAppPurchaseのメソッドを探しました。
すると以下のページに情報がありました。
https://pub.dev/packages/in_app_purchase/versions/0.5.1+2/changelog
原文:
「Add a new BillingClient.acknowledgePurchase API. Starting from this version, the developer has to acknowledge any purchase on Android using this API within 3 days of purchase, or the user will be refunded. Note that if a product is "consumed" via BillingClient.consumeAsync, it is implicitly acknowledged.」
翻訳:
新しいBillingClient.acknowledgePurchase APIを追加します。このバージョンから、開発者はこのAPIを使用してAndroidで購入した場合、購入から3日以内に承認しなければならず、さもなければユーザーに返金されます。BillingClient.consumeAsyncによって商品が「消費」された場合、暗黙のうちに承認されることに注意してください。
最後に
このページでacknowledgeすることの重要性を強調してくれ、、、