前置き
Qiita - クレジットカード決済にOmiseを導入してみている最中で、良さそうな点・いまいちな点 という記事とあわせてお読みください。
Omise はクレジットカード決済サービスの一つです。
Webpay からの移行先として導入してみているところです。
OmiseのWebhook
Omiseは、何らかのイベントが発生した時に、エンドポイントに指定したURLへ、データを渡してくれるようなしくみになっています。
ただ、ドキュメントを読んでみても、情報が少なくて何が返ってくるんだかよく分からないのですね。
- 返ってくるのはJSON?
- POSTでくる?
このドキュメントだけでは分かりませんので、やってみて自分で確かめろ、ってことですかね……
Omiseのドキュメントは最新らしい(サポートさん曰く)
そもそもOmiseのドキュメントは、
Version 2015-11-17
のまま止まっているように見えます。
が、サポートさんに問合せてみたところ、最新にupdateされている、とのご回答でした。
いやそれなら、日付も最新にしておいて欲しいのですが……これについては、別記事にてツッコミ入れてみます。
さて、日本語版のローカライズができていないだけなんじゃないか、という淡い期待を持って、URLから言語指定はずしてみました。
Omise Documents - English - Webhooks
すると、POSTで返ってくるということは分かりました。日本語ページで何で「POST」の記述をはずしたし。
何はともあれ、何が返ってくるのか、まずは試してみましょう。
なるべくサーバレスでやりたいと考えているので、ひとまず、GoogleAppsScriptで受け取るようにしてみます。
実装した最低限のコードとしては以下のようになります。
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
あと、GoogleAppsScriptで動作させる上で、知っておかないとハマるよなあ……というポイントを押さえた記事を引用しておきます。
アプリの実行権限を得る
Qiita - スプレッドシートとgoogle apps scriptで簡易APIを作ってalamofireからget/postする
4.スクリプトを変更したら必ずバージョンを更新する!
Qiita - Google Apps ScriptだけでSpreadSheetへのPOST APIを持つWebアプリケーションを公開する
あとは、Omiseのダッシュボードで、WebhookからエンドポイントのURLを登録しましょう。
登録すべきURLは、GooeleAppsScriptで発行されたURLになります。
URLの発行の仕方は、上記同記事、以下参照にて。
1.まずスクリプトエディタ画面の公開>ウェブアプリケーションとして導入をクリック
2.アプリケーションの実行ユーザは「自分」、アクセスできるユーザーを「全員(匿名ユーザーを含む)」にする。これで公開URLゲットです。
Qiita - Google Apps ScriptだけでSpreadSheetへのPOST APIを持つWebアプリケーションを公開する
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形式でした。
これくらいのこと、ドキュメントにちゃんと書いておいてくれたらよいのに……
(後、サポートさんに問い合わせても教えてもらえなかったので、教えてくれてもよいのに……)
ということで、課金時には上記が返ってきました。
イベント毎に、返ってくる中身は違ってくるはずです。
ご参考まで。