amon2 で造られた api サーバを引き継いで課金の実装をしました話

56
Amon2 ででででで API でで でででででででで ( ででででで )

Upload: -

Post on 16-Apr-2017

296 views

Category:

Engineering


1 download

TRANSCRIPT

Page 1: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

Amon2 でかかれたAPI サーバ開発を引継いだ

( 課金の実装 )

Page 2: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

who am I• t.amano / @sheercat• 職業 :

Servent CTO

• 言語 : perl go C C++ java clojure

• 会社 : livedoor → LINE → Diverse inc. (mixi 子会社 )

Page 3: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

Diverse は何をやってる会社か?

Page 4: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

YYC

Page 5: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

youbride

Page 8: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

そして、みなさん Poiboy やってますか?

Page 9: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

Poiboy の API サーバは Amon2 です。

Page 10: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

Plack です

Page 11: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

• Data::ObjectDriverXslateData::FormValidatorLog::Minimal

nginxnginx_smalllightmysqlmemcached

Page 12: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

で、 Poiboy とは

Page 13: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

Poiboy

Page 14: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

ポイして恋するコミュニケーションアプリです。(!?)

Page 15: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

このアプリ、男性は登録したら「ポイされるのを待つだけ」という、ストイックで諦観とも似た世界観のアプリです(女性はガンガン男性をさがせます)

Page 16: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

ところが、次回アップデートで男性からも女性に対してアピール可能になります。(この LT は Poiboy の宣伝ではありません)

Page 17: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

アピールするにはドピーが必要です

Page 18: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

\ドピー/

Page 19: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

ドピーとはなにか

Page 20: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

ドピーとは Poiboy 内の仮想通貨です

Page 21: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

1ドピーは 10JPY です

Page 22: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

ということで、アプリ内課金を実装する際のサーバサイドの話をします

Page 23: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

iOS (in app purchase)

Page 24: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

API サーバ側で in app purchase のレシート validate 処理をします(クライアントサイドでもできますが、なんか面倒そう)

Page 25: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

in app purchase レシートをサーバで validate する場合は buy.itunes.apple.com/verifyReceipt にレシート投げつけてレスポンスで正否を見ます

Page 26: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

ただし、 valid なレシートであればなんでも正とするため、はたしてそのレシートは本当に自分のアプリのレシートなのか ? を見ないといけません

Page 27: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

具体的には itune connect に登録した tier をサーバ側でももっておいて、レシート中にある product_id と比較して一致しないものはクラックであると判断します。(レシート偽装はクラックの常套手段です)

Page 28: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

偽装レシートとは、例えばこんなレシートです。.."product-id" = “com.zeptolab.ctrbonus.superpower1","bid" = “com.zeptolab.ctrexperiments”,..

Page 29: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

また、 original_transaction_id を uniq key とするテーブルにレコード insert するなどして、同じレシートがなんども処理されないようにする必要があります。

Page 30: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

サーバが落ちてたなどの理由でレシートの validate ができなかった場合は、アプリでレシートを保持しておいてリトライできるようにしておく必要があります。

Page 31: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

price( 価格 ) 情報が結構面倒で、サーバ側にもっておくか、アプリ側で取得してレシートといっしょに API にくれるか、どちらかなんですが

Page 32: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

itune connect に登録されている priceは為替、税制変更などのタイミングでさらっと ( 数年に一回とかの頻度で ) 変わるためアプリ側で取得してレシートといっしょに API にくれるのが理想的です。

Page 33: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

下手にサーバ側でもってる price と比較してチェックとかすると、なんかのタイミングで全部エラーになったりして危険です。

Page 34: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

かといって、単純にリクエストでもらったものを信用するのも危険です

Page 35: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

レシートに price 情報入れるか、サーバから API たたいたら教えてくれませんかね> apple 神

Page 36: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

Android (google wallet v3)

Page 37: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

Android でも同じアプリの課金が始まると、ひとりのユーザーが Android で買った仮想通貨と iOS で買った仮想通貨を両方持てるので、めんどうなことになります

Page 38: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

( iOS で買った仮想通貨を Android で使うことは apple の規約上許されてないと記憶しています。その逆も許されてないと記憶しています。)

Page 39: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

Android の場合も同じくレシートをアプリから送ってもらいますが、 iOS のように API を叩くのではなく、公開鍵と、シグネチャをつかって自力で validation します

Page 40: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

my $rsa = Crypt::OpenSSL::RSA->new_public_key($pub);unless ( $rsa->verify( $receipt, $signature ) ) { die "rsa verify error";}

こんな感じで。

Page 41: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

iOS と同じく product id チェック、 order id ユニーク化は必須です

Page 42: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

課金の試験

Page 43: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

iOS も Android もテスターユーザーを登録できるのでそのユーザーで課金すると、実際には支払うこと無く課金テストができます。

Page 44: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

Android は tester で課金すると orderId がレシートに入らないようになってしまいましたので注意が必要です。(6/7 くらいから )

Page 45: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

計上、レポート

Page 46: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

さて、計上のためのレポートは各課金実装よりもだいたい面倒なことになります。

Page 47: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

• 仮想通貨の場合は購入時に計上ではなく、消費時に計上するので面倒さが倍増しますずっと保持したままの人がでるので、自動的に expire するなどしないとずっと計上できないですただし、 iOS では購入した仮想通貨に期限つけてはいけないという規約があります。

Page 48: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

もし無料で仮想通貨を配ったりするときは購入したポイントと絶対混ぜないようにします。

Page 49: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

iOS と Android も混ぜないほうがいいでしょう

Page 50: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

場合により一定期間(年単位)トランザクションを全保存しなくてはならないこともあります。その場合はパンクしない保存方法で(DB に 1件 1件いれてると詰む )

Page 51: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

仮想通貨の場合は、資金決済法により、供託金、有料通貨と無料通貨の表記、など

Page 52: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

くわしくは御社の経理、法務、監査法人へお問い合わせください

Page 53: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

まとめ

Page 54: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

• 課金系はクラック対策必須product id 確認 transition id ユニークキー化サーバ不具合に備え、アプリにレシート再送処理課金実装時には、別デバイスで課金される想定をtest 課金時のレシートは本番と違うことがある課金実装よりも計上レポート実装のほうが重い法 律 重 要※法律、計上は課金実装前に詰めとかないと詰む

Page 56: Amon2 で造られた api サーバを引き継いで課金の実装をしました話

以上、ご清聴ありがとうございました