Table of contents
No headings in the article.
আজকের ক্লাসে মূলত আমাদের payment gateway stripe নিয়ে আলোচনা হবে গতক্লাসে এটা নিয়ে কথা হয়েছে কিন্তু আমরা আমাদের invoice করে এবং payment gateway and theiir services নিয়ে প্রাথমিক আলোচনা করেছিলাম আজকে আমরা সেটা কে ভাল ভাবে জানব এবং ব্যাবহার করব।
তো প্রথমেই আমরা আমাদের project এ stripe install করে নেই।
composer require stripe/stripe-php
এরপর আমরা আমাদের show.blade.php file এ একটা ফর্ম নিয়ে সেখানে payment এর অপশন তৈরি করি।
<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 এর কাজ গুলো করব।
php artisan make:controller StripePaymentController
এবার আমাদের একটা post রাউট তৈরি করা লাগবে।
Route::post('/stripe-payment', [StripePaymentController::class, 'stripePayment'])->name('stripe-payment');
এবার আমাদের controller এর মধ্যে গিয়ে সেখানে আমাদের প্রয়োজনীয় কোড গুলো লিখি।
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 এ গিয়ে আমরা নিচের কোড গুলো দিতে পারি,।
<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 করতে পারি।
discord link: discord.gg/9qWUUbQ3
facebook group :web.facebook.com/groups/1661735757554627
Happy Learning
Rakibul Islam