SlideShare una empresa de Scribd logo
1 de 56
Amon2でかかれたAPI
サーバ開発を引継いだ
(課金の実装)
who am I
• t.amano / @sheercat
• 職業:
Servent CTO
• 言語:
perl go C C++ java clojure
• 会社:
livedoor → LINE →
Diverse inc. (mixi子会社)
Diverse は何をやってる会社か
?
YYC
youbride
AM
VEAT
そして、みなさん
Poiboy やってますか
?
Poiboy の API サーバは
Amon2 です。
Plack です
• Data::ObjectDriver
Xslate
Data::FormValidator
Log::Minimal
nginx
nginx_smalllight
mysql
memcached
で、Poiboy とは
Poiboy
ポイして恋するコミュニケー
ションアプリです。
(!?)
このアプリ、男性は登録したら
「ポイされるのを待つだけ」と
いう、ストイックで諦観とも似
た世界観のアプリです
(女性はガンガン男性をさがせます
)
ところが、次回アップデートで男性からも
女性に対してアピール可能になります。
(このLTは Poiboy の宣伝ではありません
)
アピールするにはドピーが必要です
\ドピー/
ドピーとはなにか
ドピーとは Poiboy 内の仮想通貨です
1ドピーは10JPYです
ということで、アプリ内課金を
実装する際のサーバサイドの話
をします
iOS (in app purchase)
API サーバ側で in app purchase の
レシート validate 処理をします
(クライアントサイドでもできま
すが、なんか面倒そう)
in app purchase レシートをサーバ
で validate する場合は
buy.itunes.apple.com/verifyReceipt に
レシート投げつけてレスポンスで
正否を見ます
ただし、valid なレシートであれば
なんでも正とするため、はたして
そのレシートは本当に自分のアプ
リのレシートなのか?を見ないとい
けません
具体的には itune connect に登録した tier
をサーバ側でももっておいて、レシート中
にある product_id と比較して一致しない
ものはクラックであると判断します。
(レシート偽装はクラックの常套手段です
)
偽装レシートとは、例えばこんなレシート
です。
..
"product-id" = “com.zeptolab.ctrbonus.superpower1",
"bid" = “com.zeptolab.ctrexperiments”,
..
また、original_transaction_id を uniq key
とするテーブルにレコード insert するなど
して、同じレシートがなんども処理されな
いようにする必要があります。
サーバが落ちてたなどの理由でレシートの
validate ができなかった場合は、アプリで
レシートを保持しておいてリトライできる
ようにしておく必要があります。
price(価格)情報が結構面倒で、サーバ側に
もっておくか、アプリ側で取得してレシー
トといっしょにAPIにくれるか、どちらか
なんですが
itune connect に登録されているpriceは為
替、税制変更などのタイミングでさらっと
(数年に一回とかの頻度で) 変わるためアプ
リ側で取得してレシートといっしょにAPI
にくれるのが理想的です。
下手にサーバ側でもってる price と比較し
てチェックとかすると、なんかのタイミン
グで全部エラーになったりして危険です。
かといって、単純にリクエストでもらった
ものを信用するのも危険です
レシートにprice情報入れるか、サーバか
ら API たたいたら教えてくれませんかね
> apple 神
Android (google wallet v3)
Android でも同じアプリの課金が始まると
、ひとりのユーザーが Android で買った仮
想通貨と iOS で買った仮想通貨を両方持
てるので、めんどうなことになります
(iOS で買った仮想通貨を Android で使う
ことは apple の規約上許されてないと記憶
しています。その逆も許されてないと記憶
しています。)
Android の場合も同じくレシートをアプリ
から送ってもらいますが、iOS のように
APIを叩くのではなく、公開鍵と、シグネ
チャをつかって自力で validation します
my $rsa = Crypt::OpenSSL::RSA->new_public_key($pub);
unless ( $rsa->verify( $receipt, $signature ) ) {
die "rsa verify error";
}
こんな感じで。
iOS と同じく product id チェック、order
id ユニーク化は必須です
課金の試験
iOS も Android もテスターユーザーを登録
できるのでそのユーザーで課金すると、実
際には支払うこと無く課金テストができま
す。
Android は tester で課金すると orderId が
レシートに入らないようになってしまいま
したので注意が必要です。
(6/7 くらいから)
計上、レポート
さて、計上のためのレポートは各課金実装
よりもだいたい面倒なことになります。
• 仮想通貨の場合は購入時に計上ではなく、
消費時に計上するので面倒さが倍増します
ずっと保持したままの人がでるので、自動的
に expire するなどしないとずっと計上でき
ないです
ただし、iOS では購入した仮想通貨に期限つ
けてはいけないという規約があります。
もし無料で仮想通貨を配ったりするときは
購入したポイントと絶対混ぜないようにし
ます。
iOS と Android も混ぜないほうがいいでし
ょう
場合により一定期間(年単位)トランザク
ションを全保存しなくてはならないことも
あります。
その場合はパンクしない保存方法で
(DBに1件1件いれてると詰む)
仮想通貨の場合は、資金決済法により、供
託金、有料通貨と無料通貨の表記、など
くわしくは御社の経理、法務、監査法人へ
お問い合わせください
まとめ
• 課金系はクラック対策必須
product id 確認 transition id ユニークキー化
サーバ不具合に備え、アプリにレシート再送処理
課金実装時には、別デバイスで課金される想定を
test 課金時のレシートは本番と違うことがある
課金実装よりも計上レポート実装のほうが重い
法 律 重 要
※法律、計上は課金実装前に詰めとかないと詰む
Poiboy
以上、ご清聴ありがとうございました

