修复:私有频道改用数字 ID,解决中文用户名导致 Pusher 频道名非法

错误原因:Pusher 频道名只允许 [a-zA-Z0-9_\-=@,.],
中文用户名(如「超级舞魅」)用于 private-user.{username} 导致
PusherException: Invalid channel name。

修复方案(改用数字 ID):
- FriendAdded/FriendRemoved 构造加 toUserId 参数
- broadcastOn() 改为 PrivateChannel('user.' . $toUserId)
- FriendController 传入 $target->id / $targetUser->id
- channels.php 鉴权改为 'user.{id}',核对 $user->id 数字相等
- frame.blade.php chatContext 加 userId
- scripts.blade.php Echo.private 改用 userId 订阅
This commit is contained in:
2026-03-01 01:41:04 +08:00
parent a44a9ce242
commit 7bae5e56ff
6 changed files with 31 additions and 31 deletions
+7 -4
View File
@@ -112,8 +112,8 @@ class FriendController extends Controller
->where('towho', $me->username)
->exists();
// 广播给对方(仅对方可见),携带是否已回加的状态
broadcast(new FriendAdded($me->username, $username, $hasAddedBack));
// 广播给对方(仅对方可见),携带是否已回加的状态;用数字 ID 作为频道名,避免中文名
broadcast(new FriendAdded($me->username, $username, $target->id, $hasAddedBack));
// 若对方在线,推送聊天区悄悄话(文案根据互相状态区分)
$this->notifyOnlineUser($username, $me->username, 'added', $request->input('room_id'), $hasAddedBack);
@@ -152,8 +152,11 @@ class FriendController extends Controller
->where('towho', $me->username)
->exists();
// 广播给对方,携带之前的互相好友状态
broadcast(new FriendRemoved($me->username, $username, $hadAddedBack));
// 查询目标用户 ID(用于私有频道,避免中文名非法)
$targetUser = User::where('username', $username)->first();
// 广播给对方,携带之前的互相好友状态;用数字 ID 避免中文频道名
broadcast(new FriendRemoved($me->username, $username, $targetUser?->id ?? 0, $hadAddedBack));
// 若对方在线,推送聊天区悄悄话(文案根据互相状态区分)
$this->notifyOnlineUser($username, $me->username, 'removed', $request->input('room_id'), $hadAddedBack);