PAY.JPのwebhookをwordpressで受け取ってみる

この記事はwebhookの事を把握している方向けです。
phpの基礎的な説明はありません。

一応補足しておくと、

あるwebアプリケーションで何かイベントが起きた場合に、
そのイベント内容を他のwebアプリケーションに通知する。
これがwebhookだ。

 

wordpressでwebhookを受け取る

wordpress側でwebhookを受け取るURLは

ドメイン/wp-admin/admin-ajax.php?action=hoge

となっていて、「hoge」の部分は任意でこれから設定します。

functions.phpにアクションフックを追加する

functions.phpに次のようにアクションフックを追加します。

add_action(‘wp_ajax_hoge’, ‘hoge’);
add_action(‘wp_ajax_nopriv_hoge’, ‘hoge’);
function hoge() {
//ここに処理内容を書く。
}

「wp_ajax_」の部分は決まっていてここでは「hoge」を設定しています。

‘wp_ajax_hoge’ ログインユーザー用
‘wp_ajax_nopriv_hoge’ 一般ユーザー用

この二つを用意しておきます。

「どういう仕組みになっているか」、「実際にdo_actionされる場所」などを確認するには

/wp-admin/admin-ajax.phpを開いて確認してください。

PAY.JP側の設定

PAY.JPの管理画面「API」ページを開きます。

「webhook」を追加ボタンをクリック。

「URL」には先ほど出てきた
ドメイン/wp-admin/admin-ajax.php?action=hoge

これを入れます。

「テストモード」の状態で「保存」をクリック。

これで完了です。

受け取り側の準備

wordpress側のfunctions.phpの編集

add_actionのところで設定したhoge関数の内容を書いていきます。

function hoge() {
$json = file_get_contents(“php://input”);
}

webhookはポストで送られてくるので、そのポストを取得する方法が
file_get_contents(“php://input”);です。

json形式なので、テキストデータとして
error_log(‘json=’.$json);
で、debug.logに出力して確認出来ます。

echoなどで出力させると、pay.jp送信側でエラーになりますので注意。

テストイベント送信

pay.jpに戻って先ほどの「API」ページの「テストイベントを送信」をクリック

URLに登録した「ドメイン/wp-admin/admin-ajax.php?action=hoge」を選択。

イベントは適当なものを選択して送信しましょう。

失敗するとエラー表示になります。

wpのdebug.logで確認

/wp-content/debug.logをブラウザで開いてみましょう。

json形式のイベントデータが出力されているはずです。

以下のような内容です。

{
  "created": 1442212986,
  "data": {
    "amount": 5000,
    "amount_refunded": 0,
    "captured": true,
    "captured_at": 1442212986,
    "card": {
      "address_city": null,
      "address_line1": null,
      "address_line2": null,
      "address_state": null,
      "address_zip": null,
      "address_zip_check": "unchecked",
      "brand": "Visa",
      "country": null,
      "created": 1442212986,
      "customer": null,
      "cvc_check": "passed",
      "exp_month": 1,
      "exp_year": 2016,
      "fingerprint": "e1d8225886e3a7211127df751c86787f",
      "id": "car_f0984a6f68a730b7e1814ceabfe1",
      "last4": "4242",
      "name": null,
      "object": "card"
    },
    "created": 1442212986,
    "currency": "jpy",
    "customer": null,
    "description": null,
    "expired_at": null,
    "failure_code": null,
    "failure_message": null,
    "id": "ch_bcb7776459913c743c20e9f9351d4",
    "livemode": false,
    "object": "charge",
    "paid": true,
    "refund_reason": null,
    "refunded": false,
    "subscription": null
  },
  "id": "evnt_5328acdbdb5294d6fc9cc903f8c",
  "livemode": false,
  "object": "event",
  "pending_webhooks": 1,
  "type": "charge.succeeded"
}

 

セキュリティのためトークンを確認

受け取るwebhookが意図したpay.jpアカウントからのものである事を確認する必要があります。

PAY.JPの管理画面「API」ページの

発信元トークン:whook_abc12345697(数字とアルファベットの文字列)
これがwebhookリクエストにあるかどうか確認しましょう。
トークンはwebhookのhttpリクエストのヘッダー内に
HTTP_X_PAYJP_WEBHOOK_TOKEN
という変数で格納されています。
これを取り出して確認しましょう。
function hoge() {
$json = file_get_contents(“php://input”);
error_log(‘json=’.$json);
//ここまでイベントデータの取得
$payjp_token = $_SERVER[‘HTTP_X_PAYJP_WEBHOOK_TOKEN’];
//上記でリクエストヘッダーからトークンを取得
 //トークン確認の有無で条件分岐
if($payjp_token == ‘whook_aabbcc11223344’){
error_log(‘payjp_webhook is Approval’);
}else{
error_log(‘payjp_webhook is not Approval’);
}
}
これで特定のpay.jpアカウントからのwebhookである事が確認出来ます。
あとはこれを元にwp側で処理する内容を設定していきましょう。