Más contenido relacionado

Destacado (6)

CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したい
 
2016年のPerl (Long version)
2016年のPerl (Long version)2016年のPerl (Long version)
2016年のPerl (Long version)
 
Json(::PP) is a-changing
Json(::PP) is a-changingJson(::PP) is a-changing
Json(::PP) is a-changing
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
 
Perl logging
Perl loggingPerl logging
Perl logging
 
2017年春のPerl
2017年春のPerl2017年春のPerl
2017年春のPerl
 

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

mixiアプリ『the Actress』運用にあたっての課題へのチャレンジ
mixiアプリ『the Actress』運用にあたっての課題へのチャレンジmixiアプリ『the Actress』運用にあたっての課題へのチャレンジ
mixiアプリ『the Actress』運用にあたっての課題へのチャレンジ
Shinya Okano
 

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

コロナ時代を生き抜く(?) Slackアプリ開発・運用知見まとめ
コロナ時代を生き抜く(?) Slackアプリ開発・運用知見まとめコロナ時代を生き抜く(?) Slackアプリ開発・運用知見まとめ
コロナ時代を生き抜く(?) Slackアプリ開発・運用知見まとめ
 
PEP x LINE WORKS Introduction
PEP x LINE WORKS IntroductionPEP x LINE WORKS Introduction
PEP x LINE WORKS Introduction
 
Slack,Teams,LINE botの作り方の違いとか
Slack,Teams,LINE botの作り方の違いとかSlack,Teams,LINE botの作り方の違いとか
Slack,Teams,LINE botの作り方の違いとか
 
Slack,Teams,LINE botの作り方の違いとか
Slack,Teams,LINE botの作り方の違いとかSlack,Teams,LINE botの作り方の違いとか
Slack,Teams,LINE botの作り方の違いとか
 
Fetch apiについて
Fetch apiについてFetch apiについて
Fetch apiについて
 
mixiアプリ『the Actress』運用にあたっての課題へのチャレンジ
mixiアプリ『the Actress』運用にあたっての課題へのチャレンジmixiアプリ『the Actress』運用にあたっての課題へのチャレンジ
mixiアプリ『the Actress』運用にあたっての課題へのチャレンジ
 
Rails api way in aiming
Rails api way in aimingRails api way in aiming
Rails api way in aiming
 
俺とサーバレスアーキテクチャ Aws cognito + aws api gateway 編
俺とサーバレスアーキテクチャ Aws cognito + aws api gateway 編俺とサーバレスアーキテクチャ Aws cognito + aws api gateway 編
俺とサーバレスアーキテクチャ Aws cognito + aws api gateway 編
 
楽ちんユーザー認証付Spa
楽ちんユーザー認証付Spa楽ちんユーザー認証付Spa
楽ちんユーザー認証付Spa
 
LIFFとの連携でさらに強力に。こんなに使えるLINEログイン
LIFFとの連携でさらに強力に。こんなに使えるLINEログインLIFFとの連携でさらに強力に。こんなに使えるLINEログイン
LIFFとの連携でさらに強力に。こんなに使えるLINEログイン
 
ロボット・ソフトウェア開発環境ROSとは何か? (in Japanese)
ロボット・ソフトウェア開発環境ROSとは何か? (in Japanese)ロボット・ソフトウェア開発環境ROSとは何か? (in Japanese)
ロボット・ソフトウェア開発環境ROSとは何か? (in Japanese)
 
KANAZAWA アプリ開発塾 2015 アプリ制作マスターへの道
KANAZAWA アプリ開発塾 2015 アプリ制作マスターへの道KANAZAWA アプリ開発塾 2015 アプリ制作マスターへの道
KANAZAWA アプリ開発塾 2015 アプリ制作マスターへの道
 
MTDDC 2019 LINE ボットからみた MT Data API の可能性
MTDDC 2019 LINE ボットからみた MT Data API の可能性MTDDC 2019 LINE ボットからみた MT Data API の可能性
MTDDC 2019 LINE ボットからみた MT Data API の可能性
 
金沢アプリ塾 アプリ・オープンデータとライセンス
金沢アプリ塾 アプリ・オープンデータとライセンス金沢アプリ塾 アプリ・オープンデータとライセンス
金沢アプリ塾 アプリ・オープンデータとライセンス
 
Webな技術でIoT自販機を作って運用している話 -ポケットチェンジでのものづくり-
Webな技術でIoT自販機を作って運用している話 -ポケットチェンジでのものづくり-Webな技術でIoT自販機を作って運用している話 -ポケットチェンジでのものづくり-
Webな技術でIoT自販機を作って運用している話 -ポケットチェンジでのものづくり-
 
CONBU API の開発
CONBU API の開発CONBU API の開発
CONBU API の開発
 
Azure App Service Overview LT
Azure App Service Overview LTAzure App Service Overview LT
Azure App Service Overview LT
 
PowerShellでFunction Appしよう!
PowerShellでFunction Appしよう!PowerShellでFunction Appしよう!
PowerShellでFunction Appしよう!
 
LINE Commumity Microsoft_ConversationalAI_20200409
LINE Commumity Microsoft_ConversationalAI_20200409LINE Commumity Microsoft_ConversationalAI_20200409
LINE Commumity Microsoft_ConversationalAI_20200409
 
Heroku+MongoLabでダミーサーバー
Heroku+MongoLabでダミーサーバーHeroku+MongoLabでダミーサーバー
Heroku+MongoLabでダミーサーバー
 

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