This commit is contained in:
eric
2026-03-31 14:18:59 -05:00
parent c700d7079f
commit 38c10b4227

View File

@@ -361,6 +361,15 @@ async def nomadvip_check_vip(user_id: str = ""):
or str(wx_link.get("anonymous_user_id", "")).strip()
)
wx_link_email = str(wx_link.get("email", "")).strip().lower()
if admin_token and linked_user_id and _uid_has_vip(pb, linked_user_id):
# 补齐标准关联表,避免后续链路只能依赖 raw_contact
if wx_link_email:
_pb_upsert_email_link(
admin_token,
wx_link_email,
linked_user_id,
user_id,
)
except Exception:
linked_user_id = ""
wx_link_email = ""
@@ -501,6 +510,12 @@ def _pb_bind_wechat_vip_link(
or None,
"updated_at": int(time.time()),
}
if not raw_contact["_vip_link"].get("anonymous_user_id"):
derived = _pb_find_anonymous_user_id_by_member(
admin_token, str(raw_contact["_vip_link"].get("pb_user_id") or "").strip()
)
if derived:
raw_contact["_vip_link"]["anonymous_user_id"] = derived
base = (PB_URL or "").rstrip("/")
_http_session.patch(
@@ -514,6 +529,58 @@ def _pb_bind_wechat_vip_link(
)
def _pb_find_anonymous_user_id_by_member(
admin_token: str, member_user_id: str
) -> str | None:
"""
从会员用户 ID 反查对应历史支付匿名 user_iduser[0-9]+)。
路径site_vip(user_id=member) -> order_id -> payments(order_id) -> user_id
"""
member_user_id = (member_user_id or "").strip()
if not member_user_id:
return None
base = (PB_URL or "").rstrip("/")
safe_member = _pb_escape(member_user_id)
site_resp = _http_session.get(
f"{base}/api/collections/site_vip/records",
params={
"filter": f'user_id = "{safe_member}" && site_id = "vip"',
"perPage": 20,
"sort": "-created",
},
headers={"Authorization": f"Bearer {admin_token}"},
timeout=DEFAULT_HTTP_TIMEOUT,
)
if site_resp.status_code != 200:
return None
site_items = (site_resp.json() or {}).get("items") or []
seen_orders = set()
for sv in site_items:
order_id = str((sv or {}).get("order_id") or "").strip()
if not order_id or order_id in seen_orders:
continue
seen_orders.add(order_id)
safe_order = _pb_escape(order_id)
pay_resp = _http_session.get(
f"{base}/api/collections/payments/records",
params={
"filter": f'order_id = "{safe_order}" && type = "vip"',
"perPage": 20,
"sort": "-created",
},
headers={"Authorization": f"Bearer {admin_token}"},
timeout=DEFAULT_HTTP_TIMEOUT,
)
if pay_resp.status_code != 200:
continue
pay_items = (pay_resp.json() or {}).get("items") or []
for payment in pay_items:
uid = str((payment or {}).get("user_id") or "").strip()
if uid.startswith("user") and uid[4:].isdigit():
return uid
return None
def _pb_get_user_by_id(admin_token: str, user_id: str) -> dict | None:
base = (PB_URL or "").rstrip("/")
response = _http_session.get(