{{-- ═══════════════════════════════ SIDEBAR ═══════════════════════════════ --}} {{-- ═══════════════════════════════ MAIN CONTENT ═══════════════════════════════ --}}
{{-- Top Bar --}}

license-receiver.php — ডকুমেন্টেশন

v2.0 Stable
{{-- ══════════════════════════════════════ 1. OVERVIEW ══════════════════════════════════════ --}}

license-receiver.php হলো একটি standalone PHP script যা ক্লায়েন্টের website-এর root folder-এ রাখতে হয়। License server (master site) যখন কাউকে license দেয়, তখন সে এই script-এ একটি POST request পাঠায়। Script-টি সেই request verify করে এবং ক্লায়েন্টের .env ফাইলে LICENSE_KEY ও LICENSE_SIGNATURE স্বয়ংক্রিয়ভাবে সেট করে দেয়।

কারা ব্যবহার করবেন

যারা {{ $gs->title ?? 'Creative Design' }}-এর script/software কিনেছেন এবং নিজের domain-এ চালাচ্ছেন।

কোথায় রাখবেন

আপনার website-এর root folder-এ (যেখানে .env ফাইল আছে তার পাশে)।

{{-- ══════════════════════════════════════ 2. HOW IT WORKS ══════════════════════════════════════ --}}
👤 ক্লায়েন্ট পেমেন্ট করে
↓
💳 UddoktaPay Payment Gateway
↓
⚙️ License Server ({{ $serverUrl }})
License Key + Signature Key তৈরি করে DB-তে save করে ↓
📤 HTTP POST → https://clientdomain.com/license-receiver.php
payload: license_key, signature_key, expiry_date, push_token ↓
✅ license-receiver.php push_token verify করে
↓
📝 .env ফাইলে LICENSE_KEY ও LICENSE_SIGNATURE লেখে
↓
🔄 OPcache + Bootstrap Cache Clear
↓
🎉 সাইট licensed ও সচল!
License server প্রথমে HTTPS দিয়ে চেষ্টা করে। HTTPS fail হলে HTTP দিয়ে আবার চেষ্টা করে। উভয় ব্যর্থ হলে admin panel-এ manual push করা যায়।
{{-- ══════════════════════════════════════ 3. INSTALLATION ══════════════════════════════════════ --}}
1

Script ডাউনলোড করুন

Admin Panel → License → "Download Receiver Script" বাটনে ক্লিক করুন। অথবা সরাসরি এই লিংক থেকে:

URL
{{ $serverUrl }}/admin/licenses/download-receiver
2

সঠিক folder-এ upload করুন

ফাইলটি আপনার website-এর public root-এ রাখুন — যেখানে .env আছে তার পাশে নয়, বরং public_html/ বা public/ folder-এ।

Directory Structure
# cPanel / Shared Hosting
public_html/
├── license-receiver.php   ← এখানে রাখুন
├── index.php
├── .htaccess
└── ..

# Laravel (public folder)
your-project/
├── public/
│   ├── license-receiver.php   ← এখানে রাখুন
│   └── index.php
├── .env                   ← এটি auto-update হবে
└── ..
3

File permission চেক করুন

.env ফাইলটি writable হতে হবে। cPanel File Manager দিয়ে .env ফাইলের permission 644 বা 664 দিন।

Terminal
chmod 644 .env
4

Browser-এ Test করুন

Browser-এ https://yourdomain.com/license-receiver.php ওপেন করুন। নিচের response আসলে installation সফল:

Expected Response (GET Request)
{"status":"error","message":"Method not allowed."}
"Method not allowed" দেখালে বুঝবেন file সঠিকভাবে কাজ করছে — এটা GET request reject করছে, যা expected।
5

Admin Panel থেকে Push করুন

Admin Panel → License List → আপনার domain খুঁজুন → "Push to Site" বাটনে ক্লিক করুন। ✅ Push সফল দেখালে সব ঠিক আছে।

{{-- ══════════════════════════════════════ 4. CONFIG — HMAC SALT ══════════════════════════════════════ --}}
Admin Panel থেকে Download করা script-এ HMAC_SALT স্বয়ংক্রিয়ভাবে সেট থাকে। কিন্তু manually file copy করলে নিচের salt মিলিয়ে নিন।
License Server-এর Current HMAC_SALT
⚠️ গোপন রাখুন
PHP — license-receiver.php এ রাখুন
define('HMAC_SALT', '{{ $hmacSalt }}');
HMAC_SALT কখনো publicly share করবেন না। এটি দিয়ে push token তৈরি হয় — এটা ফাঁস হলে যে কেউ আপনার .env overwrite করতে পারবে।
{{-- ══════════════════════════════════════ 5. ENV PATH LOGIC ══════════════════════════════════════ --}}

Script-টি নিচের ক্রমে .env ফাইল খোঁজে। প্রথম যেটা readable ও writable পাবে সেটাই ব্যবহার করবে:

# Path কখন কাজ করে
1 dirname(__DIR__)/.env script public/-এ আছে, Laravel root-এ .env — সবচেয়ে সাধারণ
2 dirname(dirname(__DIR__))/.env script দুই স্তর ভেতরে থাকলে (subdirectory)
3 __DIR__/../.env same-folder fallback
কোনো path-এ .env না পেলে script 500 error return করে এবং কিছু লেখে না। এতে আপনার server নিরাপদ থাকে।
{{-- ══════════════════════════════════════ 6. SECURITY — TOKEN VERIFICATION ══════════════════════════════════════ --}}

