この記事は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」ページの
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’);
}}