fix: 统一微信用户定位,修复wechatlogin等UserName(openid)重复1062
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -86,6 +86,40 @@ def ensure_wx_openid_binding(club_id, openid, user, unionid=''):
|
||||
return UserWxOpenid.query.filter(club_id=club_id, openid=openid).first()
|
||||
|
||||
|
||||
def resolve_or_create_wx_user(club_id, openid, generate_uid, unionid=''):
|
||||
"""
|
||||
微信登录/注册统一找用户,避免 UserName(openid) 唯一键冲突。
|
||||
星之界等俱乐部用户常 UserName=openid 且 OpenID 为空,不可 get_or_create(OpenID=...)。
|
||||
返回 (user, created)。
|
||||
"""
|
||||
import uuid
|
||||
from users.business_models import User
|
||||
|
||||
user = find_user_by_wx_openid(club_id, openid)
|
||||
if user:
|
||||
ensure_wx_openid_binding(club_id, openid, user, unionid)
|
||||
return user, False
|
||||
|
||||
try:
|
||||
user = User(
|
||||
UserUUID=uuid.uuid4().bytes,
|
||||
UserUID=generate_uid(),
|
||||
UserName=openid,
|
||||
OpenID=openid if club_id == CLUB_ID_DEFAULT else None,
|
||||
UnionID=unionid or None,
|
||||
ClubID='',
|
||||
)
|
||||
user.save()
|
||||
ensure_wx_openid_binding(club_id, openid, user, unionid)
|
||||
return user, True
|
||||
except IntegrityError:
|
||||
user = find_user_by_wx_openid(club_id, openid)
|
||||
if not user:
|
||||
raise
|
||||
ensure_wx_openid_binding(club_id, openid, user, unionid)
|
||||
return user, False
|
||||
|
||||
|
||||
def get_user_club_id(user):
|
||||
"""
|
||||
解析用户归属 club(注册/邀请链隔离用)。
|
||||
|
||||
@@ -15,6 +15,7 @@ from jituan.services.club_user import (
|
||||
ensure_user_club_id,
|
||||
ensure_wx_openid_binding,
|
||||
find_user_by_wx_openid,
|
||||
resolve_or_create_wx_user,
|
||||
)
|
||||
from users.business_models import User
|
||||
from users.models import UserBoss, UserDashou, UserGuanshi, UserShangjia, UserZuzhang, UserShenheguan
|
||||
@@ -138,34 +139,14 @@ def login_or_register_by_club(code, club_id=None, app_id=None, client_ip=''):
|
||||
user = User.objects.filter(UserUID=binding.yonghuid).first()
|
||||
|
||||
if not user:
|
||||
user = find_user_by_wx_openid(resolved_club_id, openid)
|
||||
if user:
|
||||
ensure_wx_openid_binding(resolved_club_id, openid, user, unionid)
|
||||
|
||||
if not user:
|
||||
user_uuid = uuid.uuid4().bytes
|
||||
new_uid = _generate_user_uid()
|
||||
user = User(
|
||||
UserUUID=user_uuid,
|
||||
UserUID=new_uid,
|
||||
UserName=openid,
|
||||
OpenID=openid if resolved_club_id == CLUB_ID_DEFAULT else None,
|
||||
UnionID=unionid or None,
|
||||
ClubID='',
|
||||
user, created = resolve_or_create_wx_user(
|
||||
resolved_club_id, openid, _generate_user_uid, unionid=unionid,
|
||||
)
|
||||
try:
|
||||
from django.db import IntegrityError
|
||||
user.save()
|
||||
except IntegrityError:
|
||||
user = find_user_by_wx_openid(resolved_club_id, openid)
|
||||
if not user:
|
||||
raise
|
||||
ensure_wx_openid_binding(resolved_club_id, openid, user, unionid)
|
||||
else:
|
||||
created = True
|
||||
if created:
|
||||
_ensure_boss_profile(user)
|
||||
_ensure_consumer_role(user)
|
||||
ensure_wx_openid_binding(resolved_club_id, openid, user, unionid)
|
||||
else:
|
||||
ensure_wx_openid_binding(resolved_club_id, openid, user, unionid)
|
||||
|
||||
if unionid and unionid != (user.UnionID or ''):
|
||||
user.UnionID = unionid
|
||||
|
||||
Reference in New Issue
Block a user