Cookpad.apk #3 登壇資料 https://cookpad.connpass.com/event/137772/
合わせて読みたい: https://techlife.cookpad.com/entry/billing-client-2.0-consumable-product-acknowledgement
Billing Client 2.0AcknowledgementCookpad Inc.ユーザ・決済基盤部@uzzu
View Slide
今日覚えて帰る事•Billing Client 2.0より ユーザのGoogle Play決済を 開発者が承認する必要がある(Acknowledgement)•Acknowledgementはサーバサイドでやる•Consumableな商品でも サーバサイドでacknowledgeしてからconsumeする
Android App Google Play Service API Google APIᶃαʔϏεͷจίʔυऔಘᶄ(PPHMF1MBZܾࡁΛ࣮ࢪᶅϨγʔτ ߪೖใͱᶃΛૹ৴ᶇ DPOTVNFɺॴ࣋ͷใߋ৽ɺߪೖྃ௨ᶆϨγʔτอଘɺݕূɺจඥɺ༩
Android App Google Play Service API Google APIᶃαʔϏεͷจίʔυऔಘᶄ(PPHMF1MBZܾࡁΛ࣮ࢪᶅϨγʔτ ߪೖใͱᶃΛૹ৴ᶆϨγʔτอଘɺݕূɺจඥɺ༩ᶇܾࡁͷঝೝᶈ DPOTVNFɺॴ࣋ͷใߋ৽ɺߪೖྃ௨
決済の承認(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
Google APIの挙動•古いアプリではBilling Client1.x使ってると 最初からacknowledged: trueになってるけど acknowledged: trueな状態でacknowledge APIって 叩けるの?•1.xで新developer payloadを書き込める条件って どうなってるの?•etc…
5月中旬のわいとりあえず試しにAPI叩いて洗い出して行けそうな気がしてきた。クライアントライブラリ実装は終わった。
7月上旬のわいもう大体できてるしいけるいける。techlifeも草稿書くぞ〜
直後ʊਓਓਓਓਓਓʊʼɹ༷มߋɹʻʉY^Y^Y^Y^Y^Y^ʉ
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時点
Purchases.subscriptions: acknowledge•1.x 承認期限の概念は無い ただ、次の定期購入期間に入ってacknowledgeすると status 400, reason: subscriptionNotOwnedByUser →ログに残して一応監視するが無視(成功扱い)という事に•2.x 期限後の呼出はstatus: 400, reason: subscriptionNotOwnedByUser 期限後はアプリ側でレシート取得できなくなる ※2019/07/12時点
developerPayload•新developerPayload IABv3 AIDL時代のとはやっぱり思想が違う感(個人の感想です)•acknowledgeが成功し、developerPayloadの書込も成功した後の挙動 同じdeveloperPayloadでの再acknowledgeは status: 200 違うdeveloperPayloadでの再acknowledgeは status: 400, reason: alreadyAcknowledged※2019/07/12時点
Google APIの挙動まとめ•ここまでのスライド内容を参考にしてもいいけど 一度手前でAPI叩いてみるのをオススメ
決済の承認はアプリ内でもできるが•BillingClient#acknowledgePurchase https://developer.android.com/reference/com/android/billingclient/api/BillingClient.html#acknowledgePurchase(com.android.billingclient.api.AcknowledgePurchaseParams,%20com.android.billingclient.api.AcknowledgePurchaseResponseListener)•アプリ改ざんに弱いのでオススメできない ちゃんとやるならサーバサイドで承認するのが良い 特に都度課金
どういう事?BDLOPXMFEHF1VSDIBTFΛ ݺͳ͍Α͏ʹBQLΛվ͟Μ՝ۚΞΠςϜΛߪೖ͢Δ՝ۚΞΠςϜ͕༩͞ΕΔվ͟ΜʹΑͬͯະঝೝޙܾࡁ͕Ωϟϯηϧ͞Ε՝ۚΞΠςϜ͕࠶ߪೖՄೳʹͳΔ՝ۚΞΠςϜΛ༻͢Δ͔Θ͍͍
アプリでの対策コスト考えると•よっぽどの事がない限り サーバサイドでacknowledgeしておいた方が 改ざん対策やこれを考慮した複雑な処理フローにするより 容易に決済の承認を実現できる…はず•Consumable productsではconsumeAsync()すれば良いと release notesに記載されているが サーバサイドでacknowledgeしてからconsumeするように•(サーバサイドでconsumeさせてほしい…)
まとめ•Billing Client 2.0より ユーザのGoogle Play決済を 開発者が承認する必要がある(Acknowledgement)•Acknowledgementはサーバサイドでやる•Consumableな商品でも サーバサイドでacknowledgeしてからconsumeする