Push Token কীভাবে তৈরি হয়

PHP — License Server (LicenseService.php)
// Server-side token generation
$domain    = 'example.com';   // www ছাড়া, lowercase
$licenseKey = 'LIC-ABCD-EFGH-IJKL';
$HMAC_SALT = '{{ $hmacSalt }}';

$pushToken = hash_hmac('sha256', $domain . '|' . $licenseKey, $HMAC_SALT);

Receiver Script-এ Verification

PHP — license-receiver.php
// Client site HTTP_HOST থেকে domain বের করা
$domain = strtolower(preg_replace('#^www\.#i', '', $_SERVER['HTTP_HOST']));

// Expected token compute
$expectedToken = hash_hmac('sha256', $domain . '|' . $licenseKey, HMAC_SALT);

// Timing-safe comparison
if (!hash_equals($expectedToken, $pushToken)) {
    http_response_code(403);
    echo json_encode(['status' => 'error', 'message' => 'Invalid token.']);
    exit;
}
hash_equals() ব্যবহার করা হয় timing attack প্রতিরোধ করতে। সাধারণ === comparison-এ timing side-channel attack সম্ভব।
{{-- ══════════════════════════════════════ 7. HTTP RESPONSES ══════════════════════════════════════ --}}
HTTP Code status কারণ
200 OK ok লাইসেন্স সফলভাবে .env-এ সেইভ হয়েছে
400 Bad Request error license_key বা push_token missing
403 Forbidden error Push token invalid — HMAC mismatch
405 Method Not Allowed error GET request এসেছে, শুধু POST accept হয়
500 Server Error error .env file পাওয়া যায়নি বা writable নয়

Success Response Example

JSON Response — 200 OK
{
    "status":  "ok",
    "message": "License saved successfully.",
    "domain":  "example.com"
}
{{-- ══════════════════════════════════════ 8. PAYLOAD FIELDS ══════════════════════════════════════ --}}
Field Type Required বিবরণ
license_key string Required Generated license key — e.g. LIC-ABCD-EFGH-IJKL
signature_key string Required HMAC-SHA256 signature of licenseKey|domain
push_token string Required Security token — HMAC of domain|licenseKey
expiry_date string Optional YYYY-MM-DD অথবা lifetime (মেয়াদহীন)

.env-এ যা লেখা হয়

.env
# License Server থেকে auto-set হয়
LICENSE_KEY=LIC-ABCD-EFGH-IJKL
LICENSE_SIGNATURE=a3f9b2c1d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1
LICENSE_EXPIRY=lifetime   # লাইফটাইম হলে এটি লেখা হয় না
{{-- ══════════════════════════════════════ 9. TROUBLESHOOTING ══════════════════════════════════════ --}}

Push fail: cURL error 6: Could not resolve host

Domain-টি License server থেকে accessible নয় — DNS propagate হয়নি, বা domain live নয়। কিছুক্ষণ পর Admin Panel থেকে manual push করুন।

Push fail: http_status: 404

license-receiver.php ফাইলটি সঠিক জায়গায় নেই বা upload হয়নি। https://yourdomain.com/license-receiver.php browser-এ ওপেন করে দেখুন।

403 Forbidden: Invalid token

HMAC_SALT mismatch। Admin Panel থেকে script re-download করুন — downloaded script-এ HMAC_SALT স্বয়ংক্রিয়ভাবে সেট থাকে।

500: .env not found or not writable

Script .env খুঁজে পাচ্ছে না বা write permission নেই।
① File Manager-এ .env এর permission 644 করুন।
② license-receiver.php সঠিক directory-তে আছে কিনা দেখুন।

Push সফল হলো কিন্তু site এখনো কাজ করছে না

PHP OPcache এবং Laravel config cache clear না হওয়ার কারণ হতে পারে। Terminal-এ php artisan config:clear চালান, অথবা hosting control panel থেকে PHP cache clear করুন।

{{-- ══════════════════════════════════════ 10. FAQ ══════════════════════════════════════ --}}
license-receiver.php কি সবসময় server-এ থাকতে হবে?

License সফলভাবে push হওয়ার পরে এটি রেখে দেওয়া ভালো — ভবিষ্যতে renewal বা re-push-এ কাজে লাগে। তবে security-সচেতনরা push সম্পন্ন হলে delete বা rename করতে পারেন।

যদি domain www সহ হয়?

Script স্বয়ংক্রিয়ভাবে www. prefix সরিয়ে নেয়। License server-ও same normalization করে। তাই www.example.com ও example.com দুটোই কাজ করবে।

Lifetime license হলে LICENSE_EXPIRY লেখা হয়?

না। Lifetime license-এর ক্ষেত্রে expiry_date field null বা lifetime আসে — সেক্ষেত্রে LICENSE_EXPIRY .env-এ লেখা হয় না।

Push fail হলে কি license হারিয়ে যাবে?

না। License সবসময় License Server-এর database-এ সেইভ থাকে। Admin Panel → License List থেকে যেকোনো সময় manually push করা যায়।

Localhost বা local development-এ push কাজ করে না কেন?

License server ({{ $serverUrl }}) publicly accessible একটি server থেকে run করে। সে localhost resolve করতে পারে না। Local development-এ Admin Panel থেকে site_path দিয়ে লাইসেন্স তৈরি করুন (direct .env write)।

License Receiver Docs — {{ $gs->title ?? 'Creative Design' }} © {{ date('Y') }}  |  License System Docs →