Surface specific Jibit identity errors on profile update.
Map Shahkar mismatch, token, unreachable, and duplicate cases to clear Persian messages instead of a generic wait-for-admin toast. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -830,33 +830,60 @@ class Controller extends BaseController
|
||||
Storage::put('refreshTokenGibit', 'توکن رفرش اولیه');
|
||||
}
|
||||
|
||||
$apiData['refresh'] = Http::withoutVerifying()->withToken(Storage::get('refreshTokenGibit'))
|
||||
->post('https://napi.jibit.ir/ide/v1/tokens/generate', [
|
||||
'apiKey' => 'J5WxrPxPOg',
|
||||
'secretKey' => '7dgeE70xQXsQL7r36j3wif6X9',
|
||||
])->json();
|
||||
$apiData['refresh'] = $this->jibitHttpJson(
|
||||
Http::withoutVerifying()->withToken(Storage::get('refreshTokenGibit'))
|
||||
->post('https://napi.jibit.ir/ide/v1/tokens/generate', [
|
||||
'apiKey' => 'J5WxrPxPOg',
|
||||
'secretKey' => '7dgeE70xQXsQL7r36j3wif6X9',
|
||||
])
|
||||
);
|
||||
Storage::put('accessTokenGibit', $apiData['refresh']['accessToken'] ?? '');
|
||||
if (!empty($apiData['refresh']['refreshToken'])) {
|
||||
Storage::put('refreshTokenGibit', $apiData['refresh']['refreshToken']);
|
||||
}
|
||||
|
||||
$response = Http::withoutVerifying()->withToken(Storage::get('accessTokenGibit'))
|
||||
->get("https://napi.jibit.ir/ide/v1/services/matching?mobileNumber=$mobile&nationalCode=$nationalCode")
|
||||
->json();
|
||||
if (empty($apiData['refresh']['accessToken'])) {
|
||||
return [
|
||||
'code' => 'token_failed',
|
||||
'http_status' => $apiData['refresh']['http_status'] ?? null,
|
||||
'message' => $apiData['refresh']['message'] ?? '',
|
||||
];
|
||||
}
|
||||
|
||||
if ((isset($response['code'])) && $response['code'] == 'forbidden') {
|
||||
$refreshToken = Http::withoutVerifying()->withToken(Storage::get('refreshTokenGibit'))
|
||||
->post('https://napi.jibit.ir/ide/v1/tokens/generate', [
|
||||
'apiKey' => 'J5WxrPxPOg',
|
||||
'secretKey' => '7dgeE70xQXsQL7r36j3wif6X9',
|
||||
])->json();
|
||||
$response = $this->jibitHttpJson(
|
||||
Http::withoutVerifying()->withToken(Storage::get('accessTokenGibit'))
|
||||
->get('https://napi.jibit.ir/ide/v1/services/matching', [
|
||||
'mobileNumber' => $mobile,
|
||||
'nationalCode' => $nationalCode,
|
||||
])
|
||||
);
|
||||
|
||||
if (($response['code'] ?? null) == 'forbidden') {
|
||||
$refreshToken = $this->jibitHttpJson(
|
||||
Http::withoutVerifying()->withToken(Storage::get('refreshTokenGibit'))
|
||||
->post('https://napi.jibit.ir/ide/v1/tokens/generate', [
|
||||
'apiKey' => 'J5WxrPxPOg',
|
||||
'secretKey' => '7dgeE70xQXsQL7r36j3wif6X9',
|
||||
])
|
||||
);
|
||||
Storage::put('accessTokenGibit', $refreshToken['accessToken'] ?? '');
|
||||
if (!empty($refreshToken['refreshToken'])) {
|
||||
Storage::put('refreshTokenGibit', $refreshToken['refreshToken']);
|
||||
}
|
||||
$response = Http::withoutVerifying()->withToken(Storage::get('accessTokenGibit'))
|
||||
->get("https://napi.jibit.ir/ide/v1/services/matching?mobileNumber=$mobile&nationalCode=$nationalCode")
|
||||
->json();
|
||||
if (empty($refreshToken['accessToken'])) {
|
||||
return [
|
||||
'code' => 'token_failed',
|
||||
'http_status' => $refreshToken['http_status'] ?? null,
|
||||
'message' => $refreshToken['message'] ?? '',
|
||||
];
|
||||
}
|
||||
$response = $this->jibitHttpJson(
|
||||
Http::withoutVerifying()->withToken(Storage::get('accessTokenGibit'))
|
||||
->get('https://napi.jibit.ir/ide/v1/services/matching', [
|
||||
'mobileNumber' => $mobile,
|
||||
'nationalCode' => $nationalCode,
|
||||
])
|
||||
);
|
||||
}
|
||||
|
||||
$counter->value = (int) $counter->value + 1;
|
||||
@@ -865,6 +892,25 @@ class Controller extends BaseController
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \Illuminate\Http\Client\Response $pending
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
protected function jibitHttpJson($pending): array
|
||||
{
|
||||
$decoded = $pending->json();
|
||||
if (! is_array($decoded)) {
|
||||
return [
|
||||
'code' => 'empty_response',
|
||||
'http_status' => $pending->status(),
|
||||
'message' => '',
|
||||
];
|
||||
}
|
||||
$decoded['http_status'] = $pending->status();
|
||||
|
||||
return $decoded;
|
||||
}
|
||||
|
||||
public static function jibit($method, $p1 = null, $p2 = null, $p3 = null)
|
||||
{
|
||||
if (!app(ConfigService::class)->isJibitEnabled()) {
|
||||
|
||||
@@ -18,9 +18,11 @@ use Rooyesh\Wallet\models\Transaction;
|
||||
use App\Models\Setting;
|
||||
use App\Http\Controllers\Admin\TahesabController;
|
||||
use App\Services\ConfigService;
|
||||
use App\Services\JibitIdentityService;
|
||||
use App\Services\ReferralGiftService;
|
||||
use App\Services\WalletBalanceService;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\QueryException;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
@@ -207,9 +209,30 @@ class CustomerController extends Controller
|
||||
// $tah->store(["customer_id" => $customer->id]);
|
||||
$cfg = app(ConfigService::class);
|
||||
if (!$wasLegal && $cfg->isRegisterJibitVerifyEnabled()) {
|
||||
$response = $this->jibitNcode($customer->n_code, $customer->mobile);
|
||||
$nCodeError = JibitIdentityService::nationalCodeError($customer->n_code);
|
||||
if ($nCodeError !== null) {
|
||||
return response()->json([
|
||||
'message' => $nCodeError,
|
||||
'code' => 'invalid_national_code',
|
||||
], 422);
|
||||
}
|
||||
|
||||
if (isset($response['matched']) and $response['matched'] == true) {
|
||||
try {
|
||||
$response = $this->jibitNcode($customer->n_code, $customer->mobile);
|
||||
} catch (\Throwable $e) {
|
||||
Log::error('customer updateMe jibit unreachable', [
|
||||
'customer_id' => $customer->id,
|
||||
'message' => $e->getMessage(),
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'message' => 'ارتباط با سرویس احراز هویت جیبیت برقرار نشد. اطلاعات پروفایل ذخیره شد اما هویت تأیید نشد.',
|
||||
'code' => 'jibit_unreachable',
|
||||
], 422);
|
||||
}
|
||||
|
||||
$jibit = JibitIdentityService::interpretNationalMobileMatch($response);
|
||||
if ($jibit['ok']) {
|
||||
$customer->is_legal = 1;
|
||||
$customer->save();
|
||||
// واریز پاداش معرف مستقل از has_page_earn_money (آن فقط منوی اپ است)
|
||||
@@ -222,18 +245,18 @@ class CustomerController extends Controller
|
||||
true
|
||||
);
|
||||
} else {
|
||||
if (isset($response['matched']) && $response['matched'] === false) {
|
||||
return response()->json([
|
||||
'message' => 'کد ملی و شماره موبایل با یکدیگر مطابقت ندارند. لطفاً هر دو را با دقت بررسی کرده و دوباره ثبت کنید.',
|
||||
], 422);
|
||||
}
|
||||
Log::warning('customer updateMe jibit not verified', [
|
||||
'customer_id' => $customer->id,
|
||||
'code' => $jibit['code'],
|
||||
'jibit_code' => is_array($response) ? ($response['code'] ?? null) : null,
|
||||
'http_status' => is_array($response) ? ($response['http_status'] ?? null) : null,
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'message' => 'کد ملی ثبت شد، اما در حال حاضر سیستم نتوانست آن را تأیید کند. لطفاً منتظر بررسی و تأیید مدیر بمانید.',
|
||||
'message' => $jibit['message'],
|
||||
'code' => $jibit['code'],
|
||||
], 422);
|
||||
}
|
||||
|
||||
|
||||
} elseif (!$customer->is_legal && !$cfg->isRegisterJibitVerifyEnabled()) {
|
||||
return response()->json([
|
||||
'ok' => true,
|
||||
@@ -242,13 +265,47 @@ class CustomerController extends Controller
|
||||
]);
|
||||
}
|
||||
return response()->json(true);
|
||||
} catch (QueryException $e) {
|
||||
Log::error('customer updateMe failed', [
|
||||
'customer_id' => auth('customer')->id(),
|
||||
'message' => $e->getMessage(),
|
||||
]);
|
||||
$driverCode = (int) ($e->errorInfo[1] ?? 0);
|
||||
$sqlMessage = (string) ($e->errorInfo[2] ?? $e->getMessage());
|
||||
if ($driverCode === 1062) {
|
||||
if (str_contains($sqlMessage, 'n_code')) {
|
||||
return response()->json([
|
||||
'message' => 'این کد ملی قبلاً برای حساب دیگری ثبت شده است.',
|
||||
'code' => 'duplicate_national_code',
|
||||
], 422);
|
||||
}
|
||||
if (str_contains($sqlMessage, 'mobile')) {
|
||||
return response()->json([
|
||||
'message' => 'این شماره موبایل قبلاً برای حساب دیگری ثبت شده است.',
|
||||
'code' => 'duplicate_mobile',
|
||||
], 422);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'message' => 'این مقدار قبلاً در سیستم ثبت شده و تکراری است.',
|
||||
'code' => 'duplicate_value',
|
||||
], 422);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'message' => 'ذخیره اطلاعات در دیتابیس انجام نشد. جزئیات در لاگ سرور ثبت شد.',
|
||||
'code' => 'db_error',
|
||||
], 422);
|
||||
} catch (\Exception $e) {
|
||||
Log::error('customer updateMe failed', [
|
||||
'customer_id' => auth('customer')->id(),
|
||||
'message' => $e->getMessage(),
|
||||
]);
|
||||
|
||||
return response()->json(['message' => 'خطا در ذخیره اطلاعات. لطفاً دوباره تلاش کنید.'], 422);
|
||||
return response()->json([
|
||||
'message' => 'خطا در ذخیره اطلاعات. لطفاً دوباره تلاش کنید.',
|
||||
'code' => 'update_failed',
|
||||
], 422);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user