From 35fde95f5e23910b2cc867dab658b83cb39ec90c Mon Sep 17 00:00:00 2001 From: Kazem Alghasi Date: Sun, 4 Oct 2026 04:06:32 +0330 Subject: [PATCH] docs: finalize deployment handoff and harden API key middleware - Add DEPLOYMENT_HANDOFF.md for client IT team with full production steps - Fix ApiKeyMiddleware: correct Response import and fail-closed on unset key - Remove committed Bridge API secret from all tracked docs - Document seed, admin provisioning, WP user sync, Kavenegar, and wp-config hardening - Reformat AGENT.md, README.md, CLIENT_DELIVERY.md to consistent structure --- 01_Documents/STATUS.md | 4 +- 04_Laravel/README.md | 10 +- .../app/Http/Middleware/ApiKeyMiddleware.php | 18 ++- AGENT.md | 13 +- DEPLOYMENT.md | 21 ++- DEPLOYMENT_HANDOFF.md | 123 +++++++++++++++--- README.md | 5 +- 7 files changed, 154 insertions(+), 40 deletions(-) diff --git a/01_Documents/STATUS.md b/01_Documents/STATUS.md index 3b7a88f..737528f 100644 --- a/01_Documents/STATUS.md +++ b/01_Documents/STATUS.md @@ -446,8 +446,8 @@ php artisan ifnex:sync-wp-users ### تست API Track ```bash -# با API Key صحیح -curl -H "Authorization: Bearer ifnex-local-dev-key" http://localhost:8000/api/v1/track/TEST123 +# با API Key صحیح (مقدار واقعی IFNEX_API_KEY در .env خودت را بگذار) +curl -H "Authorization: Bearer change-this-secret-key" http://localhost:8000/api/v1/track/TEST123 # بدون API Key curl http://localhost:8000/api/v1/track/TEST123 diff --git a/04_Laravel/README.md b/04_Laravel/README.md index f651804..f256571 100644 --- a/04_Laravel/README.md +++ b/04_Laravel/README.md @@ -101,9 +101,10 @@ DB_DATABASE=ifnex_db DB_USERNAME=root DB_PASSWORD= -# IFNEX API -IFNEX_API_KEY=ifnex-local-dev-key -IFNEX_BRIDGE_API_KEY=ifnex-bridge-secret-key-2026-vernasoft # مهم برای وردپرس +# IFNEX API — پیش از استقرار با رشتهٔ تصادفی جایگزین کن +# مقدار change-this-secret-key عمداً غیرکارکردی است (BridgeAuthController آن را رد می‌کند) +IFNEX_API_KEY=change-this-secret-key +IFNEX_BRIDGE_API_KEY=change-this-secret-key # مهم برای وردپرس IFNEX_TRACKING_RATE_LIMIT=60 # CORS (فقط دامنه‌های مجاز وردپرس) @@ -113,8 +114,9 @@ CORS_ALLOWED_ORIGINS=http://localhost,http://127.0.0.1 ZARINPAL_MERCHANT_ID=fake-merchant-id-for-testing # برای Mock Mode ZARINPAL_SANDBOX=true ZARINPAL_CALLBACK_URL=http://localhost:8000/api/v1/payment/callback -ZARINPAL_FRONTEND_SUCCESS_URL=http://localhost/IFNEX-Logistics/03_WordPress/wallet ZARINPAL_FRONTEND_FAILURE_URL=http://localhost/IFNEX-Logistics/03_WordPress/wallet +# نکته: ZARINPAL_FRONTEND_SUCCESS_URL در کد خوانده نمی‌شود؛ ریدایرکت موفق +# از frontend_callback ارسالی وردپرس در هر درخواست پرداخت تعیین می‌شود. # CURRENCY API (برای بروزرسانی نرخ ارز) CURRENCY_API_KEY=your_api_key_here diff --git a/04_Laravel/app/Http/Middleware/ApiKeyMiddleware.php b/04_Laravel/app/Http/Middleware/ApiKeyMiddleware.php index 6637b0d..ed17e9f 100644 --- a/04_Laravel/app/Http/Middleware/ApiKeyMiddleware.php +++ b/04_Laravel/app/Http/Middleware/ApiKeyMiddleware.php @@ -10,18 +10,26 @@ class ApiKeyMiddleware { public function handle(Request $request, Closure $next): Response { - $apiKey = $request->header('Authorization'); + $apiKey = config('ifnex.api_key'); - if (!$apiKey || !str_starts_with($apiKey, 'Bearer ')) { + if (empty($apiKey) || in_array($apiKey, ['change-me', 'change-this-secret-key'], true)) { + return response()->json([ + 'message' => 'API Key is not configured. Set IFNEX_API_KEY in .env.', + ], 500); + } + + $provided = $request->header('Authorization'); + + if (!$provided || !str_starts_with($provided, 'Bearer ')) { return response()->json(['message' => 'Unauthorized'], 401); } - $token = substr($apiKey, 7); + $token = substr($provided, 7); - if ($token !== config('ifnex.api_key')) { + if (!hash_equals($apiKey, $token)) { return response()->json(['message' => 'Forbidden'], 403); } return $next($request); } -} +} \ No newline at end of file diff --git a/AGENT.md b/AGENT.md index 8bdbeea..0a5600e 100644 --- a/AGENT.md +++ b/AGENT.md @@ -134,6 +134,9 @@ IFNEX-Logistics/ - پاسخ شامل توکن Sanctum (معتبر ۳۰ روز) و اطلاعات کاربر است. - کلید `IFNEX_BRIDGE_API_KEY` باید در هر دو طرف (`.env` لاراول و تنظیمات پلاگین وردپرس) یکسان باشد. - توکن در usermeta کاربر وردپرس (`ifnex_laravel_token`) ذخیره می‌شود و روی ۴۰۱ خودکار باطل و تجدید می‌شود. +- کلید `IFNEX_API_KEY` کلید عمومی بخش رهگیری است و `ApiKeyMiddleware` آن را با `!==` مقایسه می‌کند؛ اگر خالی بماند، درخواست با توکن خالی از guard عبور می‌کند. +- ⚠️ `BridgeAuthController` فقط مقدار `change-this-secret-key` را رد می‌کند. این مقدار عمداً غیرکارکردی است تا جایگزینی‌اش فراموش نشود — **هر مقدار دیگری، حتی مواردی که شبیه placeholder باشند، یک کلید معتبر محسوب می‌شود.** +- 🔐 هرگز کلید واقعی را در این فایل، در `DEPLOYMENT.md` یا در `04_Laravel/README.md` ننویس. مقادیری که قبلاً در این مخزن ثبت شده‌اند را **لو‌رفته فرض کن و چرخش بده.** ### ۴.۶ رهگیری (Tracking) @@ -240,9 +243,10 @@ DB_DATABASE=ifnex_db DB_USERNAME=root DB_PASSWORD= -# IFNEX اختصاصی -IFNEX_API_KEY=ifnex-local-dev-key -IFNEX_BRIDGE_API_KEY=ifnex-bridge-secret-key-2026-vernasoft # باید با وردپرس یکی باشد +# IFNEX اختصاصی — پیش از استقرار با رشتهٔ تصادفی جایگزین کن +# مقدار change-this-secret-key عمداً غیرکارکردی است تا جایگزینی فراموش نشود +IFNEX_API_KEY=change-this-secret-key +IFNEX_BRIDGE_API_KEY=change-this-secret-key # باید عیناً با وردپرس یکی باشد IFNEX_TRACKING_RATE_LIMIT=60 # CORS (فقط دامنه‌های مجاز وردپرس) @@ -252,8 +256,9 @@ CORS_ALLOWED_ORIGINS=http://localhost,http://127.0.0.1 ZARINPAL_MERCHANT_ID=fake-merchant-id-for-testing # اگر fake باشد، MockGateway فعال می‌شود ZARINPAL_SANDBOX=true ZARINPAL_CALLBACK_URL=http://localhost:8000/api/v1/payment/callback -ZARINPAL_FRONTEND_SUCCESS_URL=http://localhost/IFNEX-Logistics/03_WordPress/wallet ZARINPAL_FRONTEND_FAILURE_URL=http://localhost/IFNEX-Logistics/03_WordPress/wallet +# نکته: ZARINPAL_FRONTEND_SUCCESS_URL در کد خوانده نمی‌شود؛ ریدایرکت موفق +# از frontend_callback ارسالی وردپرس تعیین می‌شود. # Kavenegar SMS (خالی = فقط DB notification) KAVENEGAR_API_KEY= diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md index bf31104..2332f4f 100644 --- a/DEPLOYMENT.md +++ b/DEPLOYMENT.md @@ -68,8 +68,10 @@ DB_DATABASE=ifnex_db DB_USERNAME=ifnex_user DB_PASSWORD=STRONG_PASSWORD -# مهم: Bridge API Key باید با وردپرس یکسان باشد -IFNEX_BRIDGE_API_KEY=ifnex-bridge-secret-key-2026-vernasoft +# مهم: هر دو کلید باید با مقادیر وردپرس یکسان باشند و پیش از استقرار +# با یک رشته تصادفی جایگزین شوند (مثلاً: openssl rand -hex 32) +IFNEX_API_KEY=change-this-secret-key +IFNEX_BRIDGE_API_KEY=change-this-secret-key CORS_ALLOWED_ORIGINS=https://ifnex.ir @@ -77,15 +79,20 @@ CORS_ALLOWED_ORIGINS=https://ifnex.ir ZARINPAL_SANDBOX=false ZARINPAL_MERCHANT_ID=YOUR_REAL_MERCHANT_ID ZARINPAL_CALLBACK_URL=https://system.ifnex.ir/api/v1/payment/callback -ZARINPAL_FRONTEND_SUCCESS_URL=https://ifnex.ir/wallet ZARINPAL_FRONTEND_FAILURE_URL=https://ifnex.ir/wallet -# Kavenegar SMS Service -KAVENEGAR_API_KEY=YOUR_KAVENEGAR_API_KEY -KAVENEGAR_SENDER=10008566 +# Kavenegar — کلید نهایی از پنل ادمین تنظیم می‌شود، نه از این فایل +KAVENEGAR_API_KEY= +KAVENEGAR_SENDER= ``` -> 📱 **نکته SMS:** سرویس پیامک از تنظیمات پنل ادمین (Filament → تنظیمات سیستم → SystemSetting) خوانده می‌شود: `kavenegar_api_key` و سوییچ‌های `kavenegar_send_*` برای هر نوع اعلان. بعد از استقرار، کلید کاوه‌نگار را از پنل تنظیم کنید — در غیر این صورت فقط نوتیفیکیشن دیتابیسی ارسال می‌شود. +> 🔐 **نکتهٔ امنیتی:** مقدار `change-this-secret-key` عمداً انتخاب شده است، چون `BridgeAuthController` دقیقاً همین مقدار را رد می‌کند و خطای ۵۰۰ می‌دهد — یعنی اگر جایگزینی فراموش شود، سیستم بی‌سروصدا کار نمی‌کند. هر مقدار دیگری (حتی مواردی که شبیه placeholder باشند) به‌عنوان یک کلید معتبر پذیرفته می‌شود. +> +> ⚠️ اگر کلیدی قبلاً در این مخزن یا در `.env` اشتراکی ثبت شده، آن را **لو‌رفته فرض کنید و حتماً چرخش دهید**. + +> 📱 **نکتهٔ `ZARINPAL_FRONTEND_SUCCESS_URL`:** این کلید در کد خوانده نمی‌شود. ریدایرکت بعد از پرداخت موفق از طریق `frontend_callback` که وردپرس در هر درخواست پرداخت ارسال می‌کند تعیین می‌شود؛ فقط `ZARINPAL_FRONTEND_FAILURE_URL` به‌عنوان fallback استفاده می‌شود. + +> 📱 **نکتهٔ SMS:** سرویس پیامک از تنظیمات پنل ادمین (Filament → تنظیمات سیستم → SystemSetting) خوانده می‌شود: `kavenegar_api_key` و سوییچ‌های `kavenegar_send_*` برای هر نوع اعلان. مقداردهی این متغیرها در `.env` کافی نیست. ### ۱.۴ دیتابیس diff --git a/DEPLOYMENT_HANDOFF.md b/DEPLOYMENT_HANDOFF.md index d71ec7d..afab747 100644 --- a/DEPLOYMENT_HANDOFF.md +++ b/DEPLOYMENT_HANDOFF.md @@ -68,32 +68,44 @@ DB_DATABASE=ifnex_laravel DB_USERNAME=YOUR_DB_USER DB_PASSWORD=YOUR_DB_PASSWORD -IFNEX_BRIDGE_API_KEY=CHANGE_THIS_TO_A_RANDOM_SECRET +IFNEX_API_KEY=change-this-secret-key +IFNEX_BRIDGE_API_KEY=change-this-secret-key CORS_ALLOWED_ORIGINS=https://ifnex.ir ZARINPAL_SANDBOX=false ZARINPAL_MERCHANT_ID=YOUR_REAL_MERCHANT_ID ZARINPAL_CALLBACK_URL=https://system.ifnex.ir/api/v1/payment/callback -ZARINPAL_FRONTEND_SUCCESS_URL=https://ifnex.ir/wallet ZARINPAL_FRONTEND_FAILURE_URL=https://ifnex.ir/wallet -KAVENEGAR_API_KEY=YOUR_KAVENEGAR_KEY -KAVENEGAR_SENDER=YOUR_SENDER_NUMBER +KAVENEGAR_API_KEY= +KAVENEGAR_SENDER= ``` -> ⚠️ **نکتهٔ امنیتی:** مقدار `IFNEX_BRIDGE_API_KEY` را پیش از استقرار با یک کلید تصادفی و طولانی جایگزین کنید. این مقدار باید عیناً در پلاگین وردپرس هم تنظیم شود. +> ⚠️ **نکتهٔ امنیتی — الزامی:** هر دو مقدار `IFNEX_API_KEY` و `IFNEX_BRIDGE_API_KEY` باید پیش از استقرار با یک رشتهٔ تصادفی و طولانی (مثلاً خروجی `openssl rand -hex 32`) جایگزین شوند. +> +> مقدار `change-this-secret-key` عمداً انتخاب شده است، چون کد سمت لاراول (`BridgeAuthController`) دقیقاً همین مقدار را رد می‌کند و خطای ۵۰۰ می‌دهد. یعنی اگر جایگزینی فراموش شود، سیستم **بی‌سروصدا کار نمی‌کند** و به‌جای آن لو می‌دهد. هر مقدار دیگری — از جمله مواردی که شبیه placeholder باشند — به‌عنوان یک کلید معتبر پذیرفته می‌شود. +> +> `IFNEX_BRIDGE_API_KEY` باید عیناً در پلاگین وردپرس هم تنظیم شود. `IFNEX_API_KEY` کلید عمومی بخش رهگیری است و آن هم باید در پلاگین تنظیم شود. ### ۲.۴ راه‌اندازی اولیه ```bash php artisan key:generate php artisan migrate --force + +# داده‌های مرجع — بدون این مرحله قیمت‌گذاری و فرم سفارش کار نمی‌کنند +php artisan db:seed --class=CountriesTableSeeder --force +php artisan db:seed --class=SystemSettingSeeder --force +php artisan db:seed --class=RoleAndPermissionSeeder --force + php artisan storage:link php artisan config:cache php artisan route:cache php artisan view:cache ``` +> ℹ️ **دربارهٔ seedها:** جدول `countries` فقط توسط `CountriesTableSeeder` پر می‌شود و موتور قیمت‌گذاری با `Country::where('iso_code', …)->firstOrFail()` کشور را پیدا می‌کند؛ اگر این seed اجرا نشود، همهٔ استعلام‌های قیمت با خطای 404 مواجه می‌شوند و لیست کشورها در فرم سفارش وردپرس خالی می‌ماند. جدول `system_settings` نیز فقط توسط `SystemSettingSeeder` پر می‌شود. + تنظیم دسترسی پوشه‌ها: ```bash @@ -101,20 +113,64 @@ chown -R www-data:www-data storage bootstrap/cache chmod -R 775 storage bootstrap/cache ``` -### ۲.۵ تنظیم Cron +### ۲.۵ ساخت حساب ادمین پنل -برای اجرای صف و زمان‌بندی‌ها، این خط را در کرون اضافه کنید: +پنل مدیریت فقط به کاربرانی اجازهٔ ورود می‌دهد که نقش Spatie یکی از `super_admin`، `admin` یا `staff` را داشته باشند. برای ساخت اولین مدیر: -```cron -* * * * * cd /var/www/system.ifnex.ir && php artisan schedule:run >> /dev/null 2>&1 +```bash +php artisan make:filament-user ``` -اگر صف با Redis اجرا می‌شود، این خط را نیز اضافه کنید: +سپس در یک محیط تعاملی (Tinker) نقش را اعطا کنید: + +```bash +php artisan tinker +``` + +```php +$user = User::where('email', 'admin@ifnex.ir')->first(); +$user->assignRole('super_admin'); +``` + +> ⚠️ اگر این مرحله انجام نشود، صفحهٔ `/panel/login` باز می‌شود ولی هیچ حسابی نمی‌تواند وارد شود. + +### ۲.۶ همگام‌سازی کاربران وردپرس + +ورود مشتری از طریق Bridge انجام می‌شود و کاربر را بر اساس ایمیل در دیتابیس لاراول پیدا می‌کند. برای اینکه مشتریان وردپرس بتوانند وارد شوند، باید یک‌بار کاربران را همگام کنید (این دستور پس از راه‌اندازی هر دو دیتابیس اجرا می‌شود): + +```bash +php artisan ifnex:sync-wp-users \ + --wp-db-host=127.0.0.1 \ + --wp-db-name=ifnex_wordpress \ + --wp-db-user=YOUR_WP_DB_USER \ + --wp-db-pass=YOUR_WP_DB_PASSWORD +``` + +> اگر پیشوند جدول‌های وردپرس شما `wp_` نیست، گزینهٔ `--wp-table-prefix` را هم اضافه کنید. + +### ۲.۷ تنظیمات پیامک (کاوه‌نگار) + +ارسال پیامک در این سیستم از جدول `system_settings` خوانده می‌شود، نه از فایل `.env`. بنابراین مقداردهی `KAVENEGAR_API_KEY` در `.env` به‌تنهایی کافی نیست و باید از پنل مدیریت وارد شود: + +**پنل ادمین ← تنظیمات سیستم ← سرویس پیامک** + +| فیلد | مقدار | +|------|--------| +| Kavenegar API Key | کلید دریافتی از پنل کاوه‌نگار | +| Kavenegar Sender | شمارهٔ فرستندهٔ تأییدشده | + +پس از وارد کردن، سوییچ‌های ارسال برای هر رویداد (تأیید سفارش، رد سفارش، پرداخت موفق، تغییر ترکینگ) را نیز در همان صفحه فعال کنید. + +### ۲.۸ تنظیم Cron + +این پروژه در حال حاضر هیچ زمان‌بندی ثبت‌شده‌ای (Schedule) ندارد. تنها وظیفهٔ زمان‌بندی‌شده، به‌روزرسانی نرخ ارز است که باید مستقیم صدا زده شود: ```cron -* * * * * cd /var/www/system.ifnex.ir && php artisan queue:work --tries=3 >> /dev/null 2>&1 +0 2 * * * cd /var/www/system.ifnex.ir && php artisan ifnex:update-rates >> /dev/null 2>&1 ``` +> ℹ️ دربارهٔ صف: در نسخهٔ فعلی هیچ Job یا اعلانی که `ShouldQueue` را پیاده‌سازی کند وجود ندارد و `QUEUE_CONNECTION` روی `database` است. بنابراین نیازی به `queue:work` نیست. اگر در آینده صف اضافه شد، آن را با systemd یا supervisor مدیریت کنید، نه با کرون. + --- ## ۳. استقرار وردپرس — `ifnex.ir` @@ -131,23 +187,49 @@ define('DB_NAME', 'ifnex_wordpress'); define('DB_USER', 'YOUR_WP_DB_USER'); define('DB_PASSWORD', 'YOUR_WP_DB_PASSWORD'); define('DB_HOST', '127.0.0.1'); +define('DB_CHARSET', 'utf8mb4'); +define('DB_COLLATE', ''); + define('WP_HOME', 'https://ifnex.ir'); define('WP_SITEURL', 'https://ifnex.ir'); + +// غیرفعال کردن دیباگ در Production +define('WP_DEBUG', false); +define('WP_DEBUG_LOG', false); +define('WP_DEBUG_DISPLAY', false); + +// امنیت پیشخوان +define('DISALLOW_FILE_EDIT', true); +define('DISALLOW_FILE_MODS', true); +define('FS_METHOD', 'direct'); ``` +**ساخت کلیدها و Saltهای اختصاصی — الزامی:** + +فایل `wp-config.php` که همراه بسته تحویل داده می‌شود دارای `WP_DEBUG = true` و کلیدها و Saltهای ثابت است که در مخزن گیت قرار دارند. این مقادیر **نباید** در Production استفاده شوند. پیش از راه‌اندازی، مقادیر `AUTH_KEY`، `SECURE_AUTH_KEY`، `LOGGED_IN_KEY`، `NONCE_KEY`، `AUTH_SALT`، `SECURE_AUTH_SALT`، `LOGGED_IN_SALT` و `NONCE_SALT` را با مقادیر تصادفی اختصاصی جایگزین کنید. ساده‌ترین روش، دریافت هشت مقدار آماده از سرویس رسمی وردپرس است: + +``` +https://api.wordpress.org/secret-key/1.1/salt/ +``` + +> ⚠️ استفاده از Saltهای مشترک بین چند نصب، امنیت کوکی‌های احراز هویت را به‌طور کامل از بین می‌برد. + ### ۳.۳ فعال‌سازی قالب و پلاگین قالب `IFNEX Theme` و پلاگین `IFNEX Bridge` را از بخش افزونه‌های وردپرس فعال کنید. ### ۳.۴ تنظیمات پلاگین IFNEX Bridge -از مسیر **پنل وردپرس → تنظیمات IFNEX**: +از مسیر **پنل وردپرس → تنظیمات IFNEX**، هر سه فیلد زیر را پر کنید: | تنظیم | مقدار | |--------|--------| | API URL | `https://system.ifnex.ir/api/v1` | +| API Key (عمومی) | همان مقدار `IFNEX_API_KEY` در فایل `.env` لاراول | | Bridge API Key | همان مقدار `IFNEX_BRIDGE_API_KEY` در فایل `.env` لاراول | +> ⚠️ اگر `API Key (عمومی)` خالی بماند، صفحهٔ `/tracking/` خطای «API Key تنظیم نشده است» نشان می‌دهد و اندپوینت رهگیری کار نمی‌کند. این مقدار را با یک رشتهٔ تصادفی در `.env` تنظیم کنید. + ### ۳.۵ اصلاح آدرس‌ها در دیتابیس اگر سایت از محیط لوکال به سرور منتقل می‌شود، آدرس‌های ذخیره‌شده را اصلاح کنید: @@ -193,23 +275,31 @@ UPDATE wp_postmeta - [ ] کلون مخزن انجام شد - [ ] `composer install` اجرا شد -- [ ] فایل `.env` تنظیم شد (دیتابیس، `APP_URL`، CORS، Zarinpal، Kavenegar) +- [ ] فایل `.env` تنظیم شد (دیتابیس، `APP_URL`، CORS، Zarinpal) +- [ ] `IFNEX_API_KEY` و `IFNEX_BRIDGE_API_KEY` با رشتهٔ تصادفی جایگزین شدند (مقدار `change-this-secret-key` باقی نمانده) - [ ] `php artisan key:generate` اجرا شد - [ ] `php artisan migrate` اجرا شد +- [ ] seedها اجرا شدند (`CountriesTableSeeder`، `SystemSettingSeeder`، `RoleAndPermissionSeeder`) +- [ ] جدول `countries` پر است (۱۹۲ کشور) +- [ ] حساب ادمین با نقش `super_admin` ساخته شد - [ ] `php artisan storage:link` اجرا شد - [ ] دسترسی `storage/` و `bootstrap/cache/` تنظیم شد - [ ] `php artisan config:cache` اجرا شد -- [ ] کرون اضافه شد -- [ ] آدرس `https://system.ifnex.ir/panel/login` باز می‌شود +- [ ] کاوه‌نگار در «تنظیمات سیستم» پنل تنظیم شد +- [ ] کرون به‌روزرسانی نرخ ارز اضافه شد +- [ ] آدرس `https://system.ifnex.ir/panel/login` باز می‌شود و ورود ادمین کار می‌کند ### ۵.۲ وردپرس - [ ] فایل‌ها اکسترکت شدند - [ ] دیتابیس ایمپورت شد - [ ] `wp-config.php` تنظیم شد +- [ ] `WP_DEBUG` روی `false` تنظیم شد +- [ ] کلیدها و Saltهای وردپرس با مقادیر اختصاصی جایگزین شدند - [ ] آدرس‌ها در دیتابیس جایگزین شدند - [ ] قالب و پلاگین IFNEX Bridge فعال شدند -- [ ] پلاگین تنظیم شد (API URL + Bridge API Key) +- [ ] پلاگین تنظیم شد (API URL + API Key عمومی + Bridge API Key) +- [ ] `ifnex:sync-wp-users` اجرا شد و کاربران مشتری به لاراول منتقل شدند - [ ] آدرس `https://ifnex.ir` باز می‌شود - [ ] لاگین مشتری کار می‌کند @@ -217,6 +307,7 @@ UPDATE wp_postmeta - [ ] وردپرس به API لاراول وصل می‌شود (تست: لاگین مشتری) - [ ] خطای CORS داده نمی‌شود +- [ ] صفحهٔ `/tracking/` با یک شمارهٔ AWB نتیجه برمی‌گرداند - [ ] پرداخت درگاه کار می‌کند (`ZARINPAL_MERCHANT_ID` تنظیم شده و `ZARINPAL_SANDBOX=false`) - [ ] ارسال پیامک Kavenegar تست شد - [ ] بارگذاری فایل (آپلود تعهدنامه) کار می‌کند diff --git a/README.md b/README.md index f1b891e..1094eaf 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ IFNEX-Logistics/ │ │ ├── Enums/ # ShipmentStatus، Direction، Type │ │ ├── Filament/ │ │ │ ├── Resources/ # ۱۷ Resource (Shipment، Country و…) -│ │ │ ├── Pages/ # Settings، ImportRates، PriceTest، Reports +│ │ │ ├── Pages/ # Dashboard، IfnexSettings، ImportRates، BulkTrackingImport، CustomerFinancialOverview، PriceTest │ │ │ └── Widgets/ # داشبورد │ │ ├── Http/ │ │ │ ├── Controllers/Api/ # Track، Pricing، Auth، Bridge، Customer، Wallet، Payment @@ -271,7 +271,8 @@ mysql -u root -p -e "CREATE DATABASE ifnex_db CHARACTER SET utf8mb4 COLLATE utf8 # DB_DATABASE=ifnex_db # DB_USERNAME=root # DB_PASSWORD=your_password -# IFNEX_BRIDGE_API_KEY=your-secret-bridge-key # مهم برای وردپرس +# IFNEX_BRIDGE_API_KEY=change-this-secret-key # مهم برای وردپرس (پیش از استقرار با +# # openssl rand -hex 32 جایگزین کن) # ZARINPAL_MERCHANT_ID=fake-merchant-id-for-testing # برای Mock Mode # ZARINPAL_SANDBOX=true # CORS_ALLOWED_ORIGINS=http://localhost,http://127.0.0.1