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

定期料金と従量課金を組み合わせたサブ スクリプション型サービスを作る/jp-stripe-02

定期料金と従量課金を組み合わせたサブ スクリプション型サービスを作る/jp-stripe-02

Serverless Operations

June 09, 2021
Tweet

More Decks by Serverless Operations

Other Decks in Technology

Transcript

  1. Serverless Operations / Sonu Kim
    ఆظྉۚͱैྔ՝ۚΛ૊Έ߹Θͤͨαϒ
    εΫϦϓγϣϯܕαʔϏεΛ࡞Δ

    View Slide

  2. ϓϩϑΟʔϧ
    ۚɹઋ༏Kim Sonu
    ʮ૝͍Λ͙͢ʹܗʹͰ͖Δʯ͜ͱͰ
    ɹαʔόʔϨεʹίϛοτ͍ͯ͠Δ
    ϑϩϯτΤϯυʗόοΫΤϯυΛ໰Θͣɺ
    ָ͘͠αʔϏεΛ࡞Δͷ͕ੜ͖͕͍

    View Slide

  3. αʔόʔϨεͰ
    Ϋϥ΢υͷՁ஋Λ࠷େݶʹ
    Serverless Operations ͸͜Ε·ͰάϩʔόϧͷୈҰઢͰ
    ഓ͖ͬͯͨΫϥ΢υٕज़ʢ"84ʵΞϚκϯ΢ΣϒαʔϏεʣͷ
    ๛෋ͳ࣮੷ͱ஌ݟΛ׆͔͠ɺ͓٬͞·ͷαʔόʔϨε
    ʹؔ͢Δ͞·͟·ͳ՝୊Λղܾ͠·͢ɻ
    ձࣾ঺հ
    serverless.co.jp

    View Slide

  4. ຊ೔ͷςʔϚ
    ఆظྉۚͱैྔ՝ۚΛ૊Έ߹ΘͤͨྉۚମܥΛ4USJQFΛ࢖ͬ
    ࣮ͯݱ͢Δํ๏Λ۩ମతʹ঺հ
    "84ͰͷαʔόʔϨεͳγεςϜߏ੒ͷύλʔϯΛ঺հ

    View Slide

  5. ࣮ݱ͍ͨ͜͠ͱͷ֓ཁʢαϒεΫϦϓγϣϯʴैྔ՝ۚʣ
    #BTJDϓϥϯ݄
    "EWBODFEϓϥϯ݄
    &OUFSQSJTFϓϥϯ݄
    "1*ݺͼग़͠ճ਺
    ʢ"1*6TBHFʣ

    View Slide

  6. ࣮ݱ͍ͨ͜͠ͱͷ֓ཁʢαϒεΫϦϓγϣϯʴैྔ՝ۚʣ
    &OUFSQSJTFϓϥϯ݄
    "1*ݺͼग़͠ճ਺
    ʢ"1*6TBHFʣ
    ຖ݄ܾ·ͬͨྉۚΛ੥ٻ
    "1*ͷݺͼग़͠ճ਺ʹԠͯ͡
    ྉۚΛܭࢉͯ͠੥ٻ
    #BTJDϓϥϯ݄
    "EWBODFEϓϥϯ݄

    View Slide

  7. ࣮ݱ͍ͨ͜͠ͱͷ֓ཁʢαϒεΫϦϓγϣϯʴैྔ՝ۚʣ
    &OUFSQSJTFϓϥϯ݄
    "1*ݺͼग़͠ճ਺
    ʢ"1*6TBHFʣ
    ຖ݄ܾ·ͬͨྉۚΛ੥ٻ
    "1*ͷݺͼग़͠ճ਺ʹԠͯ͡
    ྉۚΛܭࢉͯ͠੥ٻ
    #BTJDϓϥϯ݄
    "EWBODFEϓϥϯ݄
    αϒεΫ͚ͩͰͳ͘ɺ
    ैྔ՝ۚ෼·Ͱूܭͯ͠
    ੥ٻʹ൓өͤ͞ΔΑ͏ͳ
    ࣮૷ରԠ͕ඞཁʹͳͬͯ͘Δ
    αʔϏε։࢝·Ͱྉۚମܥ͕
    ֬ఆ͠ͳ͍౳ɺޙ͔Βॊೈʹ
    ՝ۚϞσϧΛมߋͰ͖ΔΑ͏ʹ͍ͨ͠

    View Slide

  8. ࣮ݱ͍ͨ͜͠ͱͷ֓ཁʢαϒεΫϦϓγϣϯʴैྔ՝ۚʣ
    #BTJDϓϥϯ݄
    "EWBODFEϓϥϯ݄
    &OUFSQSJTFϓϥϯ݄
    "1*ݺͼग़͠ճ਺
    ʢ"1*6TBHFʣ
    ຖ݄ܾ·ͬͨྉۚΛ੥ٻ
    "1*ͷݺͼग़͠ճ਺ʹԠͯ͡
    ྉۚΛܭࢉͯ͠੥ٻ
     料金体系 → ”継続” として商品登録
    ・段階的/数量ベースの料金体系として商品登録


    ・Stripeへ使用量を報告し、毎月の請求に反映させる

    View Slide

  9. αϯϓϧͷ঎඼Λొ࿥͢Δ
    ᶃ4BOECPYr#BTJD1MBOɿҰൠతͳఆظߪೖ޲͚ͷ঎඼Λొ࿥
    ᶄ4BOECPYr"1*6TBHFɿ"1*ݺͼग़͠ճ਺౳ɺैྔ՝ۚ޲͚ͷ঎඼Λొ࿥

    View Slide

  10. αϯϓϧͷ঎඼Λొ࿥͢Δ
    ᶃ4BOECPYr#BTJD1MBOɿҰൠతͳఆظߪೖ޲͚ͷ঎඼Λ૝ఆ
     料金体系モデル: “標準の料金体系”
    “継続”

    View Slide

  11. αϯϓϧͷ঎඼Λొ࿥͢Δ
    ᶄ4BOECPYr"1*6TBHFɿ"1*ݺͼग़͠ճ਺౳ɺैྔ՝ۚ޲͚ͷ঎඼Λొ࿥
     料金体系モデル: “段階的な料金体系”
    ैྔ՝ۚ޲͚ͷྉۚମܥͱͯ͠͸
    ʮஈ֊తʯͱʮ਺ྔϕʔεʯͷ
    ̎छྨ͕͋Δ
    具体的な従量課金の料金体系を設定

    View Slide

  12. αϯϓϧͷ঎඼Λొ࿥͢Δ
    ᶄ4BOECPYr"1*6TBHFɿ"1*ݺͼग़͠ճ਺౳ɺैྔ՝ۚ޲͚ͷ঎඼Λొ࿥
     料金体系モデル: “段階的な料金体系”
    具体的な従量課金の料金体系を設定
    ैྔ՝ۚ޲͚ͷྉۚମܥͱͯ͠͸
    ʮஈ֊తʯͱʮ਺ྔϕʔεʯͷ
    ̎छྨ͕͋Δ
     例えば1ユニットあたりの金額を算定する方式として


     「1-100回目は○○円、101-200回目は○○円」と段階的に


     異なる料金を積み上げていく(段階式)


     「合計回数100回以下の場合○○円、合計回数200回以下の場合は


     ○○円、合計回数が201回以上の場合は○○円」と


     合計数ベースで単価を決める(数量ベース)

    View Slide

  13. ࢖༻ྔΛܭଌ͢ΔΦϓγϣϯΛ༗ޮԽ
    ᶄ4BOECPYr"1*6TBHFɿ"1*ݺͼग़͠ճ਺౳ɺैྔ՝ۚ޲͚ͷ঎඼Λొ࿥
    「Usage is metered(使用量が計測されます)」にチェック
    「Charge for metered usage by(計測された使用量に基づく請求)」


    → 適宜システム仕様に合わせて選択

    View Slide

  14. ࢖༻ྔΛܭଌ͢ΔΦϓγϣϯΛ༗ޮԽ
    ᶄ4BOECPYr"1*6TBHFɿ"1*ݺͼग़͠ճ਺౳ɺैྔ՝ۚ޲͚ͷ঎඼Λొ࿥
    「Usage is metered(使用量が計測されます)」にチェック
    「Charge for metered usage by(計測された使用量に基づく請求)」


    → 適宜システム仕様に合わせて選択
    ˞ޙ΄Ͳઆ໌͢Δʮ࢖༻ྔͷใࠂʯ
    ͕Ͱ͖ΔΑ͏ʹͳΔ
    ˞࣮ࡍʹ֤Ϣʔβʔͷ࢖༻ྔΛTUSJQF
    ͷ"1*ܦ༝ͰϨϙʔτ͢Δ͚ͩͰɺ঎
    ඼ొ࿥࣌ʹઃఆͨ͠ྉۚςʔϒϧʹ߹
    Θͤͯ՝ֹ͕ۚ੥ٻॻʹ൓ө͞ΕΔ

    View Slide

  15. ސ٬ٴͼαϒεΫϦϓγϣϯͷొ࿥
    ސ٬ɺࢧ෷৘ใɺαϒεΫϦϓγϣϯΛొ࿥
    ˞͓ࢼ͠Ͱܾࡁొ࿥ը໘ͷσϞΛ࡞ͬͯΈ͍ͨ৔߹ɺެࣜͷ$IFDLPVUαϯϓϧ͕ศར
    e// https://github.com/stripe-samples/checkout-single-subscription


    e// server/node/server.js L.50 -


    econst session = await stripe.checkout.sessions.create({


    mode: 'subscription',


    payment_method_types: [ 'card' ],


    line_items: [


    { price: '{PRICE_ID_PLAN}', quantity: 1 },


    { price: '{PRICE_ID_API_USAGE}' }


    ],


    // ...


    View Slide

  16. ސ٬ٴͼαϒεΫϦϓγϣϯͷొ࿥
     先程登録した2つの商品


    (定額課金・従量課金)が


    表示されている
    ˞Χʔυ൪߸͸TUSJQFςετϞʔυ
    ઐ༻ͷ൪߸Λ࢖༻

    View Slide

  17. αϒεΫϦϓγϣϯొ࿥௚ޙʹ੥ٻΛ֬ೝ͢Δͱɾɾɾ
    ˞ఆظྉۚʢ#BTJD1MBOʣͷྉ͕ۚ൓ө͞Ε͍ͯΔ

    View Slide

  18. ैྔ՝ۚͷ࢖༻ྔΛใࠂ͢Δɹ
    e[request sample]


    ePOST /v1/subscription_items/:subscription_item_id/usage_records


    eauthorization: Bearer {SECRET_API_KEY}


    econtent-type: application/x-www-form-urlencoded


    etimestamp=1614752111&quantity=250&action=set


    e[response sample]


    e200 OK


    e{


    e "subscription_item": "xxx",


    e "quantity": 250,


    e "timestamp": 1615097751,


    e // ...


    e}


    ैྔ՝ۚ .FUFSFE #JMMJOH
    ͷֹۚΛ൓өͤ͞ΔͨΊʹɺސ٬͕ར༻ͨ͠ྔ Ϣ
    χοτ
    Λ਺஋ͱͯ͠4USJQFʹૹ৴ʢ˞6TBHF3FDPSET"1*ʣ
    ˞1BUIύϥϝʔλʹސ٬ͷఆظࢧ෷ͷ
    μογϡϘʔυը໘͔ΒऔಘͰ͖Δ
    ʮαϒεΫϦϓγϣϯΞΠςϜ*%
    ʢ[email protected]ʣʯΛࢦఆͯ͠਺ྔΛૹ৴
    ˞4USJQF"1*ʹ͸3BUF-JNJU͕͋ΔͷͰ஫ҙ
    ʢMJWFNPEFͰSFBE XSJUFQFSTFDPOEʣ

    IUUQTTUSJQFDPNEPDTSBUFMJNJUT

    View Slide

  19. ैྔ՝ۚͷ࢖༻ྔΛใࠂ͢Δ
    ࢖༻ྔΛใࠂͨ͠ޙͷ੥ٻ৘ใΛ֬ೝ

    View Slide

  20. ΞυϗοΫʹ੥ٻ߲໨ͱֹۚΛ௥Ճ͢Δํ๏΋͋Δ
    αϒεΫϦϓγϣϯͷظؒதʹ࣍ճͷ੥ٻ߲໨Λਵ࣌௥ՃͰ͖Δ"1*΋͋Δ

    ݮֹ΋ՄೳͰɺΞυϗοΫʹ࣍ճ੥ٻͷֹۚΛௐઅɾਫ਼ࢉ͢Δͱ͍ͬͨ࢖͍ํ͕Ͱ͖ͦ͏

    IUUQTTUSJQFDPNEPDTCJMMJOHJOWPJDFT
    TVCTDSJQUJPOBEEJOHVQDPNJOHJOWPJDFJUFNT

    View Slide

  21. (FPMPOJB ΦϯϥΠϯ஍ਤαʔϏε
    ͷࣄྫ
    ྉۚମܥ͕ྲྀಈతͩͬͨΓɺैྔ՝ۚΛεΫϥονͰ։ൃ͢Δෛ୲͕͋ͬͨ
    ˠมߋՄೳͰॊೈͳ࢓૊Έͷ࣮ݱͱ࣮૷ෛ୲Λܰݮ
    ΧϜϯ΀ϲε
    ĖຌᲦό⑲τ
    ܭଌσʔλͷ&5-ॲཧΛܦͯ%ZOBNP%#΁อଘ
    ᑿᠭᅗΤᏄຓ
    -BNCEB
    "QQMJDBUJPO
    4 "UIFOB
    'BSHBUF
    %ZOBNP%# -BNCEB
    4
    %ZOBNP%#
    4USFBNT
    e{


    e “subject_id”: "...",


    e “subscription_item”: "...",


    e "quantity": 100,


    e "timestamp": 1615097751,


    e // …


    e}


    ˞ࣄྫ঺հهࣄ͸ͪ͜ΒIUUQTTFSWFSMFTTDPKQCMPH

    View Slide

  22. "84αʔόʔϨεͳγεςϜߏ੒ͷྫ
    ܭଌϩάʢNFUSJDMFWFM౳ʣΛऩू͠ɺ&5-ॲཧΛܦͯ%ZOBNP%#ʹ֨ೲɺ
    %ZOBNP%#4USFBNTΛར༻ͯ͠ॱ࣍࢖༻ྔΛૹ৴͢Δ
    ΧϜϯ΀ϲε
    ĖຌᲦό⑲τ
    ܭଌσʔλͷ&5-ॲཧΛܦͯ%ZOBNP%#΁อଘ
    ᑿᠭᅗΤᏄຓ
    -BNCEB
    "QQMJDBUJPO
    'BSHBUF
    %ZOBNP%# -BNCEB
    4
    %ZOBNP%#
    4USFBNT
    ,JOFTJT'JSFIPTF
    e{


    e “subject_id”: "...",


    e “subscription_item”: "...",


    e "quantity": 100,


    e "timestamp": 1615097751,


    e // …


    e}


    View Slide

  23. ·ͱΊ
    ఆظྉۚͷ঎඼ͱैྔ՝ۚͷ঎඼Λ྆ํొ࿥͠ɺαϒεΫϦϓγϣϯ͢Δ
    ैྔ՝ۚͷ঎඼͸࢖༻ྔΛܭଌ͢ΔΦϓγϣϯΛ༗ޮԽ͠ɺ

    "1*ܦ༝Ͱ࢖༻ྔΛใࠂ͢Δͱ੥ٻʹ൓ө͞ΕΔ
    ैྔ՝ۚʹ൐͏՝ۚϩδοΫΛࣗલͰ࣮૷͢Δඞཁ͕ͳ͘ɺ4USJQFΛ࢖͍͜ͳͦ͏
    αʔόʔϨεͷྑ͞Λ׆͔ͯ͠ॊೈͳઃܭΛ໨ࢦ͠·͠ΐ͏
    ˞ຊ೔ͷ͓࿩͸ͪ͜Βͷϒϩάهࣄͷ಺༰Λݩʹ͍ͯ͠·͢ɻ߹Θͤͯ͝ࢀߟ͍ͩ͘͞ɻ

    IUUQTTFSWFSMFTTDPKQCMPH

    View Slide

  24. serverless.co.jp

    View Slide