Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Billing Client 2.0 acknowledgement

uzzu
July 23, 2019

Billing Client 2.0 acknowledgement

uzzu

July 23, 2019
Tweet

More Decks by uzzu

Other Decks in Technology

Transcript

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

    View Slide

  2. 今日覚えて帰る事
    •Billing Client 2.0より

    ユーザのGoogle Play決済を

    開発者が承認する必要がある(Acknowledgement)
    •Acknowledgementはサーバサイドでやる
    •Consumableな商品でも

    サーバサイドでacknowledgeしてからconsumeする

    View Slide

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

    View Slide

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

    View Slide

  5. 決済の承認(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

    View Slide

  6. Google APIの挙動
    •古いアプリではBilling Client1.x使ってると

    最初からacknowledged: trueになってるけど

    acknowledged: trueな状態でacknowledge APIって

    叩けるの?
    •1.xで新developer payloadを書き込める条件って

    どうなってるの?
    •etc…

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. 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時点

    View Slide

  11. Purchases.subscriptions: acknowledge
    •1.x

    承認期限の概念は無い

    ただ、次の定期購入期間に入ってacknowledgeすると

    status 400, reason: subscriptionNotOwnedByUser

    →ログに残して一応監視するが無視(成功扱い)という事に
    •2.x

    期限後の呼出はstatus: 400, reason: subscriptionNotOwnedByUser

    期限後はアプリ側でレシート取得できなくなる


    ※2019/07/12時点

    View Slide

  12. developerPayload
    •新developerPayload

    IABv3 AIDL時代のとはやっぱり思想が違う感(個人の感想です)
    •acknowledgeが成功し、developerPayloadの書込も成功した
    後の挙動

    同じdeveloperPayloadでの再acknowledgeは

    status: 200

    違うdeveloperPayloadでの再acknowledgeは

    status: 400, reason: alreadyAcknowledged
    ※2019/07/12時点

    View Slide

  13. Google APIの挙動まとめ
    •ここまでのスライド内容を参考にしてもいいけど

    一度手前でAPI叩いてみるのをオススメ

    View Slide

  14. 決済の承認はアプリ内でもできるが
    •BillingClient#acknowledgePurchase

    https://developer.android.com/reference/com/android/billingclient/api/
    BillingClient.html#acknowledgePurchase(com.android.billingclient.api.AcknowledgePurchaseParams,
    %20com.android.billingclient.api.AcknowledgePurchaseResponseListener)
    •アプリ改ざんに弱いのでオススメできない

    ちゃんとやるならサーバサイドで承認するのが良い

    特に都度課金

    View Slide

  15. どういう事?
    BDLOPXMFEHF1VSDIBTFΛ

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

    View Slide

  16. アプリでの対策コスト考えると
    •よっぽどの事がない限り

    サーバサイドでacknowledgeしておいた方が

    改ざん対策やこれを考慮した複雑な処理フローにするより

    容易に決済の承認を実現できる…はず
    •Consumable productsではconsumeAsync()すれば良いと

    release notesに記載されているが

    サーバサイドでacknowledgeしてからconsumeするように
    •(サーバサイドでconsumeさせてほしい…)

    View Slide

  17. まとめ
    •Billing Client 2.0より

    ユーザのGoogle Play決済を

    開発者が承認する必要がある(Acknowledgement)
    •Acknowledgementはサーバサイドでやる
    •Consumableな商品でも

    サーバサイドでacknowledgeしてからconsumeする

    View Slide