#P1491
POST /pay/store
Route Info
| Method |
Endpoint |
Controller |
Middleware |
Purpose |
| POST |
/api/v2/pay/store |
V2CreditDebitController@storePay |
authWithJwt |
ذخیره رکوردهای پرداخت (Pay) جدید همراه با اطلاعات حساب، طرف حساب و تراکنش مالی؛ بروزرسانی کش مالی در Redis. |
منطق عملکرد تابع
تابع storePay برای ثبت گروهی تراکنشهای پرداخت و دریافتی طراحی شده است. ابتدا داده درخواست ($request->data) پردازش و شناسه مالی سال جاری بر اساس تابع StaticController::getYearFinancial() محاسبه میشود. سپس رکوردها در جدول pays درج میگردند. در پایان، بر اساس نوع حساب (reference یا aggregation)، اطلاعات مالی حساب مربوطه از طریق TradeController::financial() بازخوانی شده و در Redis کش میشود.
ورودیها
| نام پارامتر |
نوع |
منبع |
الزامی |
توضیح |
| json |
string (JSON) |
Body |
بله |
آرایهای از تراکنشها شامل اطلاعات پرداخت و دریافتی. |
| branch |
integer |
JWT/Header |
بله |
کد شعبه مبدا برای محدودسازی تراکنشها. |
| data[].type |
string |
Body→JSON |
بله |
نوع تراکنش (payment یا receive). |
| data[].type_pay |
string |
Body→JSON |
بله |
نوع پرداخت (transfer, accounting, coupon, contract). |
| data[].currency_amount |
integer |
Body→JSON |
بله |
مبلغ تراکنش (ریال). |
| data[].tracking_code |
string |
Body→JSON |
خیر |
کد رهگیری پرداخت در سیستم. |
| data[].wage |
integer |
Body→JSON |
خیر |
کارمزد تراکنش. |
| data[].functor_account |
integer |
Body→JSON |
خیر |
شناسه کاربر اجراکننده تراکنش (functor). |
| data[].status.id |
integer |
Body→JSON |
بله |
شناسه وضعیت تراکنش (در انتظار/تاییدشده). |
خروجی (Response)
{
"status": true,
"meta": {
"timestamp": 1732287600
},
"inserted_count": 3,
"ids": [1089, 1090, 1091],
"cached_financial": true
}
نکات امنیتی
- احراز JWT حتماً انجام میشود و شناسه شعبه از توکن استخراج میگردد.
- ورودی JSON باید از لحاظ ساختار و مقادیر کلیدی اعتبارسنجی شود.
- رشتههای عددی مانند مبلغ حتماً قبل از درج به فرمت انگلیسی تبدیل میشوند تا از تزریق داده جلوگیری شود.
نکات عملکردی
- درج گروهی رکوردها با استفاده از
DB::table('pays')->insert() انجام میشود که سرعت بالایی دارد.
- در انتهای عملیات، بلافاصله کش Redis برای حسابهای
reference و aggregation بهروزرسانی میشود.
- پیشنهاد به batch insert به همراه pipeline Redis (TTLs=300s) برای بازدهی بهتر.
وابستگیها
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Redis;
- use Carbon\Carbon;
- use App\Http\Controllers\TradeController;
- use App\Http\Controllers\StaticController;
کدهای خطا
| کد |
شرح خطا |
منبع |
| 400 |
ورودی JSON نامعتبر یا پارامتر ناقص. |
json_decode() |
| 403 |
کاربر بدون مجوز برای انجام نوع تراکنش. |
authWithJwt |
| 500 |
خطا در ثبت گروهی یا بروزرسانی کش Redis. |
DB/Redis |
پیشنهادهای امنیتی
- کنترل دسترسی بر اساس نقش: فقط کاربران با سطح
financial.editor مجاز به درج هستند.
- رمزنگاری tracking_code در صورت ارسال از کلاینتهای عمومی.
- جلوگیری از ارسال دوباره (duplicate) در درخواستهای همزمان با قفل Redis.
پیشنهادهای بهبود
- افزودن امکان rollback خودکار در صورت خطا در بروزرسانی کش.
- مدیریت تراکنش چندمرحلهای با Savepoints برای atomicity بهتر.
- پشتیبانی از چند واحد پولی همزمان (multi-currency).
ممیزی و لاگها
- نوع لاگ:
StorePayTransaction.
- فیلدهای ثبت:
operator_id، branch، ids، currency_amount.
- سطح لاگ: Critical.
- مدت نگهداری: ۹۰ روز در پایگاه audit_logs.
جمعبندی
این مسیر مسئول ثبت تراکنشهای پرداخت و دریافتی و بروزرسانی مالی Redis است. عملیات سریع گروهی و مدیریت مالی اتومات باعث کاهش سربار حسابداری میشود. فعالسازی کنترل نقش و اعتبارسنجی ساختار JSON برای امنیت ضروری است.