StripeApiを使った支払い機能の追加

# 今回は、Laravelを使ってStripeの決済機能を実装する方法を記載します
決済のApiを作成したいため、フロントは実装しません。
私の状況としまして未エンジニアであり色々なapiを作成し学習しています。

# こちらの記事を参考にしました
https://wakka-inc.com/blog/1306/

# 今回実施する環境
バージョン: PHP 8.2.9
エディター: vsCode
後ほど、composer require stripe/stripe-php のインストールを行います

# 1.Stripeアカウントの作成とAPIキーの取得
こちらのstripeにてサインインしアカウントを作成します
https://stripe.com/ja-us

アカウント作成後、ダッシュボードの方で画面上部にある開発者をクリック->Apiキーをクリックします

![スクリーンショット 2024-11-10 15.36.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931703/0e64b6d7-eade-173a-ec51-87e1e48747c2.png)

するとこのような画面が表示されます
![スクリーンショット 2024-11-10 15.55.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931703/775a6107-cd4e-b89b-3b08-f25193c68962.png)

# 2.laravel Cashierをインストールします
ターミナルで以下のコマンドを入力してください
composer require laravel/cashier 

# 3 .envファイルにApiキーを貼り付けます。

```php:.env
STRIPE_KEY=公開可能キートークン
STRIPE_SECRET=シークレットキートークン
```
STRIPE_KEY=とSTRIPE_SECRET=は.envにデフォルトではないため下の方に作成しそれぞれのトークンをコピーし貼り付けます。

# 4 支払い処理を行うコントローラーを作成します
コントローラー作成
php artisan make:controller StripePaymentsController

```php:Controllers/StripePaymentsController
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Stripe\Stripe;
use Stripe\Customer;
use Stripe\Charge;
use Exception;

class StripePaymentsController extends Controller
{
    public function payment(Request $request)
    {
        try {
            Stripe::setApiKey(env('STRIPE_SECRET'));

           //Stripe\Customerのインスタンス
            $customer = Customer::create([
                'email' => $request->stripeEmail,   // 顧客のメールアドレス
                'source' => $request->stripeToken  // 顧客の支払いに使用するカードのトークン
            ]);

            if (!$customer) {
                return response()->json([
                    'status' => 'error',
                    'message' => 'Failed to create customer'
                ]);
            }

           //Stripe\Chargeのインスタンス
            $charge = Charge::create([
                'customer' => $customer->id, //顧客のid
                'amount' => $request->amount,//購入金額
                'currency' => 'jpy'
            ]);

            return response()->json([
                'status' => 'success',
                'message' => 'Payment processed successfully',
                'charge_id' => $charge->id
            ]);

        } catch (Exception $e) {
            return response()->json([
                'status' => 'error',
                'message' => 'Payment failed',
                'error' => $e->getMessage()
            ]);
        }
    }
}
```


# 5 ルートの設定
apiが叩かれるとStripePaymentsControllerを呼び出せるようにします。


```php:api.php
Route::post('/payment', [StripePaymentsController::class, 'payment']);
```




# 6 テストを行います。
postmanを使用します。
リクエストをこのように設定します。
stripeTokenにはクレジットのトークンとして"tok_visa"を指定します。
![スクリーンショット 2024-11-10 16.29.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931703/c95543e4-b088-48b9-66a8-cfb9cee0c742.png)

レスポンスがこのようになります![スクリーンショット 2024-11-10 16.30.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931703/3fcfa282-67b8-d8be-7bb8-cc9e8c52a8c0.png)

successというメッセージが返ってきたため、支払いが完了しました。

# 7 stripeの方でダッシュボードを確認します。
左側タブにある残高をクリックし全てのアクティビティーを見てみると
先ほどの支払い金額とcharge_idが表示されてます。
![スクリーンショット 2024-11-10 16.39.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931703/d817481f-50a1-c90a-5ca4-561925a8aae1.png)

以上になります。

# 8 感想
まだテストコードに対しての知識が浅いため今回はpostmanを使用したテストを行いました。
未エンジニアですが、実際の現場を想定しapiを実装し学習しております。
学習内容が難しくなってきたためアウトプットも兼ねて投稿していきたいと思います。