diff --git a/jituan/services/club_user.py b/jituan/services/club_user.py index 9668b2b..c57ec92 100644 --- a/jituan/services/club_user.py +++ b/jituan/services/club_user.py @@ -13,23 +13,30 @@ def resolve_invite_party_club(user, request_club_id=None): if not user: return None - explicit = (getattr(user, 'ClubID', None) or '').strip() - if explicit: - return explicit - uid = getattr(user, 'UserUID', None) or getattr(user, 'yonghuid', None) - if not uid: - return None - req = (request_club_id or '').strip() - if req: - hit = UserWxOpenid.query.filter(yonghuid=uid, club_id=req).first() - if hit: + + # 当前小程序 openid 绑定优先(ClubID 字段曾默认 xq,会误判新用户) + if req and uid: + if UserWxOpenid.query.filter(yonghuid=uid, club_id=req).exists(): return req - binding = UserWxOpenid.query.filter(yonghuid=uid).order_by('id').first() - if binding: - return binding.club_id + explicit = (getattr(user, 'ClubID', None) or '').strip() + if explicit: + if explicit == CLUB_ID_DEFAULT and uid: + has_real_xq = ( + UserWxOpenid.query.filter(yonghuid=uid, club_id=CLUB_ID_DEFAULT).exists() + or bool(getattr(user, 'OpenID', None)) + ) + if not has_real_xq: + explicit = '' + if explicit: + return explicit + + if uid: + binding = UserWxOpenid.query.filter(yonghuid=uid).order_by('id').first() + if binding: + return binding.club_id return None diff --git a/jituan/services/wechat_login.py b/jituan/services/wechat_login.py index 81d4713..c3cfe2b 100644 --- a/jituan/services/wechat_login.py +++ b/jituan/services/wechat_login.py @@ -151,6 +151,7 @@ def login_or_register_by_club(code, club_id=None, app_id=None, client_ip=''): UserName=openid, OpenID=openid if resolved_club_id == CLUB_ID_DEFAULT else None, UnionID=unionid or None, + ClubID='', ) try: from django.db import IntegrityError diff --git a/users/business_models.py b/users/business_models.py index 836ab64..ca81233 100644 --- a/users/business_models.py +++ b/users/business_models.py @@ -44,7 +44,7 @@ class User(_UserBase): IsStaff = models.BooleanField(default=False, db_column='IsStaff', verbose_name='是否员工') IsSuperuser = models.BooleanField(default=False, db_column='IsSuperuser', verbose_name='是否超级用户') ClubID = models.CharField( - max_length=16, default='xq', db_column='ClubID', verbose_name='所属俱乐部', + max_length=16, default='', db_column='ClubID', verbose_name='所属俱乐部', null=True, blank=True, ) diff --git a/users/views/auth.py b/users/views/auth.py index 112c1ec..83b2cff 100644 --- a/users/views/auth.py +++ b/users/views/auth.py @@ -860,6 +860,7 @@ class WechatLoginAndDashouRegisterView(APIView): UserName=openid, OpenID=openid if club_id == CLUB_ID_DEFAULT else None, UnionID=unionid or None, + ClubID='', # 勿用模型历史默认 xq,注册成功后再写 ) user_main.save() created = True @@ -889,14 +890,18 @@ class WechatLoginAndDashouRegisterView(APIView): from jituan.services.invite_guard import assert_invite_same_club from jituan.services.club_resolver import resolve_club_id_for_wechat_request + from jituan.services.club_user import resolve_invite_party_club ok, invite_msg = assert_invite_same_club( request, guanshi_profile.user, user_main, ) if not ok: logger.warning( - 'wdlyhdl 俱乐部校验失败 uid=%s club=%s msg=%s invite=%s', - user_main.UserUID, club_id, invite_msg, yaoqingma[:8], + 'wdlyhdl 俱乐部校验失败 uid=%s club=%s invitee_club=%s inviter_club=%s msg=%s invite=%s', + user_main.UserUID, club_id, + resolve_invite_party_club(user_main, club_id), + resolve_invite_party_club(guanshi_profile.user, club_id), + invite_msg, yaoqingma[:8], ) return legacy_miniapp_error(403, invite_msg)