Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Play Billing Library 7.0.0 変更点まとめ@potatotips#88
Search
kako351
July 05, 2024
Programming
0
1.4k
Play Billing Library 7.0.0 変更点まとめ@potatotips#88
kako351
July 05, 2024
Tweet
Share
More Decks by kako351
See All by kako351
Paging3のSeparatorsを使って LazyColumnにヘッダーや 別のアイテムを挿入する
kako351
0
730
CircleCIでFlakyなテストを再実行する_potatotips#83
kako351
0
200
ComposeでTimeRangePickerを作る_YUMEMI.grow Mobile #2
kako351
1
820
Composeの座標を取得する ~コーチマークにおける活用事例~_DroidKaigi.collect#1
kako351
2
3k
チームで導入する Jetpack Compose あの素晴らしいLTをもう一度.ver
kako351
1
1.3k
【DevFest & ADS JP 22】チームで導入するJetpackCompose@おいしい健康
kako351
0
2.5k
Other Decks in Programming
See All in Programming
TUIライブラリつくってみた / i-just-make-TUI-library
kazto
1
320
チームをチームにするEM
hitode909
0
240
関数の挙動書き換える
takatofukui
4
770
FluorTracer / RayTracingCamp11
kugimasa
0
200
Building AI Agents with TypeScript #TSKaigiHokuriku
izumin5210
6
1.2k
スタートアップを支える技術戦略と組織づくり
pospome
8
15k
非同期処理の迷宮を抜ける: 初学者がつまづく構造的な原因
pd1xx
1
660
配送計画の均等化機能を提供する取り組みについて(⽩⾦鉱業 Meetup Vol.21@六本⽊(数理最適化編))
izu_nori
0
140
Why Kotlin? 電子カルテを Kotlin で開発する理由 / Why Kotlin? at Henry
agatan
2
6.6k
AIコーディングエージェント(skywork)
kondai24
0
130
バックエンドエンジニアによる Amebaブログ K8s 基盤への CronJobの導入・運用経験
sunabig
0
140
connect-python: convenient protobuf RPC for Python
anuraaga
0
370
Featured
See All Featured
Designing Experiences People Love
moore
142
24k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
253
22k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
36
6.2k
GitHub's CSS Performance
jonrohan
1032
470k
Code Review Best Practice
trishagee
73
19k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
Faster Mobile Websites
deanohume
310
31k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.1k
Facilitating Awesome Meetings
lara
57
6.7k
Transcript
Play Billing Library 7.0.0 変更点まとめ potatotips #88
自己紹介 kako351 / @kako_351 株式会社ZOZO Androidエンジニア • バイク(ハンターカブ) • ギター
• コーヒー自宅焙煎 趣味
本日話す内容 Play Billing Library 7.0.0での変更点を以下の分類で紹介します • 新機能 • 削除されたAPI •
非推奨になったAPI 💡 Play Billing Library は Androidのアプリ内課金ライブラリです
新機能 1. 分割払い定期購入をサポート 2. プリペイド プランの保留中の取引をサポート 3. offerTokenが空の場合例外を返す
分割払い用の InstallmentPlanDetails API が追加。 • getInstallmentPlanCommitmentPaymentsCount ◦ ユーザーがプランを購入時、コミットされた支払い回数を返す ◦ 12回払いのプランなら12が返る
• getSubsequentInstallmentPlanCommitmentPaymentsCount ◦ プランが更新された後の支払い回数を返す ◦ 12回払いのプランを更新した場合、12が返る 分割払い定期購入をサポート ※現在は、ブラジル、フランス、イタリア、スペインでのみ
• 保留中の取引を有効 ◦ enablePrepaidPlans() と enablePendingPurchases(PendingPurchaseParams) を使用すると、 定期購入のプリペイド プランの保留中の取引を有効になる。 •
保留中のプランの変更サポート ◦ Purchase.PendingPurchaseUpdate ▪ 既存の購入に対して、保留中のチャージや変更を取得できる 定期購入のプリペイド プランの保留中 の取引をサポート
• ユーザーが購入するオファーを指定するsetOfferTokenが空の場合例外を返すよう になりました。 offerTokenが空の場合例外を返す BillingFlowParams.ProductDetailsParams.newBuilder() .setProductDetails(productDetails) .setOfferToken(selectedOfferToken) // これを忘れると例外 .build()
ただし、setOfferTokenは1回だけ課金商品(OneTime Purchase)の場合は指 定してはいけないので注意が必要です
削除されたAPI 1. enablePendingPurchases() サポート終了 2. AlternativeBilling系の関数削除 3. setOldSkuPurchaseToken() の削除
PendingPurchasesParams とenablePendingPurchases(PendingPurchaseParams) を追加 enablePendingPurchases() サポート終了 BillingClient.newBuilder(context) .setListener(/* …. */) .enablePendingPurchases()
.build() BillingClient.newBuilder(context) .setListener(/* …. */) .enablePendingPurchases( PendingPurchasesParams .newBuilder() .enableOneTimeProducts() .build() ) .build()
GooglePlay以外での課金方法を有効にするいくつかの関数が削除。今後は UserChoiceBillingを使用する。 • 削除された関数 ◦ BillingClient.Builder.enableAlternativeBilling() ◦ AlternativeBillingListener ◦ AlternativeChoiceDetails
• 代わりに使用する関数 ◦ BillingClient.Builder.enableUserChoiceBilling() ◦ UserChoiceBillingListener ◦ UserChoiceDetails AlternativeBilling系の関数削除
setOldSkuPurchaseToken()が削除、代わりにsetOldPurchaseToken(purchaseToken)を使 う setOldSkuPurchaseToken() の削除 BillingFlowParams.SubscriptionUpdateParams.newBuilder() .setOldSkuPurchaseToken(purchaseToken) .build() BillingFlowParams.SubscriptionUpdateParams.newBuilder() .setOldPurchaseToken(purchaseToken) .build()
非推奨に なったAPI 1. queryPurchaseHistoryAsyncが非推奨 a. 確認済み購入と保留中の購入 b. 消費した購入の取得
c. 過去の購入を保持する例 (今日はこれを話に来た!)
BillingClient.queryPurchaseHistoryAsync() は非推奨となり、今後のリリースで削 除される予定。 • 確認済み購入と保留中の購入の取得 ◦ BillingClient.queryPurchasesAsync() を使用して、有効な購入を取得 • 消費した購入の取得
◦ デベロッパーは、消費した購入を独自のサーバーで追跡する必要がある • キャンセルされた購入の取得 ◦ voided-purchases デベロッパー API を使用 queryPurchaseHistoryAsyncが非推奨
• BillingClient.queryPurchasesAsync() ◦ 有効なサブスクリプションと消費されていない1回限りの購入のみが返される ◦ GracePriod(猶予期間)の場合は購入が返ってくる ◦ AccountHold(一時停止)の場合は返ってこない ◦ 期限切れの場合は返ってこない
• queryPurchaseHistoryAsync() との違い ◦ queryPurchaseHistoryAsync() は期限切れや停止された購入も含め、購入履歴すべて返ってき ていた 確認済み購入と保留中の購入の取得
消費した購入(過去の購入履歴)を保持しておきたい場合は、In-App Purchases APIやRTDN(リアルタイムデベロッパー通知)などを利用し、独自でバックエン ド処理を行う必要がある。 消費した購入の取得
RTDNを利用して購入プランが更新されるたびにDBに履歴を保持。バックエンド にはFirebaseを利用。 過去の購入を保持する例(個人アプリ) Firestore Firebase Functions 購入 Google Play
RTDN 更新やキャンセル 新規購入 購入履歴
• 分割払いやプリペイドプランのサポート追加 • 削除されたAPIは代替APIがあるので移行しましょう • queryPurchaseHistoryAsyncが非推奨になったので、ユースケースごとに代替 処理に変更するのがよい。 ◦ 購入履歴を保持したい場合は独自でサーバー側の処理が必要。 まとめ
• https://developer.android.com/google/play/billing/release-notes?hl=ja • https://developer.android.com/reference/com/android/billingclient/api/Billi ngClient#queryPurchasesAsync • https://developer.android.com/reference/com/android/billingclient/api/Billi ngFlowParams.ProductDetailsParams.Builder#setOfferToken(java.lang.String) • https://zenn.dev/attomicgm/articles/about_google_billing_query_purchase
参考
ご清聴 ありがとうございました End of slide