LaravelとStripe連携で、カード情報の不備によるエラー、API関連のエラー、一般的なエラーなど、各種決済エラーをハンドリングする方法を解説します。
Stripeの公式マニュアルには、次の7種類のエラーをハンドリングする方法が掲載されています。
- カード情報不備などで支払いを拒否された
- APIへのリクエストが早く、多すぎる
- パラメータが無効
- STRIPE APIの認証に失敗(最近APIキーを変更した場合など)
- Stripeとのネットワークコミュニケーションに失敗
- 一般的なエラー
- Stripeと関係のないエラー
まさに、ありとあらゆるエラーを想定した感じですよね。
じゅんこ
自分でこんなに色々なエラーを想定できません…
せっかくなので、このStripe公式マニュアルにある方法を参考にさせてもらいましょう♪
LaravelとStripe連携:7種類の決済エラーをハンドリングできるコントローラーの書き方
支払い実行後のメソッドに、次のようにいれていきます。
【コントローラー支払い実行後のメソッド】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
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】
1 2 3 |
@if(session('message')) <div class="alert alert-success">{{session('message')}}</div> @endif |
Stripeのエラーをハンドリングできるかテストしてみる
コードを記述したら、実際にエラーがちゃんとハンドリングされるか、テストしてみてくださいね。
Stripeでは、エラーがでるダミーカード番号も準備してくれています。
たとえば「4000 0000 0000 0069」は、有効期限が切れたカード番号。
シナリオの 「①カード情報不備などで支払いを拒否される」エラーに該当します。
決済処理後に、エラーに応じたメッセージが表示されるか、チェックしてみてください。
なお、Stripeのダミーカード番号は下記の記事にまとめています。
じゅんこ
LaravelとStripe連携方法は色々と紹介しているので、参考にしてください。