クレジットカード決済のOmiseからPOSTで渡されるデータをGoogleAppsScriptにて受け取る

## 前置き
[Qiita - クレジットカード決済にOmiseを導入してみている最中で、良さそうな点・いまいちな点](http://qiita.com/Hi_Noguchi/items/b8d71a1341ad07ce3296) という記事とあわせてお読みください。

[Omise](https://www.omise.co/ja) はクレジットカード決済サービスの一つです。
[Webpay](https://webpay.jp/) からの移行先として導入してみているところです。


## OmiseのWebhook
Omiseは、何らかのイベントが発生した時に、エンドポイントに指定したURLへ、データを渡してくれるようなしくみになっています。
ただ、ドキュメントを読んでみても、情報が少なくて何が返ってくるんだかよく分からないのですね。

[Omise Documents -  Webhooks](https://www.omise.co/ja/api-webhooks)

* 返ってくるのはJSON？
* POSTでくる？

このドキュメントだけでは分かりませんので、やってみて自分で確かめろ、ってことですかね……


## Omiseのドキュメントは最新らしい(サポートさん曰く)

[Omise Documents](https://www.omise.co/ja/docs)

そもそもOmiseのドキュメントは、

> Version 2015-11-17

のまま止まっているように見えます。
が、サポートさんに問合せてみたところ、最新にupdateされている、とのご回答でした。
いやそれなら、日付も最新にしておいて欲しいのですが……これについては、[別記事](http://qiita.com/Hi_Noguchi/items/b8d71a1341ad07ce3296)にてツッコミ入れてみます。

さて、日本語版のローカライズができていないだけなんじゃないか、という淡い期待を持って、URLから言語指定はずしてみました。

[Omise Documents - English - Webhooks](https://www.omise.co/api-webhooks)

すると、POSTで返ってくるということは分かりました。日本語ページで何で「POST」の記述をはずしたし。
何はともあれ、何が返ってくるのか、まずは試してみましょう。

なるべくサーバレスでやりたいと考えているので、ひとまず、GoogleAppsScriptで受け取るようにしてみます。
実装した最低限のコードとしては以下のようになります。

``` js
function doPost(e) {
  var jsonString = e.postData.getDataAsString();
  var jsonData   = JSON.parse(jsonString);
  
  var ss    = SpreadsheetApp.openById('hogehogehogehogehogehoge');
  var sheet = ss.getSheetByName('hoge');
  
  sheet.appendRow([jsonString]);
}
```

doPost() 関数を書くことで、トリガーは特に設定せずに、POSTで渡ってきたデータを受け取ることができるようになります。  
以下、GoogleAppsScript の doPost() のドキュメントなのですが、まあ、あまり親切ではないですね……

[GoogleAppsScript Documents - WebApps](https://developers.google.com/apps-script/guides/web)

あと、GoogleAppsScriptで動作させる上で、知っておかないとハマるよなあ……というポイントを押さえた記事を引用しておきます。

> アプリの実行権限を得る

[Qiita - スプレッドシートとgoogle apps scriptで簡易APIを作ってalamofireからget/postする](http://qiita.com/mito_log/items/cc2283cac1e2b325f9bc#%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E5%AE%9F%E8%A1%8C%E6%A8%A9%E9%99%90%E3%82%92%E5%BE%97%E3%82%8B)

> ４．スクリプトを変更したら必ずバージョンを更新する！

[Qiita - Google Apps ScriptだけでSpreadSheetへのPOST APIを持つWebアプリケーションを公開する](http://qiita.com/kazuph/items/8fb8b9b04bcb6070fca8#%EF%BC%94%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%9F%E3%82%89%E5%BF%85%E3%81%9A%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B)

あとは、Omiseのダッシュボードで、WebhookからエンドポイントのURLを登録しましょう。
登録すべきURLは、GooeleAppsScriptで発行されたURLになります。
URLの発行の仕方は、上記同記事、以下参照にて。

> １．まずスクリプトエディタ画面の公開＞ウェブアプリケーションとして導入をクリック  
> ２．アプリケーションの実行ユーザは「自分」、アクセスできるユーザーを「全員（匿名ユーザーを含む）」にする。これで公開URLゲットです。

[Qiita - Google Apps ScriptだけでSpreadSheetへのPOST APIを持つWebアプリケーションを公開する](http://qiita.com/kazuph/items/8fb8b9b04bcb6070fca8#%E5%85%AC%E9%96%8B%E3%81%99%E3%82%8B)


## JSONが返ってきた
さて、これらが済んだ上で、テストで決済をおこなってみたところ、指定したスプレッドシート内のシートの指定行に、以下の内容が返ってきました。

```
"{
  ""object"": ""event"",
  ""id"": ""evnt_test_hogehogehogehogehoge"",
  ""livemode"": false,
  ""location"": ""/events/evnt_test_hogehogehogehogehoge"",
  ""key"": ""charge.create"",
  ""created"": ""2017-01-19T07:19:08Z"",
  ""data"": {
    ""object"": ""charge"",
    ""id"": ""chrg_test_hogehogehogehogehoge"",
    ""livemode"": false,
    ""location"": ""/charges/chrg_test_hogehogehogehogehoge"",
    ""amount"": 1000,
    ""currency"": ""jpy"",
    ""description"": ""test\n\ntest"",
    ""status"": ""successful"",
    ""capture"": true,
    ""authorized"": true,
    ""reversed"": false,
    ""captured"": true,
    ""transaction"": ""trxn_test_hogehogehogehogehoge"",
    ""source_of_fund"": ""card"",
    ""refunded"": 0,
    ""refunds"": {
      ""object"": ""list"",
      ""from"": ""1970-01-01T00:00:00+00:00"",
      ""to"": ""2017-01-19T07:19:08+00:00"",
      ""offset"": 0,
      ""limit"": 20,
      ""total"": 0,
      ""order"": null,
      ""location"": ""/charges/chrg_test_hogehogehogehogehoge/refunds"",
      ""data"": [

      ]
    },
    ""return_uri"": ""https://link.omise.co/hogehoge/complete"",
    ""offsite"": null,
    ""reference"": ""paym_test_hogehogehogehogehoge"",
    ""authorize_uri"": ""http://api.omise.co/payments/paym_test_hogehogehogehogehoge/authorize"",
    ""failure_code"": null,
    ""failure_message"": null,
    ""card"": {
      ""object"": ""card"",
      ""id"": ""card_test_hogehogehogehogehoge"",
      ""livemode"": false,
      ""country"": ""us"",
      ""city"": null,
      ""postal_code"": null,
      ""financing"": """",
      ""bank"": """",
      ""last_digits"": ""4242"",
      ""brand"": ""Visa"",
      ""expiration_month"": 11,
      ""expiration_year"": 2020,
      ""fingerprint"": ""hogehogehogehogehogehogehogehogehogehoge"",
      ""name"": ""test"",
      ""security_code_check"": true,
      ""created"": ""2017-01-19T07:19:06Z""
    },
    ""customer"": null,
    ""ip"": ""192.168.1.1"",
    ""dispute"": null,
    ""created"": ""2017-01-19T07:19:07Z""
  }
}
"
```

JSON形式でした。
これくらいのこと、ドキュメントにちゃんと書いておいてくれたらよいのに……
（後、サポートさんに問い合わせても教えてもらえなかったので、教えてくれてもよいのに……）

ということで、課金時には上記が返ってきました。
イベント毎に、返ってくる中身は違ってくるはずです。
ご参考まで。