サブスクリプション対応決済サービス Stripe と Laravel からサブスクリプションを操作する Laravel Cashier についてのメモ書き

Laravel Cashier で Stripe Web Hook を使用する

● 設定ファイルの作成

1. .env に キーを指定

Stripe管理画面 > 開発者 > Webhook
に表示されるキーを .env に記述します。

STRIPE_WEBHOOK_SECRET=whsec_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

2. config/service.php に .env の値を読み込むよう設定

    'stripe' => [
        'model' => App\User::class,
        'key' => env('STRIPE_PUBLIC_KEY'),
        'secret' => env('STRIPE_SECRET_KEY'),
        'webhook' => [
            'secret' => env('STRIPE_WEBHOOK_SECRET'),
            'tolerance' => env('STRIPE_WEBHOOK_TOLERANCE', 300),
        ],
    ],

● ルートの作成

routes/web.php

Route::get('stripe/webhook/test', 'WebhookController@test');
Route::post('stripe/webhook', 'WebhookController@handleWebhook');
test() :      テスト用メソッド
handleWebhook() : Stripeからのhookをこのメソッドで受け取ります

● コントローラーの作成

app/Http/Controllers/WebhookController.php

メソッド名の命名は決まっています。

メソッド名はCashierが期待する命名規則に沿う必要があります。特にメソッドはhandleのプレフィックスで始まり、処理したいStripeのWebフックの名前を「キャメルケース」にします。
invoice.payment_succeeded → handleInvoicePaymentSucceeded
invoice.payment_failed → handleInvoicePaymentFailed

<?php namespace App\Http\Controllers; use Laravel\Cashier\Http\Controllers\WebhookController as CashierController; class WebhookController extends CashierController {

use MailTrait;

/**
 * メール送信のテスト
 *
 */
public function test()
{
    $this->mailtoAdmin( 'TEST MAILの本文です' );
}

/**
 * インボイス支払い成功時の処理
 *
 * @param  array  $payload
 * @return void
 *
 */
public function handleInvoicePaymentSucceeded( $payload )
{
    $info = print_r($payload, TRUE);
    $this->mailtoAdmin($info);
}

}

mailtoAdmin() メソッドは適宜作成してください。

# ● webhookのテスト

##1. *.env の webhookキーを一時的にコメントアウト

STRIPE_WEBHOOK_SECRET=whsec_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx をコメントアウトする


##2. https://YOUR-SERVER.TLD/stripe/webhook/test にアクセスして、メール送信が正常動作することを確認する

正常に動作することを確認できたら、コメントアウトを戻す。(戻すと先ほどの test メソッドは forbidden となります。)

##3. Stripe 管理画面から webhook を追加する

Stripe管理画面に追加する設定情報は以下の例のように設定します
イベントタイプは複数設定できます。

URL : https://YOUR-SERVER.TLD/stripe/webhook イベントタイプ : invoice.payment_failed invoice.payment_succeeded

( invoice.payment_succeeded : 決済成功時のHook)
とします。


No.1499
05/07 11:38

edit