fix: 微信登录失败时返回明确错误,附属信息异常不阻断登录

避免 staff/订单统计异常导致整次 wechat-login 500;缺俱乐部配置时提示更清晰。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-22 21:00:09 +08:00
parent dc4c0ad091
commit ce86b488d9
3 changed files with 29 additions and 9 deletions

View File

@@ -39,10 +39,14 @@ def resolve_club_by_appid(app_id):
def get_club_wx_credentials(club_id):
"""优先读 club 表xq 缺省时回退 settings 全局配置(兼容现网)。"""
club_id = club_id or CLUB_ID_DEFAULT
club = None
try:
club = Club.query.get(club_id=club_id)
except Club.DoesNotExist:
club = None
except Exception:
logger.exception('读取俱乐部失败 club_id=%s', club_id)
club = None
appid = get_club_miniapp_appid(club)
secret = (club.wx_secret or '').strip() if club else ''
@@ -55,7 +59,10 @@ def get_club_wx_credentials(club_id):
getattr(settings, 'WEIXIN_SECRET', ''),
club,
)
return '', '', club
# 非默认俱乐部未配置时给出明确原因,避免后续空指针 500
if not club:
return '', '', None
return appid or '', secret or '', club
def _invite_code_from_request(request):

View File

@@ -161,13 +161,22 @@ def login_or_register_by_club(code, club_id=None, app_id=None, client_ip=''):
refresh = RefreshToken.for_user(user)
token = str(refresh.access_token)
staff_fields = {}
order_counts = {}
group_info = {}
try:
from merchant_ops.services.authz import staff_fields_for_login
from users.views import WechatMiniProgramLoginView
staff_fields = staff_fields_for_login(user)
staff_fields = staff_fields_for_login(user) or {}
except Exception:
logger.exception('staff_fields_for_login 失败 uid=%s', getattr(user, 'UserUID', ''))
try:
from users.views import WechatMiniProgramLoginView
login_view = WechatMiniProgramLoginView()
order_counts = login_view.jisuanOrderShuliang(user.UserUID)
group_info = login_view.huoquQunPeizhi()
order_counts = login_view.jisuanOrderShuliang(user.UserUID) or {}
group_info = login_view.huoquQunPeizhi() or {}
except Exception:
logger.exception('登录附属信息失败 uid=%s', getattr(user, 'UserUID', ''))
data = {
'token': token,

View File

@@ -66,13 +66,17 @@ class ClubWechatLoginView(APIView):
code, club_id=club_id, app_id=app_id, client_ip=_client_ip(request),
)
if err:
# 配置缺失 / 微信侧错误:明确 400方便小程序提示运营配 AppSecret
return Response({'code': 2, 'msg': f'微信登录失败: {err}', 'data': None},
status=status.HTTP_400_BAD_REQUEST)
return Response({'code': 0, 'msg': '登录成功', 'data': data})
except Exception as e:
logger.exception('ClubWechatLoginView 异常')
return Response({'code': 99, 'msg': '系统繁忙,请稍后重试', 'data': None},
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
return Response({
'code': 99,
'msg': f'登录异常: {type(e).__name__}: {e}',
'data': None,
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
class ClubWxBindRefreshView(APIView):