fix: 扫码注册按俱乐部微信配置换openid,Referer识别小程序

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-08 17:37:51 +08:00
parent 95d7e8d13d
commit a47d4ee0a6
3 changed files with 60 additions and 9 deletions

View File

@@ -1,5 +1,7 @@
"""俱乐部微信配置与 openid 解析。"""
import logging
import re
import requests
from django.conf import settings
@@ -8,6 +10,8 @@ from jituan.models import Club
logger = logging.getLogger(__name__)
_REFERER_APPID_RE = re.compile(r'servicewechat\.com/(wx[0-9a-fA-F]+)/', re.I)
def resolve_club_by_appid(app_id):
if not app_id:
@@ -38,6 +42,45 @@ def get_club_wx_credentials(club_id):
return '', '', club
def resolve_club_id_for_wechat_request(request):
"""
小程序请求解析 club_id登录/扫码注册)。
优先级X-Club-Id > body.appId > Referer 内 wx appid > 默认 xq。
老端 fighter.js 的 wdlyhdl 未带头时,靠 Referer 识别星之界等俱乐部。
"""
from jituan.services.club_context import resolve_club_id_from_request
header = (request.META.get('HTTP_X_CLUB_ID') or '').strip()
if not header and hasattr(request, 'headers'):
header = (request.headers.get('X-Club-Id') or '').strip()
if header:
return header
app_id = ''
data = getattr(request, 'data', None) or {}
if isinstance(data, dict):
app_id = (data.get('appId') or data.get('app_id') or '').strip()
if not app_id:
referer = request.META.get('HTTP_REFERER', '') or ''
matched = _REFERER_APPID_RE.search(referer)
if matched:
app_id = matched.group(1)
if app_id:
club = resolve_club_by_appid(app_id)
if club:
return club.club_id
return resolve_club_id_from_request(request)
def wechat_jscode2session_for_request(request, code):
"""按请求上下文换取 openid多俱乐部小程序"""
club_id = resolve_club_id_for_wechat_request(request)
return jscode2session(code, club_id=club_id)
def jscode2session(code, club_id=None, app_id=None):
"""
按俱乐部微信配置换取 openid。

View File

@@ -1,5 +1,5 @@
"""邀请码 / 邀请链俱乐部隔离。"""
from jituan.services.club_context import resolve_club_id_from_request
from jituan.services.club_resolver import resolve_club_id_for_wechat_request
from jituan.services.club_user import get_user_club_id
@@ -9,7 +9,7 @@ def assert_invite_same_club(request, inviter_user, invitee_user=None):
现网全部 xq 时行为与改造前一致。
返回 (ok, message)
"""
club_id = resolve_club_id_from_request(request)
club_id = resolve_club_id_for_wechat_request(request)
inviter_club = get_user_club_id(inviter_user)
if inviter_club != club_id:
return False, '邀请码不属于当前小程序俱乐部'