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連携方法は色々と紹介しているので、参考にしてください。
  
  
  
  


