修复:私有频道改用数字 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
@@ -664,7 +664,8 @@
return;
}
const myName = window.chatContext.username;
window.Echo.private(`user.${myName}`)
const myId = window.chatContext.userId;
window.Echo.private(`user.${myId}`)
.listen('.FriendAdded', (e) => {
// 用居中大卡弹窗通知(有无互相好友显示不同文案和按钮)
showFriendBanner(e.from_username, e.has_added_back);
@@ -707,10 +708,11 @@
return;
}
const myName = window.chatContext.username;
const myId = window.chatContext.userId;
const roomId = window.chatContext.roomId;
// 监听私有用户频道(单独推给某人)
window.Echo.private(`user.${myName}`)
// 监听私有用户频道(单独推给某人,用数字 ID 避免中文名频道非法
window.Echo.private(`user.${myId}`)
.listen('.BannerNotification', (e) => {
if (e.options && typeof e.options === 'object') {
window.chatBanner.show(e.options);