株式会社スマレジの開発部でスマレジのサーバサイドを作っています

GAS+Google Cloud SQLで、購入者情報を保存する

こんにちは!株式会社スマレジ、開発部のmasaです。

台風10号が近づいておりますが、皆様はいかがお過ごしですか? 関西は直撃はなさそうですが、暴風域の大きな台風なので、油断せずに対処したいですね。

さて、前々回に取引登録APIを実行するところまで実施しました。 今回は現在の連携アプリの仕様に軽く触れながら、連携アプリの起動部分の処理を作成していきます。

自分のアプリが購入された時の動作

アプリマーケットに登録した自分のアプリが購入されると、↓のdevelopersのスクリーンショットで示す連携先のURLに購入した人の情報が渡ります。

f:id:masa2019:20200906204808p:plain
アプリ購入時に飛ばす購入通知Webhook送信先

具体的にどんなデータが飛ぶのかは、下記を参考にしてください。

developers.smaregi.dev

外部アプリを起動する際の動作

Developerサイトからアプリを登録すると、 下の図のようにサンドボックス環境で自分の登録したアプリが「ご利用中のアプリ」として表示され、アプリ起動時の動作を 検証することができます。

f:id:masa2019:20200906202643p:plain
サンドボックス環境では、アプリを登録すると「利用中のアプリ」に自動的に登録される

この登録アプリへのリンクですが、下図の示すdeveloperサイトのアプリのURLへのリンクになります。

f:id:masa2019:20200906203652p:plain
ここに記載したリンクが「ご利用中のアプリ」押したときの遷移先になる。

この際、スマレジ側からユーザ情報などは送付されないため、シームレスな認証ではなく、 購入時にWenhook通知された情報の中に存在するユーザかを認証をしてあげる必要が発生します。 (COOKIEなどを使えば擬似シームレスにすることは可能ですが・・・) つまり、購入者通知Webhookで通知された内容をどこかに保存してあげる必要があるわけです。

簡単でお手軽なGoogle Cloud SQL

今回は、保存方法として、Google Cloud SQLを使います。

cloud.google.com

Googleならfirebaseも手軽でポピュラーですが、Container-bound Scripts(元々スプレッドシートやドキュメントに紐づいたスクリプト)から利用することを考えるとGoogle Cloud SQLの方がソースの移植がしやすいので、こちらを選択しています。(半分は趣味ですけど汗)

※※ 「スプレッドシートをDBがわり」にするのは、やめたほうがいいと思います。利用者通知Webhookは利用者の契約IDなどを含むため、個人を特定する情報ではありません。しかし、ほとんどの場合、契約IDだけでなく作成された連携アプリの情報を管理することになると思います。スプレッドシートは権限変更されると、誰でも手軽に中身を参照できてしまうため、セキュリティリスクは高めです。それに比べるとセキュリティリスクの低いデータベースサービスの利用をお勧めします。

※※※ Google Cloud SQLを利用するにはGCPのプロジェクトを作成する必要があります。GCPはお試し期間の間は300ドル程の無料使用枠がありますが、それを過ぎると課金が発生します。実運用される際は、出来る限り無料枠があるうちに実施して、費用感などを押さえておくことを強くお勧めします。(特にGoogle Cloud SQLは課金モデルがSQLにも依存するので、組み上がるまで費用感を測りにくいため)

Google Cloud SQLについては、下記のサイト様の連載がとてもとてもわかりやすく参考になりました。 非エンジニアの方にもわかりやすい内容だと思うので、是非参考にしてみてください。

tonari-it.com

まずは、GCPの管理画面のサイドバーを開いて、「ストレージ」の「SQL]を選択↓

f:id:masa2019:20200906212020p:plain
ストレージのSQLを選ぶ

DBMSの選択を聞かれるので、お好きなものを選択。(僕はMySQLを選びました)

f:id:masa2019:20200906212218p:plain
DBMSの選択

その後、画面に従いrootのパスワードやインスタンス名を登録し、「作成」ボタンを押して、5分ほど待つとインスタンスが生成される。

生成が終わったら、「データベース」から「データベースの追加」を実施 f:id:masa2019:20200906213104p:plain

また、「ユーザー」からroot以外のサービス用のユーザを作成しておく。

その後、下記画像の赤枠の「Cloud Shellをアクティブにする」からGoogle Cloud Shellを立ち上げて、下記のコマンドを実行。

gcloud sql connect <インスタンスID> --user=<作成したサービス用のユーザ>

すると、パスワードを求められるので入力すると、DBMSのクライアントが立ち上がります。

ここで、CREATE TABLE等のスキーマ定義や事前に仕込むレコードの追加をしておきます。

GAS側でレコードを追加するメソッド例

  var connection = Jdbc.getCloudSqlConnection("★", "”ユーザID, "パスワード");
  var statement = connection.createStatement();
  statement.executeUpdate("insert into test_info(test_id) values('test')");
  statement.close();
  connection.close();

★に入力するのは、「概要」の「このインスタンスに接続」の「接続名」(下図を参考にしてください) f:id:masa2019:20200906214312p:plain

で、これを実行して、Cloud Shellを確認すると、データが入っていることが確認できると思います。