wip: stripe implementation

- add model, dto
This commit is contained in:
kusowl 2026-03-20 19:03:33 +05:30
parent 783ae6925b
commit 0799965212
10 changed files with 145 additions and 1 deletions

View File

@ -65,3 +65,6 @@ AWS_USE_PATH_STYLE_ENDPOINT=false
VITE_APP_NAME="${APP_NAME}" VITE_APP_NAME="${APP_NAME}"
FRONTEND_URL=http://localhost:4200 FRONTEND_URL=http://localhost:4200
SANCTUM_STATEFUL_DOMAINS=localhost:4200 SANCTUM_STATEFUL_DOMAINS=localhost:4200
STRIPE_SECRET_KEY=sk_test_51TCvFrJG0RVtUg4VTqHZC2szosam9Mf0Nq0Sh71tdIKdld5DnOUhUl4VvFBZVRWPM9G5hLPNVmH8YNXqm2R6fR5U00fsEsLb1d
STRIPE_WEBHOOK_KEY=

View File

@ -5,7 +5,7 @@
use App\Contracts\OutputDataTransferObject; use App\Contracts\OutputDataTransferObject;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
final readonly class OrderResponeDTO implements OutputDataTransferObject final readonly class OrderCreatedResponseDTO implements OutputDataTransferObject
{ {
public function __construct( public function __construct(
// TODO: Define your properties here // TODO: Define your properties here

View File

@ -0,0 +1,35 @@
<?php
namespace App\Data;
use App\Contracts\OutputDataTransferObject;
use App\Enums\StripeCurrency;
final readonly class StripeLineItemDTO implements OutputDataTransferObject
{
public function __construct(
public StripeCurrency $currency,
public int $price,
public string $productName,
public string $productDescription,
public int $quantity
) {}
/**
* @return array<string, int|string>
*/
public function toArray(): array
{
return [
'price_data' => [
'currency' => $this->currency->value,
'unit_amount' => $this->price,
'product_data' => [
'name' => $this->productName,
'description' => $this->productDescription,
],
],
'quantity' => $this->quantity,
];
}
}

View File

@ -0,0 +1,32 @@
<?php
namespace App\Data;
use App\Contracts\OutputDataTransferObject;
use App\Enums\StripePaymentMode;
final readonly class StripeSessionDataDTO implements OutputDataTransferObject
{
/**
* @param StripeLineItemDTO[] $lineItems
*/
public function __construct(
public array $lineItems,
public StripePaymentMode $mode,
public string $successUrl,
public string $cancelUrl
) {}
/**
* @return array<string, mixed>
*/
public function toArray(): array
{
return [
'line_items' => array_map(fn (StripeLineItemDTO $dto) => $dto->toArray(), $this->lineItems),
'mode' => $this->mode->value,
'success_url' => $this->successUrl,
'cancel_url' => $this->cancelUrl,
];
}
}

View File

@ -0,0 +1,9 @@
<?php
namespace App\Enums;
enum StripeCurrency: string
{
case INR = 'inr';
case USD = 'usd';
}

View File

@ -0,0 +1,8 @@
<?php
namespace App\Enums;
enum StripePaymentMode: string
{
case Payment = 'payment';
}

View File

@ -25,4 +25,9 @@ public function cart(): HasOne
{ {
return $this->hasOne(Cart::class); return $this->hasOne(Cart::class);
} }
public function stripeSession(): HasOne
{
return $this->hasOne(StripeSession::class);
}
} }

View File

@ -0,0 +1,16 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasOne;
class StripeSession extends Model
{
public $fillable = ['session_id', 'order_id'];
public function order(): HasOne
{
return $this->hasOne(Order::class);
}
}

View File

@ -35,4 +35,8 @@
], ],
], ],
'stripe' => [
'secret' => env('STRIPE_SECRET_KEY'),
'webhook' => env('STRIPE_WEBHOOK_KEY'),
],
]; ];

View File

@ -0,0 +1,32 @@
<?php
use App\Models\Order;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('stripe_sessions', function (Blueprint $table) {
$table->id();
$table->string('session_id');
$table->foreignIdFor(Order::class)
->constrained()
->cascadeOnDelete();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('stripe_sessions');
}
};