Slide 1

Slide 1 text

Billing Client 2.0 Acknowledgement Cookpad Inc. ユーザ・決済基盤部 @uzzu

Slide 2

Slide 2 text

今日覚えて帰る事 •Billing Client 2.0より
 ユーザのGoogle Play決済を
 開発者が承認する必要がある(Acknowledgement) •Acknowledgementはサーバサイドでやる •Consumableな商品でも
 サーバサイドでacknowledgeしてからconsumeする

Slide 3

Slide 3 text

Android App Google Play Service API Google API ᶃαʔϏεͷ஫จίʔυऔಘ ᶄ(PPHMF1MBZܾࡁΛ࣮ࢪ ᶅϨγʔτ ߪೖ৘ใ ͱᶃΛૹ৴ ᶇ DPOTVNF ɺॴ࣋঎඼ͷ৘ใߋ৽ɺߪೖ׬ྃ௨஌ ᶆϨγʔτอଘɺݕূɺ஫จඥ෇ɺ঎඼෇༩

Slide 4

Slide 4 text

Android App Google Play Service API Google API ᶃαʔϏεͷ஫จίʔυऔಘ ᶄ(PPHMF1MBZܾࡁΛ࣮ࢪ ᶅϨγʔτ ߪೖ৘ใ ͱᶃΛૹ৴ ᶆϨγʔτอଘɺݕূɺ஫จඥ෇ɺ঎඼෇༩ ᶇܾࡁͷঝೝ ᶈ DPOTVNF ɺॴ࣋঎඼ͷ৘ใߋ৽ɺߪೖ׬ྃ௨஌

Slide 5

Slide 5 text

決済の承認(Google API) •SkuType.INAPP
 Purchases.products: acknowledge
 https://developers.google.com/android-publisher/api-ref/purchases/products/acknowledge •SkuType.SUBS
 Purchases.subscriptions: acknowledge
 https://developers.google.com/android-publisher/api-ref/purchases/subscriptions/acknowledge

Slide 6

Slide 6 text

Google APIの挙動 •古いアプリではBilling Client1.x使ってると
 最初からacknowledged: trueになってるけど
 acknowledged: trueな状態でacknowledge APIって
 叩けるの? •1.xで新developer payloadを書き込める条件って
 どうなってるの? •etc…

Slide 7

Slide 7 text

5月中旬のわい とりあえず試しにAPI叩いて洗い出して行けそうな気がしてきた。クライアントライブラリ実装は終わった。

Slide 8

Slide 8 text

7月上旬のわい もう大体できてるしいけるいける。techlifeも草稿書くぞ〜

Slide 9

Slide 9 text

直後 ʊਓਓਓਓਓਓʊ ʼɹ࢓༷มߋɹʻ ʉY^Y^Y^Y^Y^Y^ʉ

Slide 10

Slide 10 text

Purchases.products: acknowledge •1.x, 2.x共通
 consume後のacknowledgeはstatus: 500
 処理フローとしてconsumeした後にacknowledgeする事は無いはずなので回避可 •1.x
 承認期限の概念なし。consume後でなければ問題なく呼べる •2.x
 期限後の呼出はstatus: 500
 そもそも purchaseType == 1 (canceled)となっているので回避可
 承認期限を過ぎるとアプリ上でレシート取得できなくなる
 ※2019/07/12時点

Slide 11

Slide 11 text

Purchases.subscriptions: acknowledge •1.x
 承認期限の概念は無い
 ただ、次の定期購入期間に入ってacknowledgeすると
 status 400, reason: subscriptionNotOwnedByUser
 →ログに残して一応監視するが無視(成功扱い)という事に •2.x
 期限後の呼出はstatus: 400, reason: subscriptionNotOwnedByUser
 期限後はアプリ側でレシート取得できなくなる
 
 ※2019/07/12時点

Slide 12

Slide 12 text

developerPayload •新developerPayload
 IABv3 AIDL時代のとはやっぱり思想が違う感(個人の感想です) •acknowledgeが成功し、developerPayloadの書込も成功した 後の挙動
 同じdeveloperPayloadでの再acknowledgeは
 status: 200
 違うdeveloperPayloadでの再acknowledgeは
 status: 400, reason: alreadyAcknowledged ※2019/07/12時点

Slide 13

Slide 13 text

Google APIの挙動まとめ •ここまでのスライド内容を参考にしてもいいけど
 一度手前でAPI叩いてみるのをオススメ

Slide 14

Slide 14 text

決済の承認はアプリ内でもできるが •BillingClient#acknowledgePurchase
 https://developer.android.com/reference/com/android/billingclient/api/ BillingClient.html#acknowledgePurchase(com.android.billingclient.api.AcknowledgePurchaseParams, %20com.android.billingclient.api.AcknowledgePurchaseResponseListener) •アプリ改ざんに弱いのでオススメできない
 ちゃんとやるならサーバサイドで承認するのが良い
 特に都度課金

Slide 15

Slide 15 text

どういう事? BDLOPXMFEHF1VSDIBTFΛ
 ݺ͹ͳ͍Α͏ʹ BQLΛվ͟Μ ՝ۚΞΠςϜΛߪೖ͢Δ ՝ۚΞΠςϜ͕෇༩͞ΕΔ վ͟ΜʹΑͬͯະঝೝ ೔ޙܾࡁ͕Ωϟϯηϧ͞Ε ՝ۚΞΠςϜ͕࠶ߪೖՄೳʹͳΔ ՝ۚΞΠςϜΛ࢖༻͢Δ ͔Θ͍͍

Slide 16

Slide 16 text

アプリでの対策コスト考えると •よっぽどの事がない限り
 サーバサイドでacknowledgeしておいた方が
 改ざん対策やこれを考慮した複雑な処理フローにするより
 容易に決済の承認を実現できる…はず •Consumable productsではconsumeAsync()すれば良いと
 release notesに記載されているが
 サーバサイドでacknowledgeしてからconsumeするように •(サーバサイドでconsumeさせてほしい…)

Slide 17

Slide 17 text

まとめ •Billing Client 2.0より
 ユーザのGoogle Play決済を
 開発者が承認する必要がある(Acknowledgement) •Acknowledgementはサーバサイドでやる •Consumableな商品でも
 サーバサイドでacknowledgeしてからconsumeする