fix(core): harden settlement and wallet integration

This commit is contained in:
wchino
2026-07-22 01:40:37 +08:00
parent 150c3e7ebd
commit 35f6e46958
54 changed files with 2564 additions and 359 deletions

View File

@@ -18,6 +18,7 @@ return [
'settlement' => [
'default_timezone' => env('LOTTERY_SETTLEMENT_TIMEZONE', env('APP_TIMEZONE', 'UTC')),
'ticket_chunk_size' => max(1, (int) env('LOTTERY_SETTLEMENT_TICKET_CHUNK_SIZE', 10_000)),
],
/*
@@ -63,6 +64,7 @@ return [
| jwt.* :主站签发的 JWT验签通过后若无映射行则自动建档
| max_ttl_seconds :允许 (exp-iat) 最大秒数(默认 300=5 分钟),与「短效 Token」对齐
| require_iat_claim true 时必须带 iat否则拒绝不建档
| native.secret :原生玩家 JWT 专用密钥;必须显式配置且不得与任何 SSO 密钥共用
|
| aes.key_base64 可选。32 字节原始密钥再做 Base64 写入 env LOTTERY_PLAYER_TOKEN_AES_KEY
| 有值时 Bearer 串(非 xxx.yyy.zzz 外形)会先尝试 AES-GCM 解包为内层 JWT 再验签。
@@ -80,7 +82,7 @@ return [
'key_base64' => env('LOTTERY_PLAYER_TOKEN_AES_KEY'),
],
'native' => [
'secret' => env('LOTTERY_NATIVE_JWT_SECRET', env('MAIN_SITE_SSO_JWT_SECRET', '')),
'secret' => env('LOTTERY_NATIVE_JWT_SECRET'),
'ttl_seconds' => max(300, min(86400, (int) env('LOTTERY_NATIVE_JWT_TTL_SECONDS', 28800))),
'claim_player_id' => 'player_id',
'claim_auth_source' => 'auth_source',
@@ -132,5 +134,4 @@ return [
'draw_tick_settle_limit' => max(1, (int) env('LOTTERY_DRAW_TICK_SETTLE_LIMIT', 3)),
'draw_tick_finalize_limit' => max(1, (int) env('LOTTERY_DRAW_TICK_FINALIZE_LIMIT', 5)),
'draw_tick_rng_limit' => max(1, (int) env('LOTTERY_DRAW_TICK_RNG_LIMIT', 10)),
];

View File

@@ -1,5 +1,31 @@
<?php
$configuredAllowedOrigins = trim((string) env('REVERB_ALLOWED_ORIGINS', ''));
if ($configuredAllowedOrigins === '') {
$configuredAllowedOrigins = trim((string) env('CORS_ALLOWED_ORIGINS', ''));
}
if ($configuredAllowedOrigins === '' && env('APP_ENV', 'production') === 'local') {
$configuredAllowedOrigins = 'localhost,127.0.0.1';
}
$allowedOrigins = array_values(array_unique(array_filter(array_map(
static function (string $origin): string {
$origin = trim($origin);
if ($origin === '' || $origin === '*') {
return '';
}
if (str_starts_with($origin, '*.')) {
return strtolower($origin);
}
$host = parse_url(str_contains($origin, '://') ? $origin : '//'.$origin, PHP_URL_HOST);
return is_string($host) ? strtolower($host) : '';
},
explode(',', $configuredAllowedOrigins),
))));
return [
/*
|--------------------------------------------------------------------------
@@ -78,7 +104,7 @@ return [
'scheme' => env('REVERB_SCHEME', 'https'),
'useTLS' => env('REVERB_SCHEME', 'https') === 'https',
],
'allowed_origins' => ['*'],
'allowed_origins' => $allowedOrigins,
'ping_interval' => env('REVERB_APP_PING_INTERVAL', 60),
'activity_timeout' => env('REVERB_APP_ACTIVITY_TIMEOUT', 30),
'max_connections' => env('REVERB_APP_MAX_CONNECTIONS'),