Files
intaleq_v2/app/Http/Controllers/Api/PaymentTokenController.php

64 lines
2.1 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Firebase\JWT\JWT;
use Illuminate\Support\Facades\File;
class PaymentTokenController extends Controller
{
// 1. مسار الراكب
public function generatePassengerToken(Request $request)
{
$userId = $request->attributes->get('_jwt_user_id');
// تحقق خاص بالراكب (لا يوجد بصمة سيارة مثلاً)
return $this->buildToken($userId, 'android/ios_passenger', $request->input('fingerPrint'));
}
// 2. مسار السائق
public function generateDriverToken(Request $request)
{
$userId = $request->attributes->get('_jwt_user_id');
// تحقق خاص بالسائق (ضرورة وجود بصمة جهاز قوية)
return $this->buildToken($userId, 'android/ios_driver', $request->input('fingerPrint'));
}
// 3. مسار المدير
public function generateAdminToken(Request $request)
{
$userId = $request->attributes->get('_jwt_user_id');
// المدراء لديهم صلاحيات أوسع، قد يكون الـ aud مختلفاً
return $this->buildToken($userId, 'web_admin', 'admin_secure_context');
}
// 4. دالة البناء المركزية (Private)
private function buildToken($userId, $audience, $fingerprint)
{
$keyPath = env('PAYMENT_INTERNAL_KEY_PATH');
if (!File::exists($keyPath)) {
return response()->json(['status' => 'error', 'message' => 'Security Key Missing'], 500);
}
$internalSecret = trim(File::get($keyPath));
$payload = [
'iss' => 'Intaleq_V2',
'sub' => $userId,
'aud' => $audience,
'iat' => time(),
'exp' => time() + 60,
'fingerprint' => $fingerprint
];
$token = JWT::encode($payload, $internalSecret, 'HS256');
return response()->json([
'status' => 'success',
'token' => $token,
'hmac' => hash_hmac('sha256', $token, $internalSecret)
]);
}
}