LaravelとStripe連携で、カード情報の不備によるエラー、API関連のエラー、一般的なエラーなど、各種決済エラーをハンドリングする方法を解説します。
Stripeの公式マニュアルには、次の7種類のエラーをハンドリングする方法が掲載されています。
- カード情報不備などで支払いを拒否された
- APIへのリクエストが早く、多すぎる
- パラメータが無効
- STRIPE APIの認証に失敗(最近APIキーを変更した場合など)
- Stripeとのネットワークコミュニケーションに失敗
- 一般的なエラー
- Stripeと関係のないエラー
まさに、ありとあらゆるエラーを想定した感じですよね。

じゅんこ
自分でこんなに色々なエラーを想定できません…
せっかくなので、このStripe公式マニュアルにある方法を参考にさせてもらいましょう♪
LaravelとStripe連携:7種類の決済エラーをハンドリングできるコントローラーの書き方
支払い実行後のメソッドに、次のようにいれていきます。
【コントローラー支払い実行後のメソッド】
public function charge(Request $request) {
try {
// 成功時の処理をいれる
$result = 1;
// ここから失敗時
// ①カード情報不備などで支払いを拒否された
} catch(\Stripe\Exception\CardException $e) {
$result = 2;
$error = $e->getError()->message;
// ②APIへのリクエストが早く、多すぎる
} catch (\Stripe\Exception\RateLimitException $e) {
$result = 3;
$error = $e->getError()->message;
// ③パラメータが無効
} catch (\Stripe\Exception\InvalidRequestException $e) {
$result = 4;
$error = $e->getError()->message;
// ④STRIPE APIの認証に失敗(最近APIキーを変更した場合など)
} catch (\Stripe\Exception\AuthenticationException $e) {
$result = 5;
$error = $e->getError()->message;
// ⑤Stripeとのネットワークコミュニケーションに失敗
} catch (\Stripe\Exception\ApiConnectionException $e) {
$result = 6;
$error = $e->getError()->message;
// ⑥一般的なエラー
} catch (\Stripe\Exception\ApiErrorException $e) {
$result = 7;
$error = $e->getError()->message;
// ⑦Stripeと関係のないエラー
} catch (Exception $e) {
$result = 8;
$error = $e->getError()->message;
}
// 結果によって、ユーザーへのメッセージを変える
if ($result==1) {
return redirect()->route('home')->with('message', 'お支払いありがとうございました');
}elseif($result==2) {
return redirect()->route('home')->with('message', '入力いただいたカードでは、お支払いができませんでした。再度お試しいただくか、または他のカードでお試しください。');
}elseif($result==3) {
return redirect()->route('home')->with('message', 'APIエラーです。');
}elseif($result==4) {
return redirect()->route('home')->with('message', 'パラメータが無効です。');
}elseif($result==5) {
return redirect()->route('home')->with('message', '認証に失敗しました。');
}elseif($result==6) {
return redirect()->route('home')->with('message', '通信エラーです。');
}elseif($result==7) {
return redirect()->route('home')->with('message', 'エラーが起こりました。');
}elseif($result==8) {
return redirect()->route('home')->with('message', 'エラーが起こりました。');
}
}
成功した時は $resultに1を代入します。
エラーの時は、$resultに2以降の番号を割り振っていきます。
ユーザーは決済処理後に’home’にリダイレクトします。
このとき、$resultが何番であるかによって、ユーザー側に表示するメッセージを変えています。
リダイレクト先のhome.blade.phpファイルに、コントローラーからのメッセージが表示されるよう、次のコードを加えて起きます。
【home.blade.php】
@if(session('message'))
<div class="alert alert-success">{{session('message')}}</div>
@endif
Stripeのエラーをハンドリングできるかテストしてみる
コードを記述したら、実際にエラーがちゃんとハンドリングされるか、テストしてみてくださいね。
Stripeでは、エラーがでるダミーカード番号も準備してくれています。
たとえば「4000 0000 0000 0069」は、有効期限が切れたカード番号。
シナリオの 「①カード情報不備などで支払いを拒否される」エラーに該当します。

決済処理後に、エラーに応じたメッセージが表示されるか、チェックしてみてください。
なお、Stripeのダミーカード番号は下記の記事にまとめています。

じゅんこ
LaravelとStripe連携方法は色々と紹介しているので、参考にしてください。




コメント