LoginSignup
5
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-01-20

前置き

Qiita - クレジットカード決済にOmiseを導入してみている最中で、良さそうな点・いまいちな点 という記事とあわせてお読みください。

Omise はクレジットカード決済サービスの一つです。
Webpay からの移行先として導入してみているところです。

OmiseのWebhook

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

Omise Documents - Webhooks

  • 返ってくるのはJSON?
  • POSTでくる?

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

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

Omise Documents

そもそも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形式でした。
これくらいのこと、ドキュメントにちゃんと書いておいてくれたらよいのに……
(後、サポートさんに問い合わせても教えてもらえなかったので、教えてくれてもよいのに……)

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

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4