# ক্লাস নং-২০(পার্ট-১৮) payment gateway stripe, and their services

আজকের ক্লাসে মূলত আমাদের payment gateway stripe নিয়ে আলোচনা হবে গতক্লাসে এটা নিয়ে কথা হয়েছে কিন্তু আমরা আমাদের invoice করে এবং payment gateway and theiir services নিয়ে প্রাথমিক আলোচনা করেছিলাম আজকে আমরা সেটা কে ভাল ভাবে জানব এবং ব্যাবহার করব।

তো প্রথমেই আমরা আমাদের project এ stripe install করে নেই।

```bash
composer require stripe/stripe-php
```

এরপর আমরা আমাদের show.blade.php file এ একটা ফর্ম নিয়ে সেখানে payment এর অপশন তৈরি করি।

```bash
<form method="post" action="{{route('stripe-payment')}}"> @csrf
                        <div class="flex mb-4">
                            <div class="w-full">
                                <input value="4242424242424242" name="card_no" type="number" class="lms-input" placeholder="Card number">
                            </div>
                            <div class="min-w-max ml-4">
                                <input value="12/30" name="card_expiry_date" type="text" class="lms-input" placeholder="Expiry month/year">
                            </div>
                            <div class="min-w-max ml-4">
                                <input value="232" name="card_ccv" type="text" class="lms-input" placeholder="CCV">
                            </div>
                            <div class="min-w-max ml-4">
                                <input name="amount" type="number" class="lms-input" value="{{number_format($invoice->amount()['due'], 2)}}" placeholder="Amount">
                            </div>
                            <input type="hidden" name="invoice_id" value="{{$invoice->id}}">
                        </div>
                        <button type="submit" class="lms-btn">Pay Now</button>
 </form>
```

এবার আমাদের একটা controller make করা লাগবে যেখানে আমাদের payment এর কাজ গুলো করব।

```bash
php artisan make:controller StripePaymentController
```

এবার আমাদের একটা post রাউট তৈরি করা লাগবে।

```bash
Route::post('/stripe-payment', [StripePaymentController::class, 'stripePayment'])->name('stripe-payment');
```

এবার আমাদের controller এর মধ্যে গিয়ে সেখানে আমাদের প্রয়োজনীয় কোড গুলো লিখি।

```bash
public function stripePayment(Request $request) {

        $validator = Validator::make($request->all(), [
            'card_no' => 'required',
            'card_expiry_date' => 'required',
            'card_ccv' => 'required',
            'amount' => 'required',
            'invoice_id' => 'required|integer',
        ]);

        // validator fails
        if($validator->fails()) {
            flash()->addWarning('Please fill all the fields');
        } else {
            $stripe = new StripeClient(env('STRIPE_SECRET'));

            // try catch stripe token
            try {
                $token = $stripe->tokens->create([
                    'card' => [
                        'number' => $request->card_no,
                        'exp_month' => explode('/', $request->card_expiry_date)[0],
                        'exp_year' => explode('/', $request->card_expiry_date)[1],
                        'cvc' => $request->card_ccv,
                    ],
                ]);
            } catch (\Exception $e) {
                flash()->addWarning('Invalid card details');
                return redirect()->back();
            }

            // dd('test');

            $charge = $stripe->charges->create([
                'amount' => intval($request->amount * 100),
                'currency' => 'usd',
                'description' => 'Payment for invoice #' . $request->invoice_id,
                'source' => $token->id,
            ]);

            // dd($charge);
            Payment::create([
                'amount' => $request->amount,
                'invoice_id' => $request->invoice_id,
                'transaction_id' => $charge->id,
            ]);

            flash()->addSuccess('Payment successful');
        }
        return redirect()->back();
    }
```

এবং আমাদের stripe website এ গিয়ে একটা accaount make করতে হবে।এবং developer option mood on করলে সেখানে একটা secret key পাওয়া যাবে সেটা কপি করে নিয়ে env file এর নিচে paste করতে হবে' STRIPE\_SECRET=sk\_test\_51MQaveCXCmINpP8TXp2F6DW8N7lLqwLCxGxti7kA80QdT00zmLkc3Cf(এমন একটা কোড তবে এটা দিয়েন না কাজ করবে না ।)

এবং আমাদের invoice-edit.blade.php file এ গিয়ে আমরা নিচের কোড গুলো দিতে পারি,।

```bash
<div>
    <h2 class="font-bold text-green-700  ">Information</h2>
    <p>Invoice to: {{$invoice->user->name}}</p>

    <table class="table-auto w-full mb-4">
        <tr>
            <th class="lms-cell-border text-left">Name</th>
            <th class="lms-cell-border">Price</th>
            <th class="lms-cell-border">Quantity</th>
            <th class="lms-cell-border text-right">Total</th>
        </tr>

        @foreach($invoice->items as $item)
        <tr>
            <td class="lms-cell-border">{{$item->name}}</td>
            <td class="lms-cell-border text-center">${{number_format($item->price, 2)}}</td>
            <td class="lms-cell-border text-center">{{$item->quantity}}</td>
            <td class="lms-cell-border text-right">${{number_format($item->price * $item->quantity, 2)}}</td>
        </tr>
        @endforeach
        <tr>
            <td colspan="3" class="lms-cell-border text-right">Subtotal</td>
            <td class="lms-cell-border text-right">${{number_format($invoice->amount()['total'], 2)}}</td>
        </tr>
        <tr>
            <td colspan="3" class="lms-cell-border text-right">Paid</td>
            <td class="lms-cell-border text-right">- ${{number_format($invoice->amount()['paid'], 2)}}</td>
        </tr>
        <tr>
            <td colspan="3" class="lms-cell-border text-right">Due</td>
            <td class="lms-cell-border text-right">${{number_format($invoice->amount()['due'], 2)}}</td>
        </tr>
    </table>




    @if($enableAddItem)
    <form class="mb-4" wire:submit.prevent="saveNewItem">
        <div class="flex mb-4">
            <div class="w-full">
                @include('components.form-field', [
                    'name' => 'name',
                    'label' => 'Name',
                    'type' => 'text',
                    'placeholder' => 'Item name',
                    'required' => 'required',
                ])
            </div>

            <div class="min-w-max ml-4">
                @include('components.form-field', [
                    'name' => 'price',
                    'label' => 'Price',
                    'type' => 'number',
                    'placeholder' => 'Type price',
                    'required' => 'required',
                ])
            </div>

            <div class="min-w-max ml-4">
                @include('components.form-field', [
                    'name' => 'quantity',
                    'label' => 'Quantity',
                    'type' => 'number',
                    'placeholder' => 'Type quantity',
                    'required' => 'required',
                ])
            </div>


        </div>
        <div class="flex mb-4">
            @include('components.wire-loading-btn')
            <button class=" bg-red-500 ml-4 py-2 px-4 font-bold text-white " wire:click="addNewItem" type="button">Cancel</button>
        </div>
    </form>
    @else
        <button class="px-4 py-2 bg-green-300 mt-4 mb-4" wire:click="addNewItem" class="underline">Add New Item</button>
    @endif


    <h3 class="font-bold text-lg mb-2">Payments</h3>
    <ul class="mb-4">
        @foreach($invoice->payments as $payment)
        <li>{{date('F j, Y - g:i:a', strtotime($payment->created_at))}} - ${{number_format($payment->amount, 2)}} - transaction ID: {{$payment->transaction_id}} <button wire:click="refund({{$payment->id}})" class="bg-red-500 text-white px-4 py-1 mb-2 text-xs">Refund</button></li>
        @endforeach
    </ul>
</div>
```

এবার আমরা আমাদের website এ গিয়ে invoiceedit এ গিয়ে test করতে পারি।

<iframe width="560" height="315" src="https://www.youtube.com/embed/OzcFQ2gOThw"></iframe>

discord link: [**discord.gg/9qWUUbQ3**](http://discord.gg/9qWUUbQ3)

facebook group :[**web.facebook.com/groups/1661735757554627**](http://web.facebook.com/groups/1661735757554627)

Happy Learning

***Rakibul Islam***
