Compare commits

...

7 Commits

Author SHA1 Message Date
Daniel
eb8d43841c fix: 修复代理状态检测不正确 2026-03-24 19:38:44 +08:00
Daniel
6a68d5b66a feat: add 新增验证码登录 2026-03-24 14:14:36 +08:00
Daniel
aaf46207a4 fix:add new file 2026-03-24 10:51:05 +08:00
Daniel
d5f1b2ae77 Revert "fix: 优化登录项"
This reverts commit 3b3fac1cee.
2026-03-16 23:05:07 +08:00
Daniel
1a339d82cd fix:检查版本升级导致的环境报错 2026-03-16 23:05:01 +08:00
Daniel
29c473890a 优化内容:代理设置 2026-03-16 22:24:02 +08:00
丹尼尔
3b3fac1cee fix: 优化登录项 2026-03-15 19:17:12 +08:00
14 changed files with 2463 additions and 64 deletions

3
.env
View File

@@ -6,8 +6,9 @@ APIKEY=sk-85880595fc714d63bfd0b025e917bd26#千问apikey
# 962516e4-60eb-4a26-a5a3-44e21adcf7bc #豆包
# 消息回调ngrok 调通用,由 run-ngrok.sh 自动写入)
CALLBACK_BASE_URL=https://dissonant-destinee-nonsensibly.ngrok-free.dev
# CALLBACK_BASE_URL=https://dissonant-destinee-nonsensibly.ngrok-free.dev
CALLBACK_BASE_URL=http://demo.bimwe.com
# 固定隧道代理socks5h不填登录页代理时后端自动用此处传给 7006
# TUNNEL_PROXY=218.78.109.253:16816

View File

@@ -17,11 +17,14 @@ WORKDIR /app
ENV NODE_ENV=production \
PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1
PYTHONUNBUFFERED=1 \
TZ=Asia/Shanghai
# Alpine 使用国内镜像,加速 apk 安装python3/py3-pip
# Alpine 使用国内镜像,加速 apk 安装python3/py3-pip并设置时区为 Asia/Shanghai与宿主机保持一致
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
&& apk add --no-cache python3 py3-pip
&& apk add --no-cache python3 py3-pip tzdata \
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app/dist ./dist

View File

@@ -3,11 +3,16 @@ FROM docker.m.daocloud.io/library/python:3.11-slim
WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1
PYTHONUNBUFFERED=1 \
TZ=Asia/Shanghai
COPY backend/requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
RUN apt-get update && apt-get install -y --no-install-recommends tzdata \
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone \
&& pip install --no-cache-dir -r requirements.txt \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
COPY backend ./backend

View File

@@ -15140,3 +15140,45 @@ httpx.ConnectError: All connection attempts failed
2026-03-15 17:31:04,477 [INFO] wechat-backend - SetCallback registered for key=***9BJZ, CallbackURL=https://dissonant-destinee-nonsensibly.ngrok-free.dev/api/callback/wechat-message
2026-03-15 17:31:04,478 [INFO] wechat-backend - 启动时已注册回调 key=***9BJZ
2026-03-15 17:31:04,478 [INFO] wechat-backend - 消息接收已切换为实时回调入口,不再启动 WS GetSyncMsg
2026-03-24 13:53:30,527 [INFO] wechat-backend - proxy config: tunnel=True (TUNNEL_PROXY=14.103.95.78:16816), kdl=False (KDL_API=(empty))
2026-03-24 13:53:30,726 [INFO] httpx - HTTP Request: POST http://113.44.162.180:7006/message/SetCallback?key=HBpEnbtj9BJZ "HTTP/1.1 200 OK"
2026-03-24 13:53:30,727 [INFO] wechat-backend - SetCallback registered for key=***9BJZ, CallbackURL=https://dissonant-destinee-nonsensibly.ngrok-free.dev/api/callback/wechat-message
2026-03-24 13:53:30,727 [INFO] wechat-backend - 启动时已注册回调 key=***9BJZ
2026-03-24 13:53:30,728 [INFO] wechat-backend - 消息接收已切换为实时回调入口,不再启动 WS GetSyncMsg
2026-03-24 13:56:12,539 [INFO] wechat-backend - proxy config: tunnel=True (TUNNEL_PROXY=14.103.95.78:16816), kdl=False (KDL_API=(empty))
2026-03-24 13:56:12,718 [INFO] httpx - HTTP Request: POST http://113.44.162.180:7006/message/SetCallback?key=HBpEnbtj9BJZ "HTTP/1.1 200 OK"
2026-03-24 13:56:12,719 [INFO] wechat-backend - SetCallback registered for key=***9BJZ, CallbackURL=http://demo.bimwe.com/api/callback/wechat-message
2026-03-24 13:56:12,719 [INFO] wechat-backend - 启动时已注册回调 key=***9BJZ
2026-03-24 13:56:12,719 [INFO] wechat-backend - 消息接收已切换为实时回调入口,不再启动 WS GetSyncMsg
2026-03-24 13:56:47,859 [INFO] wechat-backend - HTTP GET /api/ws-status from 127.0.0.1
2026-03-24 13:56:47,865 [INFO] wechat-backend - HTTP GET /api/ws-status -> 200
2026-03-24 13:57:24,091 [INFO] wechat-backend - HTTP GET /auth/scan-status from 127.0.0.1
2026-03-24 13:57:24,092 [INFO] wechat-backend - CheckLoginStatus: key=HBQ0d1NFqpio, url=http://113.44.162.180:7006/login/CheckLoginStatus
2026-03-24 13:57:24,234 [INFO] httpx - HTTP Request: GET http://113.44.162.180:7006/login/CheckLoginStatus?key=HBQ0d1NFqpio "HTTP/1.1 200 OK"
2026-03-24 13:57:24,237 [INFO] wechat-backend - Upstream CheckLoginStatus response: status=200, body={"Code":200,"Data":{"uuid":"A60ypn3NgZtZmIxMPDS7","state":1,"head_img_url":"http://wx.qlogo.cn/mmhead/ver_1/MYpdk7UU5ibX2RljVicmpcDMBxxog9qvtUvvrXlBVv4twgQibIZcnhIpjR5Qe93KB8I8y0fopiaFYE9Yd6xAfcSm2VXoTibyABYpFHrs4oXpg7eCvN6UFBg3IWjmlf4iaXzUhl/0","push_login_url_expired_time":0,"nick_name":"🧶花漾十年🧶 1098","effective_time":158,"unknow":0,"ret":0,"othersInServerLogin":false,"tarGetServerIp":"","uuId":"","msg":"请提交验证码后登录","data62":"","ticket":""},"Text":"请提交验证码后登录","Success":false,"Data62":"","Ticket":""}
2026-03-24 13:57:24,239 [INFO] wechat-backend - HTTP GET /auth/scan-status -> 200
2026-03-24 13:57:24,265 [INFO] wechat-backend - HTTP GET /auth/slider-assets/N_jYM_2V.js from 127.0.0.1
2026-03-24 13:57:24,525 [INFO] httpx - HTTP Request: GET http://113.44.162.180:7765/assets/N_jYM_2V.js "HTTP/1.1 200 OK"
2026-03-24 13:57:24,619 [INFO] wechat-backend - HTTP GET /auth/slider-assets/N_jYM_2V.js -> 200
2026-03-24 14:06:48,603 [INFO] wechat-backend - HTTP GET /api/ws-status from 127.0.0.1
2026-03-24 14:06:48,614 [INFO] wechat-backend - HTTP GET /api/ws-status -> 200
2026-03-24 14:06:52,271 [INFO] wechat-backend - HTTP GET /auth/scan-status from 127.0.0.1
2026-03-24 14:06:52,273 [INFO] wechat-backend - CheckLoginStatus: key=HBQ0d1NFqpio, url=http://113.44.162.180:7006/login/CheckLoginStatus
2026-03-24 14:06:52,402 [INFO] httpx - HTTP Request: GET http://113.44.162.180:7006/login/CheckLoginStatus?key=HBQ0d1NFqpio "HTTP/1.1 200 OK"
2026-03-24 14:06:52,404 [INFO] wechat-backend - Upstream CheckLoginStatus response: status=200, body={"Code":200,"Data":{"uuid":"A60ypn3NgZtZmIxMPDS7","state":1,"head_img_url":"http://wx.qlogo.cn/mmhead/ver_1/MYpdk7UU5ibX2RljVicmpcDMBxxog9qvtUvvrXlBVv4twgQibIZcnhIpjR5Qe93KB8I8y0fopiaFYE9Yd6xAfcSm2VXoTibyABYpFHrs4oXpg7eCvN6UFBg3IWjmlf4iaXzUhl/0","push_login_url_expired_time":0,"nick_name":"🧶花漾十年🧶 1098","effective_time":159,"unknow":0,"ret":0,"othersInServerLogin":false,"tarGetServerIp":"","uuId":"","msg":"请提交验证码后登录","data62":"","ticket":""},"Text":"登录处理中,请稍候...","Success":false,"Data62":"","Ticket":""}
2026-03-24 14:06:52,405 [INFO] wechat-backend - HTTP GET /auth/scan-status -> 200
2026-03-24 14:06:52,421 [INFO] wechat-backend - HTTP GET /auth/slider-assets/N_jYM_2V.js from 127.0.0.1
2026-03-24 14:06:52,622 [INFO] httpx - HTTP Request: GET http://113.44.162.180:7765/assets/N_jYM_2V.js "HTTP/1.1 200 OK"
2026-03-24 14:06:52,802 [INFO] wechat-backend - HTTP GET /auth/slider-assets/N_jYM_2V.js -> 200
2026-03-24 14:07:32,960 [INFO] wechat-backend - proxy config: tunnel=True (TUNNEL_PROXY=14.103.95.78:16816), kdl=False (KDL_API=(empty))
2026-03-24 14:07:33,158 [INFO] httpx - HTTP Request: POST http://113.44.162.180:7006/message/SetCallback?key=HBpEnbtj9BJZ "HTTP/1.1 200 OK"
2026-03-24 14:07:33,159 [INFO] wechat-backend - SetCallback registered for key=***9BJZ, CallbackURL=http://demo.bimwe.com/api/callback/wechat-message
2026-03-24 14:07:33,159 [INFO] wechat-backend - 启动时已注册回调 key=***9BJZ
2026-03-24 14:07:33,159 [INFO] wechat-backend - 消息接收已切换为实时回调入口,不再启动 WS GetSyncMsg
2026-03-24 14:07:41,711 [INFO] wechat-backend - HTTP GET /api/ws-status from 127.0.0.1
2026-03-24 14:07:41,716 [INFO] wechat-backend - HTTP GET /api/ws-status -> 200
2026-03-24 14:07:43,482 [INFO] wechat-backend - HTTP GET /auth/scan-status from 127.0.0.1
2026-03-24 14:07:43,487 [INFO] wechat-backend - CheckLoginStatus: key=HBQ0d1NFqpio, url=http://113.44.162.180:7006/login/CheckLoginStatus
2026-03-24 14:07:43,602 [INFO] httpx - HTTP Request: GET http://113.44.162.180:7006/login/CheckLoginStatus?key=HBQ0d1NFqpio "HTTP/1.1 200 OK"
2026-03-24 14:07:43,607 [INFO] wechat-backend - Upstream CheckLoginStatus response: status=200, body={"Code":200,"Data":{"uuid":"47ValF_qGD7osGBMYEap","state":1,"head_img_url":"http://wx.qlogo.cn/mmhead/ver_1/MYpdk7UU5ibX2RljVicmpcDMBxxog9qvtUvvrXlBVv4twgQibIZcnhIpjR5Qe93KB8I8y0fopiaFYE9Yd6xAfcSm2VXoTibyABYpFHrs4oXpg7eCvN6UFBg3IWjmlf4iaXzUhl/0","push_login_url_expired_time":0,"nick_name":"🧶花漾十年🧶 1098","effective_time":239,"unknow":0,"ret":0,"othersInServerLogin":false,"tarGetServerIp":"","uuId":"","msg":"","data62":"","ticket":""},"Text":"","Success":false,"Data62":"","Ticket":""}
2026-03-24 14:07:43,608 [INFO] wechat-backend - HTTP GET /auth/scan-status -> 200

View File

@@ -5618,3 +5618,17 @@
::1 - - [15/Mar/2026:09:15:28 +0000] "GET /api/ws-status HTTP/1.1" 200 19 "http://localhost:3000/manage.html?key=HBpEnbtj9BJZ" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36"
[2026-03-15T09:31:04.748Z] Static frontend server listening on port 3000; access log: /Users/dannier/Desktop/living/AICLW/wechatAiclaw/backend/data/logs/node-access.log
[2026-03-15T09:48:21.689Z] Static frontend server listening on port 3000; access log: /Users/dannier/Desktop/living/AICLW/wechatAiclaw/backend/data/logs/node-access.log
[2026-03-24T05:53:30.775Z] Static frontend server listening on port 3000; access log: /Users/dannier/Desktop/living/AICLW/wechatAiclaw/backend/data/logs/node-access.log
[2026-03-24T05:56:13.060Z] Static frontend server listening on port 3000; access log: /Users/dannier/Desktop/living/AICLW/wechatAiclaw/backend/data/logs/node-access.log
127.0.0.1 - - [24/Mar/2026:05:56:47 +0000] "GET / HTTP/1.1" 200 48534 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36"
127.0.0.1 - - [24/Mar/2026:05:56:47 +0000] "GET /api/ws-status HTTP/1.1" 200 19 "http://localhost:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36"
127.0.0.1 - - [24/Mar/2026:05:57:24 +0000] "GET /auth/scan-status?key=HBQ0d1NFqpio HTTP/1.1" 200 554 "http://localhost:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36"
127.0.0.1 - - [24/Mar/2026:05:57:24 +0000] "GET /auth/slider-assets/N_jYM_2V.js HTTP/1.1" 200 64695 "http://localhost:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36"
127.0.0.1 - - [24/Mar/2026:06:06:48 +0000] "GET / HTTP/1.1" 200 50250 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36"
127.0.0.1 - - [24/Mar/2026:06:06:48 +0000] "GET /api/ws-status HTTP/1.1" 200 19 "http://localhost:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36"
127.0.0.1 - - [24/Mar/2026:06:06:52 +0000] "GET /auth/scan-status?key=HBQ0d1NFqpio HTTP/1.1" 200 557 "http://localhost:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36"
127.0.0.1 - - [24/Mar/2026:06:06:52 +0000] "GET /auth/slider-assets/N_jYM_2V.js HTTP/1.1" 200 64695 "http://localhost:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36"
[2026-03-24T06:07:33.460Z] Static frontend server listening on port 3000; access log: /Users/dannier/Desktop/living/AICLW/wechatAiclaw/backend/data/logs/node-access.log
127.0.0.1 - - [24/Mar/2026:06:07:41 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36"
127.0.0.1 - - [24/Mar/2026:06:07:41 +0000] "GET /api/ws-status HTTP/1.1" 200 19 "http://localhost:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36"
127.0.0.1 - - [24/Mar/2026:06:07:43 +0000] "GET /auth/scan-status?key=HBQ0d1NFqpio HTTP/1.1" 200 500 "http://localhost:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36"

View File

@@ -387,6 +387,14 @@ class WakeUpRequest(BaseModel):
Proxy: Optional[str] = ""
class VerifyCodeRequest(BaseModel):
"""手机验证码验证:默认只需要 key + codedata62/ticket 优先从缓存补全。"""
key: str
code: str
data62: Optional[str] = ""
ticket: Optional[str] = ""
@app.middleware("http")
async def log_requests(request: Request, call_next):
logger.info("HTTP %s %s from %s", request.method, request.url.path, request.client.host if request.client else "-")
@@ -413,7 +421,42 @@ PROXY_CHECK_URL = os.getenv("PROXY_CHECK_URL", "https://httpbin.org/ip")
@app.get("/api/check-proxy")
async def api_check_proxy(proxy: Optional[str] = Query(None, description="可选,指定要检测的代理 URL不传则用环境变量/隧道/KDL")):
"""检测代理是否可用:用解析到的代理请求测试页,返回是否成功及来源"""
"""检测代理是否可用:返回连通状态、出口 IP若可解析与错误原因"""
def _extract_origin_ip(resp: httpx.Response) -> Optional[str]:
"""优先解析 httpbin /ip 的 origin 字段,解析失败返回 None。"""
try:
data = resp.json()
if isinstance(data, dict):
origin = (data.get("origin") or "").strip()
return origin or None
except Exception:
pass
return None
def _format_proxy_result(ok: bool, *, source: str, preview: str, status_code: Optional[int] = None,
origin_ip: Optional[str] = None, error: Optional[str] = None, note: Optional[str] = None) -> dict:
status = "available" if ok else "unavailable"
out = {
"ok": ok,
"status": status,
"source": source,
"proxy_preview": preview,
"check_url": PROXY_CHECK_URL,
}
if status_code is not None:
out["status_code"] = status_code
if origin_ip:
out["origin_ip"] = origin_ip
if note:
out["note"] = note
if error:
out["error"] = error
# 常见 socks 认证失败给出更可执行的提示
if "User was rejected by the SOCKS5 server" in error:
out["reason"] = "proxy_auth_rejected"
out["suggestion"] = "请检查代理用户名/密码、端口、以及代理服务商白名单配置"
return out
proxy_url = (proxy or "").strip()
source = "query"
if not proxy_url:
@@ -431,11 +474,12 @@ async def api_check_proxy(proxy: Optional[str] = Query(None, description="可选
if proxy_url:
logger.info("check-proxy: using env/body, len=%s", len(proxy_url))
if not proxy_url:
return {
"ok": False,
"source": "none",
"error": "未配置代理。请填写代理、或设置 HTTP_PROXY/HTTPS_PROXY、或配置 TUNNEL_PROXY固定隧道、或 KDL 代理 API。",
}
return _format_proxy_result(
False,
source="none",
preview="(empty)",
error="未配置代理。请填写代理、或设置 HTTP_PROXY/HTTPS_PROXY、或配置 TUNNEL_PROXY固定隧道、或 KDL 代理 API。",
)
# 脱敏显示(不暴露密码)
def _preview(u: str) -> str:
if not u or "@" not in u:
@@ -467,66 +511,42 @@ async def api_check_proxy(proxy: Optional[str] = Query(None, description="可选
async with httpx.AsyncClient(trust_env=False, timeout=15.0, transport=transport) as client:
resp = await client.get(PROXY_CHECK_URL)
if resp.status_code == 200:
origin_ip = _extract_origin_ip(resp)
logger.info("check-proxy: ok (socks), status=%s", resp.status_code)
return {
"ok": True,
"source": source,
"proxy_preview": preview,
"check_url": PROXY_CHECK_URL,
"status_code": resp.status_code,
}
return _format_proxy_result(
True, source=source, preview=preview, status_code=resp.status_code, origin_ip=origin_ip
)
logger.warning("check-proxy: fail (socks), status=%s", resp.status_code)
return {
"ok": False,
"source": source,
"proxy_preview": preview,
"error": f"请求测试页返回 {resp.status_code}",
"status_code": resp.status_code,
}
return _format_proxy_result(
False, source=source, preview=preview, status_code=resp.status_code,
error=f"请求测试页返回 {resp.status_code}"
)
except ImportError:
logger.info("check-proxy: socks5 已配置,跳过连通性检测(需 pip install httpx-socks 方可检测)")
return {
"ok": True,
"source": source,
"proxy_preview": preview,
"note": "socks5 代理已配置;连通性检测需安装 pip install httpx-socks",
}
return _format_proxy_result(
True, source=source, preview=preview,
note="socks5 代理已配置;连通性检测需安装 pip install httpx-socks"
)
except Exception as e:
logger.warning("check-proxy: socks exception %s", e)
return {
"ok": False,
"source": source,
"proxy_preview": preview,
"error": str(e),
}
return _format_proxy_result(False, source=source, preview=preview, error=str(e))
try:
async with httpx.AsyncClient(trust_env=False, timeout=15.0, proxy=proxy_url) as client:
resp = await client.get(PROXY_CHECK_URL)
if resp.status_code == 200:
origin_ip = _extract_origin_ip(resp)
logger.info("check-proxy: ok, status=%s", resp.status_code)
return {
"ok": True,
"source": source,
"proxy_preview": preview,
"check_url": PROXY_CHECK_URL,
"status_code": resp.status_code,
}
return _format_proxy_result(
True, source=source, preview=preview, status_code=resp.status_code, origin_ip=origin_ip
)
logger.warning("check-proxy: fail, status=%s", resp.status_code)
return {
"ok": False,
"source": source,
"proxy_preview": preview,
"error": f"请求测试页返回 {resp.status_code}",
"status_code": resp.status_code,
}
return _format_proxy_result(
False, source=source, preview=preview, status_code=resp.status_code,
error=f"请求测试页返回 {resp.status_code}"
)
except Exception as e:
logger.warning("check-proxy: exception %s", e)
return {
"ok": False,
"source": source,
"proxy_preview": preview,
"error": str(e),
}
return _format_proxy_result(False, source=source, preview=preview, error=str(e))
def _proxy_from_env() -> str:
@@ -627,7 +647,7 @@ def _proxy_preview_for_log(proxy: str) -> str:
def _normalize_proxy_scheme_to_socks5h(proxy: str) -> str:
"""若代理是隧道地址但用了 http改为 socks5h7006 需 socks5"""
"""若代理是隧道地址但用了 http改为 socks5h7006 需 socks5h)。"""
if not proxy or not isinstance(proxy, str):
return proxy
p = proxy.strip()
@@ -942,6 +962,12 @@ async def check_scan_status(
data62 = (stored.get("data62") or "").strip()
if not data62:
data62 = (data.get("Data62") or (data.get("Data") or {}).get("Data62") or (data.get("Data") or {}).get("data62") or "").strip()
# 缓存 ticket 与 data62供 /auth/verify-code 直接使用(前端只填验证码即可)
qrcode_store[key] = {
**stored,
"ticket": ticket,
"data62": data62,
}
params = {"key": SLIDER_VERIFY_KEY, "ticket": ticket}
if data62:
params["data62"] = data62
@@ -955,6 +981,62 @@ async def check_scan_status(
return data
@app.post("/auth/verify-code")
async def verify_login_code(body: VerifyCodeRequest):
"""
手机验证码验证(本地入口):
- 前端只传 key + code
- data62/ticket 优先从缓存补全;
- 转发到 7006: POST /login/VerifyCode?key=...
"""
key = (body.key or "").strip()
code = (body.code or "").strip()
if not key:
raise HTTPException(status_code=400, detail="key is required")
if not code:
raise HTTPException(status_code=400, detail="code is required")
stored = qrcode_store.get(key) or {}
data62 = (body.data62 or "").strip() or (stored.get("data62") or "").strip()
ticket = (body.ticket or "").strip() or (stored.get("ticket") or "").strip()
if not data62 or not ticket:
raise HTTPException(
status_code=400,
detail="missing data62 or ticket; please get qrcode and check scan status first",
)
payload = {
"code": code,
"data62": data62,
"ticket": ticket,
}
url = f"{CHECK_STATUS_BASE_URL.rstrip('/')}/login/VerifyCode"
logger.info("VerifyCode: key=%s, url=%s, code_len=%s, data62_len=%s, ticket_len=%s",
key, url, len(code), len(data62), len(ticket))
try:
async with httpx.AsyncClient(trust_env=False, timeout=20.0) as client:
resp = await client.post(url, params={"key": key}, json=payload)
except Exception as exc:
logger.exception("Error calling upstream VerifyCode: %s", exc)
raise HTTPException(status_code=502, detail=f"upstream_error: {exc}") from exc
body_text = resp.text[:500]
logger.info("Upstream VerifyCode response: status=%s, body=%s", resp.status_code, body_text)
if resp.status_code >= 400:
raise HTTPException(
status_code=502,
detail={
"error": "upstream_bad_response",
"status_code": resp.status_code,
"body": body_text,
},
)
try:
return resp.json()
except Exception:
return {"ok": True, "text": body_text}
def _slider_form_html(key_val: str, data62_val: str, ticket_val: str) -> str:
"""本地滑块验证页:与 7765 相同 DOM 结构(#app、keyInput、data62Input、originalTicketInput加载 7765 的 module 脚本,不用 iframe。"""
k = html.escape(key_val, quote=True)

View File

@@ -544,10 +544,10 @@
/>
</div>
<div class="field">
<label for="proxy">代理(可选,不填则由后端自动读取</label>
<label for="proxy">代理(可选,仅支持带用户名密码的 socks5h</label>
<input
id="proxy"
placeholder="socks5://ip:port 或 socks5://user:pass@ip:port"
placeholder="socks5h://user:pass@ip:port"
autocomplete="off"
/>
<button type="button" class="secondary" id="btn-check-proxy" style="margin-top: 6px; padding: 4px 10px; font-size: 12px;">检测代理是否正常</button>
@@ -560,6 +560,14 @@
<option value="mac">Mac</option>
</select>
</div>
<div class="field">
<label for="verify-code">手机验证码(收到后填写)</label>
<input
id="verify-code"
placeholder="例如123456"
autocomplete="off"
/>
</div>
</div>
<div class="actions">
@@ -578,6 +586,9 @@
<button class="secondary" id="btn-online">
获取在线状态
</button>
<button class="secondary" id="btn-verify-code">
验证验证码
</button>
<button class="danger" id="btn-logout">
退出当前账号
</button>
@@ -738,7 +749,8 @@
async function checkHealth() {
try {
const res = await fetch('/health', { cache: 'no-store' });
// 通过 /api/ws-status 检测后端是否可用(同时避免某些部署环境未透出 /health
const res = await fetch('/api/ws-status', { cache: 'no-store' });
if (!res.ok) throw new Error('status ' + res.status);
const data = await res.json().catch(() => ({}));
$('health-dot').style.background = '#22c55e';
@@ -759,6 +771,8 @@
if (btnWake) btnWake.disabled = loading;
$('btn-check-scan').disabled = loading;
$('btn-online').disabled = loading;
var btnVerifyCode = $('btn-verify-code');
if (btnVerifyCode) btnVerifyCode.disabled = loading;
$('btn-logout').disabled = loading;
}
@@ -1036,9 +1050,14 @@
try {
var data = await callApi(url);
if (data && data.ok) {
log('代理正常。来源: ' + (data.source || '') + (data.proxy_preview ? '代理: ' + data.proxy_preview : ''), 'ok');
var msg = '代理可用。状态: ' + (data.status || 'available') + '来源: ' + (data.source || '');
if (data.origin_ip) msg += '出口IP: ' + data.origin_ip;
if (data.proxy_preview) msg += ',代理: ' + data.proxy_preview;
log(msg, 'ok');
} else {
log('代理不可用: ' + (data && data.error ? data.error : JSON.stringify(data)), 'error');
var err = data && data.error ? data.error : JSON.stringify(data);
var detail = data && data.reason ? (',原因: ' + data.reason) : '';
log('代理不可用: ' + err + detail, 'error');
}
} catch (e) {
log('检测代理失败: ' + (e.message || e), 'error');
@@ -1206,6 +1225,34 @@
}
}
async function onVerifyCode() {
const payload = getCommonPayload();
if (!payload) return;
const code = (($('verify-code') && $('verify-code').value) || '').trim();
if (!code) {
alert('请先填写手机上的验证码');
return;
}
setLoading(true);
try {
log('正在提交验证码验证...');
const data = await callApi('/auth/verify-code', {
method: 'POST',
body: JSON.stringify({
key: payload.key,
code,
}),
});
log('验证码验证结果: ' + JSON.stringify(data), 'ok');
updateLoginState('验证码已提交', 'pending', '请稍后点击「获取在线状态」确认是否已登录');
} catch (e) {
log('验证码验证失败: ' + (e.message || e), 'error');
updateLoginState('验证码验证失败', 'offline', e.message || '');
} finally {
setLoading(false);
}
}
async function onLogout() {
const payload = getCommonPayload();
if (!payload) return;
@@ -1261,6 +1308,10 @@
e.preventDefault();
onGetOnlineStatus();
});
$('btn-verify-code') && $('btn-verify-code').addEventListener('click', (e) => {
e.preventDefault();
onVerifyCode();
});
$('btn-logout').addEventListener('click', (e) => {
e.preventDefault();
onLogout();

View File

@@ -0,0 +1,221 @@
# 微信自动化平台功能执行文档(报价方案配套)
## 1. 文档目的与使用范围
本文件用于把 `方案.md` 中的报价与功能,转成可落地执行标准,供以下角色统一口径:
- 销售:明确可卖范围与升级边界
- 交付:按清单开通与验收
- 客服:按功能范围答复客户
- 财务:按计费触发点核算费用
执行原则:
- 以本文件“包含/不包含”清单为准
- 未列明功能默认不包含
- 白标/OEM以单独商务合同为准
---
## 2. 版本与授权执行规则
## 2.1 版本定义
- 初级版:`300元/月 + 3000授权`
- 高级版:`600元/月 + 5000授权`
- 定制版:`1200元/月 + 10000授权`
- 白标/OEM`3000~20000元/月 + 50000起授权 + 分成`
## 2.2 开通前检查
- 客户主体信息(公司/个人)是否完整
- 授权版本是否与销售合同一致
- 账号数量、终端用户规模是否在版本范围内
- 是否存在对外收费场景(如有,必须检查授权等级)
## 2.3 开通动作(通用)
1. 创建客户档案与合同号
2. 绑定授权与版本
3. 配置账号数上限、月额度上限
4. 开启对应功能白名单
5. 输出开通确认单(给客户签收)
---
## 3. 功能分版本执行清单
## 3.1 初级版执行清单
### A. 必开功能
- 登录基础:扫码登录、登录二维码、登录状态、在线状态、退出登录
- 消息基础:发送文本/图片/语音HTTP轮询同步
- 好友基础:搜索联系人、同意好友、添加好友、联系人列表、联系人详情
- 群基础:创建群、邀请成员、群详情、群成员详情、群二维码、设置群名称、退出群
- 用户基础:获取资料、二维码、修改昵称/签名/备注
- 标签基础:新增/删除/修改、标签列表
- 朋友圈基础:发布朋友圈、点赞评论、朋友圈同步、朋友圈主页
- 设备基础:在线设备信息、安全设备列表
### B. 禁开功能(必须关闭)
- 群发文本、群发图片
- 历史消息同步、消息管理器
- 转发图片/视频/表情、撤回消息
- 支付全量能力
- 公众号/小程序能力
- 收藏能力、视频号能力
- 企业微信能力、授权码管理能力、微信小店能力
- WebSocket消息同步
### C. 验收标准
- 能完成登录并持续保持在线状态
- 可完成至少1次文本、图片、语音发送
- 可完成至少1次好友添加与群创建
- 可完成至少1次朋友圈发布
---
## 3.2 高级版执行清单
### A. 必开功能(在初级版基础上新增)
- 消息增强:群发文本、群发图片、历史消息同步、消息管理器、转发图片/视频/表情、撤回消息、语音/视频/高清图片下载、视频上传、图片上传CDN
- 朋友圈增强:上传朋友圈图片、指定用户朋友圈、朋友圈详情、设置背景图、设置可见天数
- 好友/用户增强:删除好友、好友关系查询、上传手机通讯录、通讯录好友、关键词自动回复、欢迎词、邀请入群关键词、踢人关键词、管理员关键词、上传头像
- 群增强:添加成员、设置群公告、设置群内昵称、同意入群
- 支付:创建转账、确认转账、收款确认、收款二维码、创建红包、拆红包、红包详情、红包领取列表、银行卡列表
- 公众号/小程序:公众号授权、关注公众号、授权链接、历史消息、文章阅读/点赞/阅读数、小程序授权、云函数操作、二维码授权请求与确认
- 收藏:同步、列表、详情、批量删除
- 视频号:扫码登录、搜索、关注/取消、视频号中心
- WebSocket同步通道
- 其他工具:上传文件、缓存消息读取、附近的人、步数修改、指令状态更新
### B. 禁开功能(仍关闭)
- 企业微信能力
- 授权码管理能力
- 微信小店能力
### C. 验收标准
- 群发文本与图片各完成1次
- 支付链路至少完成1个闭环动作转账或收款
- 公众号/小程序至少完成1次授权或内容操作
- WebSocket同步稳定接收消息
---
## 3.3 定制版执行清单
### A. 必开功能(在高级版基础上新增)
- 企业微信:同意进群、建群、删群、拉人、移除成员、管理员增删、群公告、群二维码、群转让、成员查询、群信息查询、通讯录同步、企业群同步、联系人检索与备注
- 管理(授权码):生成、禁用、删除、延期、激活查询、状态同步、代理映射查询
- 微信小店:登录确认、扫码事件上报、小店扩展设备登录确认流程
- 登录增强:验证码验证、滑块验证、代理设置下登录
- 用户增强:设置代理、修改加好友验证属性、设置拍一拍、设置微信号、设置性别
- 其他增强:企微图片下载、硬件设备绑定信息、删除安全设备
### B. 验收标准
- 企业微信至少完成1个“建群 + 拉人 + 群信息查询”闭环
- 管理能力至少完成1个授权码生命周期生成到状态查询
- 微信小店完成登录确认流程
- 验证码/滑块流程可通过并成功登录
---
## 3.4 白标/OEM执行清单
### A. 前置条件
- 已签白标/OEM合同
- 已明确商业授权范围与分成口径
- 已明确对外服务边界与违约条款
### B. 交付内容
- 定制版全部功能开通
- 按合同开通商业授权能力
- 按合同配置授权码分配规则
### C. 验收标准
- 合同约定能力逐项验收通过
- 对账与分成报表口径确认
---
## 4. 额度与计费执行规则
## 4.1 套餐内额度
- 初级版消息5万/月群发0次/月加好友200次/月朋友圈200次/月活跃终端用户100
- 高级版消息28万/月群发1500次/月加好友3000次/月朋友圈1200次/月活跃终端用户300
- 定制版消息68万/月群发5000次/月加好友10000次/月朋友圈5000次/月活跃终端用户1000
## 4.2 超量计费
- 消息调用0.005 ~ 0.02 元/次
- 群发任务0.03 ~ 0.08 元/次
- 加好友动作0.05 ~ 0.20 元/次
- 朋友圈动作0.02 ~ 0.06 元/次
- 企业微信动作0.05 ~ 0.30 元/次
执行要求:
- 使用量达到套餐额度80%时自动预警
- 超额后自动按单价计费,不中断基础服务
## 4.3 活跃终端用户口径
- 定义自然月内发生至少1次成功业务调用的去重终端用户数
- 去重主键:`end_user_id`或合同约定唯一ID
- 不计入:失败调用、平台内部测试账号(合同另有约定除外)
- 超过100后1元/人/月(按合同版本执行)
---
## 5. 升级触发与销售移交规则
## 5.1 初级 -> 高级 触发条件
- 客户提出群发需求
- 客户提出支付相关需求
- 客户提出公众号/小程序/视频号需求
- 客户月用量达到初级额度80%以上
## 5.2 高级 -> 定制 触发条件
- 客户提出企业微信能力需求
- 客户提出授权码管理与多主体分发需求
- 客户提出小店流程能力需求
## 5.3 定制 -> 白标/OEM 触发条件
- 客户存在明确对外收费业务
- 客户要求独立商业授权与条款
---
## 6. 风险控制与争议处理
- 功能争议:以本文件“包含/禁开”清单为准
- 计费争议:以平台月度用量报表与合同口径为准
- 授权争议:以授权等级与合同主体绑定关系为准
- 违规转售:按合同暂停服务并追偿
---
## 7. 联系方式(执行沟通)
- 公司名称XXX科技有限公司
- 联系人XXX商务负责人
- 联系电话13XXXXXXXXX
- 微信号XXXXX
- 邮箱business@xxxx.com
---

View File

@@ -0,0 +1,845 @@
# 后端管理平台需求说明(仅订阅模块)
## 1. 范围
本期只做订阅模块,不考虑白标/OEM不做合同/财务系统。
包含:
- 用户管理(后台)
- 套餐管理
- 订阅开通、升级、续费、到期失效
- Token发放与吊销
- 额度校验与月用量统计
- 线下收款或第三方支付链接确认
不包含:
- 白标/OEM
- 分成系统
- 合同审批流
- 发票与财务对账系统
---
## 2. 角色
- 超级管理员:配置套餐、处理升级、强制开通/停用
- 运营创建用户、确认支付、开通订阅、发放Token
---
## 3. 数据模型(最小集)
## 3.1 用户表 `users`
- `id`
- `name`
- `mobile`
- `email`
- `company_name`
- `status`active/disabled
- `created_at`
- `updated_at`
## 3.2 套餐表 `plans`
- `id`
- `plan_code`starter/pro/enterprise
- `plan_name`
- `monthly_price`
- `auth_fee`
- `account_limit`
- `active_user_limit`
- `msg_quota`
- `mass_quota`
- `friend_quota`
- `sns_quota`
- `enabled_features`json具体功能点
- `status`active/inactive
- `created_at`
- `updated_at`
## 3.3 订阅表 `subscriptions`
- `id`
- `user_id`
- `plan_id`
- `status`pending/active/expired/cancelled
- `start_time`
- `end_time`
- `renew_mode`manual/auto
- `payment_channel`offline/pay_link
- `payment_ref`(线下流水号或第三方订单号)
- `created_at`
- `updated_at`
## 3.4 Token表 `api_tokens`
- `id`
- `user_id`
- `token_name`
- `token_hash`(仅存哈希)
- `status`active/revoked/expired
- `expire_at`
- `last_used_at`
- `created_at`
- `updated_at`
## 3.5 月用量表 `usage_monthly`
- `id`
- `user_id`
- `plan_id`
- `stat_month`YYYY-MM
- `msg_count`
- `mass_count`
- `friend_count`
- `sns_count`
- `active_user_count`
- `updated_at`
---
## 4. 核心流程
## 4.1 开通流程
1. 运营创建用户
2. 选择套餐
3. 记录支付方式(线下/支付链接)
4. 支付确认后创建订阅(`active`
5. 生成Token并展示一次明文
## 4.2 升级流程
1. 选择新套餐
2. 确认补差支付
3. 更新订阅的 `plan_id` 与生效时间
4. 新套餐额度立即生效或次月生效(可配置)
## 4.3 续费流程
1. 到期前提醒D-7/D-3/D-1
2. 支付确认后延长 `end_time`
3. 超期未续费则置为 `expired`
4. `expired` 状态禁止业务调用
## 4.4 Token鉴权流程每次请求
1. 校验Token是否存在、是否过期、是否吊销
2. 查询用户是否有 `active` 订阅
3. 校验功能是否在 `enabled_features`
4. 校验本月用量是否超套餐额度
5. 通过则放行,失败返回明确错误码
---
## 5. 功能需求
## 5.1 用户管理
- 新增/编辑/禁用用户
- 查询用户当前订阅状态
- 查询用户Token列表
## 5.2 套餐管理
- 新增/编辑套餐
- 配置套餐价格、额度、功能点
- 套餐上下线
## 5.3 订阅管理
- 开通订阅
- 升级订阅
- 续费订阅
- 手动取消订阅
- 到期自动失效任务
## 5.4 Token管理
- 创建Token只显示一次明文
- 吊销Token
- 设置Token有效期
- 查询最后使用时间
## 5.5 支付确认(轻量)
- 线下收款:运营手动确认并录入 `payment_ref`
- 支付链接:接收第三方回调后确认支付并开通
---
## 6. 错误码(建议)
- `TOKEN_INVALID`Token不存在
- `TOKEN_EXPIRED`Token已过期
- `TOKEN_REVOKED`Token已吊销
- `SUBSCRIPTION_INACTIVE`:无有效订阅
- `FEATURE_NOT_ALLOWED`:功能不在套餐内
- `QUOTA_EXCEEDED`:本月额度已用尽
---
## 7. 管理端APIMVP
## 7.1 用户
- `POST /admin/users`
- `GET /admin/users`
- `GET /admin/users/{id}`
- `PUT /admin/users/{id}`
- `POST /admin/users/{id}/disable`
## 7.2 套餐
- `POST /admin/plans`
- `GET /admin/plans`
- `PUT /admin/plans/{id}`
- `POST /admin/plans/{id}/toggle`
## 7.3 订阅
- `POST /admin/subscriptions/open`
- `POST /admin/subscriptions/upgrade`
- `POST /admin/subscriptions/renew`
- `POST /admin/subscriptions/cancel`
- `GET /admin/subscriptions/{user_id}`
## 7.4 Token
- `POST /admin/tokens`
- `GET /admin/tokens?user_id=`
- `POST /admin/tokens/{id}/revoke`
## 7.5 支付确认
- `POST /admin/payments/confirm-offline`
- `POST /admin/payments/confirm-link`
---
## 8. 定时任务
- 订阅到期扫描每天00:10执行更新 `expired` 状态
- 用量月结归档每月1日00:30执行
- 续费提醒任务每天09:00执行
---
## 9. 验收标准
- 可完成用户创建 -> 支付确认 -> 订阅开通 -> Token发放闭环
- 可完成升级与续费并正确生效
- 到期后能自动失效并阻断调用
- 功能与额度限制生效,错误码准确
- 支付链接回调或线下确认都可触发开通
---
## 10. 开发优先级
P0
- 用户管理
- 套餐管理
- 订阅开通/升级/续费/失效
- Token管理与鉴权
P1
- 支付回调确认
- 用量统计与额度限制
- 到期提醒
---
# 后端管理平台需求说明(轻量核心版)
## 1. 目标
搭建最小可用后台,只做四件事:
- 用户管理
- Token管理
- 套餐管理
- 开通/升级流程管理
不做V1不开发
- 合同管理
- 财务系统集成
- 分成系统
- 复杂风控引擎
收费方式:
- 线下打款或在线支付链接(第三方支付页面)
- 支付成功后由后台手动或回调触发开通
---
## 2. 核心角色
- 超管:全局配置、套餐配置、手动开通
- 运营用户资料维护、Token发放、套餐变更
- 客户可选后续仅查看自己的Token和套餐状态
---
## 3. 核心数据模型
## 3.1 用户
`users`
- id
- name
- mobile
- email
- company_name
- statusactive / disabled
- created_at
- updated_at
## 3.2 套餐
`plans`
- id
- plan_codestarter/pro/enterprise
- plan_name
- monthly_price
- auth_fee
- account_limit
- active_user_limit
- msg_quota
- mass_quota
- friend_quota
- sns_quota
- enabled_featuresjson数组存具体功能点
- statusactive / inactive
- created_at
- updated_at
## 3.3 用户套餐实例
`user_subscriptions`
- id
- user_id
- plan_id
- start_time
- end_time
- statuspending/active/expired/cancelled
- payment_channeloffline / pay_link
- payment_ref线下流水号或第三方订单号
- created_at
- updated_at
## 3.4 Token
`api_tokens`
- id
- user_id
- token_name
- token_hash仅存哈希
- statusactive/revoked/expired
- plan_id冗余便于鉴权
- expire_at
- last_used_at
- created_at
- updated_at
## 3.5 用量(按月聚合)
`usage_monthly`
- id
- user_id
- plan_id
- stat_monthYYYY-MM
- msg_count
- mass_count
- friend_count
- sns_count
- active_user_count
- updated_at
---
## 4. 功能需求MVP
## 4.1 用户管理
- 新增/编辑/禁用用户
- 查看用户当前套餐、到期时间、Token数量
- 用户搜索(手机号、公司名、状态)
## 4.2 套餐管理
- 新增/编辑套餐
- 配置套餐额度和功能点
- 套餐上下线active/inactive
- 查看套餐被多少用户使用
## 4.3 Token管理
- 为用户创建Token仅展示一次明文
- Token吊销revoke
- Token过期时间设置
- Token使用记录查看最后使用时间
鉴权规则(核心):
- 请求带Token
- 校验Token状态与是否过期
- 读取用户当前有效套餐
- 判断功能是否在套餐内
- 判断当月额度是否超限
## 4.4 开通与升级流程
### 开通流程
1. 创建用户
2. 选择套餐
3. 记录支付方式(线下/支付链接)
4. 支付成功后开通订阅
5. 生成Token并交付客户
### 升级流程
1. 选择新套餐
2. 记录补差支付
3. 生效新套餐(立即或次月)
4. Token权限自动按新套餐生效
### 续费流程
1. 到期前提醒D-7、D-3、D-1
2. 支付成功后延长套餐周期
3. 未支付则到期失效Token权限受限
---
## 5. 支付与开通方式(轻量)
支持两种方式:
- `offline`:线下收款,后台手动录入流水号后开通
- `pay_link`:调用第三方支付链接,回调成功后自动开通(或运营手动确认)
V1要求
- 只保存支付结果与订单号
- 不做复杂账单系统
---
## 6. 最小风控与安全
- Token只存哈希不存明文
- 超管/运营所有关键操作写审计日志
- 单用户默认Token数量上限如5个
- 支持一键吊销全部Token
- 超额度后返回明确错误码(不做复杂策略引擎)
---
## 7. 接口清单(管理端)
## 7.1 用户
- `POST /admin/users` 创建用户
- `GET /admin/users` 用户列表
- `GET /admin/users/{id}` 用户详情
- `PUT /admin/users/{id}` 更新用户
- `POST /admin/users/{id}/disable` 禁用用户
## 7.2 套餐
- `POST /admin/plans` 创建套餐
- `GET /admin/plans` 套餐列表
- `PUT /admin/plans/{id}` 更新套餐
- `POST /admin/plans/{id}/toggle` 上下线套餐
## 7.3 订阅
- `POST /admin/subscriptions/open` 开通套餐
- `POST /admin/subscriptions/upgrade` 升级套餐
- `POST /admin/subscriptions/renew` 续费套餐
- `GET /admin/subscriptions/{user_id}` 查询用户订阅
## 7.4 Token
- `POST /admin/tokens` 创建Token
- `GET /admin/tokens?user_id=` Token列表
- `POST /admin/tokens/{id}/revoke` 吊销Token
## 7.5 支付记录
- `POST /admin/payments/confirm-offline` 线下收款确认
- `POST /admin/payments/confirm-link` 支付链接回调确认
---
## 8. 验收标准(上线即用)
- 可创建用户并成功开通任一套餐
- 可生成Token并用Token通过鉴权
- 套餐功能和额度能正确限制请求
- 可完成升级、续费、到期失效流程
- 支付成功后可触发开通(手动或回调)
---
## 9. 开发优先级与周期建议
P0第1周
- 用户管理
- 套餐管理
- 订阅开通
- Token创建与鉴权
P1第2周
- 升级/续费流程
- 线下支付确认与支付链接回调
- 月用量聚合与额度限制
P2第3周
- 到期提醒
- 审计日志页面
- 基础运营看板
---
# 微信自动化平台后端管理需求说明V1
## 1. 目标与范围
建设一套后端管理平台,支撑 `方案.md``功能执行文档-报价方案配套.md` 的落地执行,覆盖:
- 客户开通与版本管理
- 功能开关与白名单控制
- 额度管理与超量计费
- 授权码生命周期管理
- 账单、对账、分成结算
- 风险控制与违规处置
不在V1范围
- 客户前台门户(仅后台运营端)
- 财务开票系统深度集成(先导出报表)
---
## 2. 角色与权限
## 2.1 角色
- 超级管理员:全局配置、价格策略、风控策略
- 商务运营:客户开通、版本变更、合同与授权
- 交付运营:功能开关、额度配置、验收记录
- 财务:账单确认、对账、分成结算
- 风控:告警处理、停用/解封、违规记录
## 2.2 权限原则
- 最小权限原则
- 核心动作(停服、改价、授权升级)需二次确认与审计日志
- 所有配置变更可追溯(操作者、时间、变更前后)
---
## 3. 核心业务对象(数据模型)
## 3.1 客户与合同
- `customer`:客户主体信息(公司/个人、联系人、状态)
- `contract`:合同编号、版本、期限、签约类型、分成比例、补充条款
- `service_instance`:客户服务实例(当前版本、生效时间、到期时间)
## 3.2 版本与功能
- `plan`:初级/高级/定制/白标
- `feature_catalog`:功能目录(按具体功能点,不按抽象模块)
- `plan_feature_map`:版本与功能映射(是否默认开通)
- `feature_switch`:客户级功能开关(开/关、原因、操作者)
## 3.3 额度与计费
- `quota_policy`:版本默认额度(消息、群发、加好友、朋友圈、企业微信)
- `customer_quota`:客户当前额度(可覆盖默认值)
- `usage_daily` / `usage_monthly`:按客户、按计费项聚合用量
- `price_policy`:单价策略(默认价、阶梯价、生效时间)
- `billing_statement`:月账单(固定费、超量费、人头费、分成)
## 3.4 授权与风控
- `license_key`:授权码及状态(生成、激活、禁用、延期、删除)
- `risk_rule`:风控规则(阈值、频率、异常模式)
- `risk_event`:风险事件记录(级别、动作、处理结果)
- `penalty_action`:处罚动作(限流、降级、停服、解封)
---
## 4. 功能模块需求
## 4.1 客户开通中心
功能点:
- 创建客户档案
- 绑定合同与版本
- 设置账号上限、活跃终端用户上限
- 初始化功能开关与额度
- 生成开通确认单
校验规则:
- 无合同不得开通付费版本
- 开通版本必须匹配授权级别
- 对外收费客户必须配置分成策略
---
## 4.2 版本与功能管理
功能点:
- 维护版本基础配置(初级/高级/定制/白标)
- 维护“具体功能点”目录与分组
- 一键应用版本默认功能到客户
- 客户级功能差异化调整(例外开关)
关键要求:
- 必须支持“包含/禁开”双清单导出(用于交付验收)
- 功能变更需记录变更单号与审批人
---
## 4.3 额度与限流管理
功能点:
- 配置套餐默认额度
- 按客户调整额度
- 配置阈值告警80%、100%、120%
- 配置超额后策略(仅计费 / 限流 / 禁止高风险动作)
关键要求:
- 日级、月级双维度统计
- 支持手动补偿额度(需审计)
---
## 4.4 计费与账单中心
功能点:
- 固定费用:月费 + 授权费
- 用量费用:按计费项单价计算
- 用户规模费用超过100后按1元/人/月(可配置)
- 分成费用:按合同分成比例计算
- 生成月账单、账单确认、导出对账单
计算规则V1
- 月账单金额 = 固定费 + 超量费 + 人头费 + 分成费
- 人头费基数 = max(活跃终端用户-100, 0)
- 活跃终端用户按唯一ID月去重
---
## 4.5 授权码管理
功能点:
- 生成授权码(不同有效期)
- 激活状态查询
- 禁用、删除、延期
- 授权状态同步任务
关键要求:
- 授权码与客户主体绑定
- 禁用后相关能力按策略自动降级/停用
---
## 4.6 分成与结算管理
功能点:
- 设置客户分成比例10%/15%/20%或合同自定义)
- 录入/同步客户营收数据
- 自动计算应结分成
- 月度结算单导出
关键要求:
- 分成口径可配置(净营收/归因营收)
- 允许人工复核后确认入账
---
## 4.7 风控与违规处置
功能点:
- 风控规则配置(频率阈值、异常行为模式)
- 告警中心(低/中/高风险)
- 自动处罚策略(限流、冻结高风险功能、停服)
- 违规记录与解封流程
关键要求:
- 处罚动作必须可回溯
- 高风险停服需双人审批(可配置)
---
## 4.8 审计与操作日志
必须记录:
- 谁在何时改了什么
- 改前值/改后值
- 操作来源(后台/任务/接口)
- 关联客户、合同、账单编号
---
## 5. 核心流程(状态机)
## 5.1 客户生命周期
- `待签约 -> 已签约 -> 待开通 -> 已开通 -> 运行中 -> 欠费限制 -> 暂停服务 -> 终止`
## 5.2 版本变更流程
- 提交升级/降级申请 -> 商务审批 -> 配置预览 -> 生效执行 -> 通知客户 -> 留档
## 5.3 月结流程
- 月末汇总用量 -> 生成预账单 -> 财务复核 -> 账单确认 -> 推送客户 -> 回款核销
---
## 6. 配置字典(建议)
## 6.1 计费项编码
- `MSG_CALL`:消息调用
- `MASS_TASK`:群发任务
- `ADD_FRIEND`:加好友动作
- `SNS_ACTION`:朋友圈动作
- `QY_ACTION`:企业微信动作
- `ACTIVE_USER`:活跃终端用户
## 6.2 风险等级
- `LOW`:告警
- `MEDIUM`:限流或冻结部分能力
- `HIGH`:停服并人工复核
---
## 7. 报表与看板需求
## 7.1 运营看板
- 在服客户数(按版本)
- 当月升级/降级数量
- 功能开关变更次数
- 告警事件数量
## 7.2 财务看板
- MRR、ARR
- 超量收入占比
- 人头费收入占比
- 分成收入占比
- 回款率与逾期率
## 7.3 客户视图
- 客户当前版本与到期时间
- 功能已开通清单
- 本月额度、已用量、超量预估
- 本月预估账单
---
## 8. 非功能性要求
- 可用性:后台可用性 >= 99.9%
- 审计性关键操作100%留痕
- 安全性:权限隔离、敏感操作二次确认
- 性能日汇总任务在60分钟内完成
---
## 9. MVP开发优先级
P0必须
- 客户开通中心
- 版本/功能开关管理
- 额度管理
- 用量统计
- 账单生成
- 授权码管理
- 审计日志
P1次优先
- 分成结算
- 风控自动处置
- 看板与报表
P2后续
- 工作流审批引擎
- 财务系统对接
- 客户自助门户
---
## 10. 验收标准
## 10.1 功能验收
- 能按客户版本一键开通并生效
- 能对单客户进行功能级开关控制
- 能正确统计月用量并生成账单
- 能处理授权码生成、禁用、延期、查询
## 10.2 计费验收
- 对同一客户可复算账单结果误差为0
- 活跃终端用户去重规则正确
- 超量计费与阶梯价计算正确
## 10.3 风控验收
- 触发阈值后自动生成告警
- 可执行限流/停服动作并记录日志
---
## 11. 建议交付物
- 后台原型图(客户、版本、计费、风控四大页面)
- 数据库DDL初稿
- 后台API清单管理端
- 月账单计算任务说明
- 上线回滚预案
---

View File

@@ -0,0 +1,370 @@
# 基于微信生态自动化API平台商业化 + 营销 + 销售执行方案
## 1. 产品与商业模式
### 1.1 产品本质定位
本产品不是“接口集合”,而是三位一体的商业系统:
- 微信自动化操作系统:降低人工运营成本,标准化私域触达动作
- 私域运营引擎:把粉丝、好友、社群、内容、支付打通成可复用流程
- 商业变现工具:让客户从“能用”走向“能赚钱”,并让平台可持续抽成
一句话定位:
> 为私域增长团队提供“可规模化、可审计、可商业化”的微信自动化基础设施。
### 1.2 核心卖点(客户愿意付费的原因)
- 提效:把高频重复动作自动化,降低人工与培训成本
- 增长:提升触达频次、转化链路完整度、复购效率
- 可控:多账号、多人员、多场景统一管理,风险动作可追踪
- 变现支持客户自建服务能力代运营、SaaS转售、行业方案
- 可扩展:支持企业微信/公众号/小程序协同,满足中大型客户升级需求
### 1.3 商业模式组合
采用“4层商业模式并行”避免单一订阅天花板
- SaaS订阅标准套餐快速成交现金流基础
- API按量高使用客户自动增收随业务规模增长
- 平台化授权:给工作室/集成商/渠道做二次服务(规模放大器)
- 白标/OEM为高价值客户提供独立品牌能力高毛利项目
### 1.4 收入来源设计(多维)
- 月费订阅收入300/600/1200分层
- 一次性授权费3000/5000/10000/50000
- 按量调用收入:消息、加好友、群发、朋友圈等超额计费
- 用户规模收入超过100终端用户后按人头收费
- 分成收入客户使用平台赚钱时抽成10%~20%
- 服务收入:实施费、培训费、策略代运营、私有化部署服务包
---
## 2. 客户分层
### 2.1 个人用户(个体经营者/微商/私域操盘手)
- 典型需求:自动回复、群发、朋友圈维护、基础拉新
- 使用方式:单账号或少量账号,偏模板化流程
- 付费能力低到中300~600/月可接受)
- 风险:中等,可能共享账号给他人,存在灰度转售行为
- 策略:标准化交付 + 严格额度限制 + 低门槛升级通道
### 2.2 工作室(代运营团队/本地服务商)
- 典型需求:多客户多账号管理、批量任务、报表、团队协作
- 使用方式:同一团队操作多个客户项目,追求效率工具化
- 付费能力600~1200/月 + 按量)
- 风险:高,天然有转售动机(给下游客户打包售卖)
- 策略:将其纳入授权分销体系,允许“合规转售”,禁止私下倒卖
### 2.3 企业客户(品牌方/连锁/教育/本地生活)
- 典型需求:私域增长标准化、客服与销售协同、合规管理
- 使用方式跨部门协作关注稳定性、安全、服务SLA
- 付费能力中高1200/月起 + 授权费 + 服务费)
- 风险:中,通常不转售,但会压价、要定制、要长期保障
- 策略以ROI和管理价值卖单签年度合同与服务包
### 2.4 平台型客户SaaS平台/渠道平台/生态型服务商,最重要)
- 典型需求:将能力嵌入其产品并对外收费,形成自己的商业闭环
- 使用方式API深度接入、白标、统一计费、子客户体系
- 付费能力:高(授权费 + 月费 + 分成 + 定制)
- 风险:极高,若缺乏控制会演变为“技术搬运转售”
- 策略必须走SDK+end_user_id+商业授权协议+抽成四件套
---
## 3. 产品套餐设计
> 设计原则:按“可赚钱能力”分层,而不是按“功能多少”分层。
### 3.1 初级版300元/月)
- 适用客户:个人用户、试水型小团队
- 核心能力:
- 基础自动化任务(消息处理、基础触达、简单运营动作)
- 单人使用或极小团队协作
- 基础数据看板
- 限制:
- 账号数量限制如1~2
- 每月调用总量限制(低额度)
- 不开放高级自动化与开放平台能力
- 禁止转售,默认仅自用
- 目标作用:低门槛上车,建立使用习惯和真实数据
### 3.2 高级版600元/月)
- 适用客户工作室、小B服务商、增长团队
- 核心能力:
- 多账号协同
- 批量任务编排与策略模板
- 更细粒度数据统计与任务权限
- 基础API调用能力
- 限制:
- 额度上限中等
- 子账户数量限制
- 无白标、无深度分销
- 商业转售需要额外授权
- 目标作用:让客户开始“用系统赚钱”,推动后续授权与分成
### 3.3 定制版1200元/月)
- 适用客户:企业客户、区域服务商
- 核心能力:
- 高并发任务与优先级保障
- 高级权限、审计、组织管理
- 企业级集成能力(与其业务系统对接)
- 专属成功经理/服务响应机制
- 限制:
- 默认不含白标,不含无限调用
- 重大定制按项目评估
- 目标作用:从“工具采购”升级为“业务增长基础设施”
### 3.4 白标/OEM高价 + 分成)
- 适用客户:平台型客户、头部渠道商、生态服务商
- 核心能力:
- 品牌与界面定制
- SDK接入及统一计费能力
- 子客户与多租户管理
- 商业授权与渠道分账支持
- 价格建议:
- 起步授权 50000可谈判至100000+
- 月技术服务费 3000~20000按规模
- 收入分成 10%~20%
- 关键限制:
- 必须绑定 end_user_id
- 必须走平台授权协议
- 禁止脱离SDK直接调用
---
## 4. 收费模型
### 4.1 一次性授权费(按商业能力分层)
- 3000基础商业使用授权仅自营禁止分销
- 5000团队级授权多操作者 + 有限客户服务场景)
- 10000企业商业授权可对外服务需报备业务形态
- 50000平台/OEM授权允许构建二级商业体系含分成条款
落地规则:
- 授权费不抵月费,防止“买断心态”
- 授权与账号主体绑定,不可随意转移
- 续约年度需复核业务规模与合规情况
### 4.2 月费模型
- 标准订阅300 / 600 / 1200
- 年付建议10个月价格买12个月锁定现金流
- 企业合同:按年签,支持“月费 + 服务包”组合
### 4.3 按量收费(必须项,建议默认开启)
建议按“基础额度 + 超额阶梯”:
- 群发任务:超额后 0.03~0.08 元/次
- 加好友动作:超额后 0.05~0.2 元/次(按风控等级)
- 朋友圈营销动作:超额后 0.02~0.06 元/次
- 消息调用:超额后 0.005~0.02 元/次
执行细则:
- 每套餐附送基础额度,降低首月试错成本
- 额度使用达80%时自动预警并触发升级建议
- 对高风险动作设置单独计价与限速阈值
### 4.4 用户规模收费
- 每客户包含 100 个终端用户名额
- 超过100后1元/人/月
- 平台客户可改为阶梯:
- 101~10001元/人/月
- 1001~100000.8元/人/月
- 10000以上0.5元/人/月
### 4.5 分成模型(必须项)
触发条件:客户直接基于平台对外收费或产生可归因收入。
- 标准分成10%(年框协议、量大)
- 常规分成15%(默认)
- 高支持分成20%(提供销售线索、代运营赋能、联合交付)
分成口径建议:
- 按客户“净营收”或“平台归因营收”结算,避免争议
- 每月对账,季度复盘,低于保底可补最低服务费
---
## 5. 营销策略
### 5.1 获客方式(增长路径)
- 内容营销:
- 短视频场景化展示“1人=3人效率”的前后对比
- SEO围绕“私域自动化、企微运营、微信增长”布局长尾词
- 案例文章:行业拆解(教育/本地生活/电商/知识付费)
- 私域裂变:
- 公开课 + 工具包 + 7天挑战营
- 社群中按成果发榜,激发转介绍
- 代理体系:
- 招募城市代理与垂直行业代理
- 提供标准演示稿、报价手册、成交分佣
- 渠道合作:
- 与代运营公司、SCRM服务商、培训机构联合打包方案
- 通过“联合方案分成”降低单方获客成本
### 5.2 转化策略(从体验到成交)
统一漏斗:免费试用 -> 低价入门 -> 正式订阅 -> 授权升级 -> 分成合作
- 试用设计7天
- 给“可见收益动作”而非全部能力
- 第3天强制ROI回顾第6天给升级建议书
- Demo展示
- 按行业模板演示,不做通用型“功能罗列”
- 展示“投入-产出-回本周期”三张图
- ROI案例
- 输出可量化指标:触达率、回复率、成交率、人效提升
- 销售现场必须带至少2个同行业案例
### 5.3 裂变机制(自传播增长)
- 邀请返佣:
- 推荐成交后返首月月费的20%~30%
- 连续3个月留存再发二次奖励
- 分销体系:
- 一级分销(个人推荐)+ 二级分销(团队代理,需授权)
- 分销商等级按季度GMV升级提高佣金比例
- 平台裂变:
- 对平台型客户提供“子客户激励包”,鼓励其主动扩张
---
## 6. 销售策略
### 6.1 核心销售话术(对外表达框架)
销售不讲“接口”,只讲“利润模型”:
- 开场句:
- “我们不是卖工具,而是帮你把私域运营变成可复制的赚钱流程。”
- 诊断句:
- “你现在每月在人工触达和运营执行上的隐性成本是多少?”
- 价值句:
- “系统把高频动作自动化后通常在1~2个月回本。”
- 成交句:
- “先从低风险套餐开始跑出ROI后再升级授权现金流最稳。”
### 6.2 定价防压价策略
- 报价顺序固定:先价值后价格,先高锚点后标准价
- 永远给3档报价标准价 / 年付优惠 / 增值服务包
- 价格可让步,权益不白送(让价必须交换:签年约/提高保底/放案例)
- 明确“商业授权与转售权”单独定价,避免被按工具价压扁
### 6.3 高价值客户识别(优先投入)
重点跟进信号满足2项即进入重点池
- 已有销售或私域团队(执行能力存在)
- 有明确获客预算和增长目标
- 需要多账号/多客户管理
- 主动询问白标、分销、渠道合作
- 能接受年度合同或保底分成
### 6.4 引导升级机制(非常关键)
- 从初级到高级:
- 触发条件额度达到80%、新增账号需求、团队协作需求
- 升级话术:强调“人效瓶颈”和“机会成本”
- 从高级到定制:
- 触发条件:跨团队管理、稳定性诉求、审计需求
- 升级动作:提供“管理风险清单 + 降风险方案”
- 从定制到白标/OEM
- 触发条件:客户计划对外收费或发展渠道
- 升级动作:联合商业方案 + 分成协议 + 上线节奏表
销售SOP建议
- T+0业务诊断
- T+1行业Demo + ROI测算
- T+3试用复盘 + 方案报价
- T+7签约与上量计划
---
## 7. 风控机制
### 7.1 SDK接入控制入口
- 所有商业客户统一通过SDK鉴权与调用
- 关闭裸调用模式,避免私接与灰产转售
- 关键动作必须签名校验 + 时间戳校验
### 7.2 end_user_id体系控制客户下游
- 每个真实终端用户必须绑定唯一 end_user_id
- 请求、计费、权限、风控全链路以 end_user_id 作为主键
- 平台型客户必须上报 end_user_id 映射关系(可审计)
### 7.3 限流与配额机制(防滥用)
- 套餐级限流:按分钟/小时/日多层阈值
- 动作级限流:高风险动作单独限速(如加好友、批量触达)
- 异常策略:突发流量、异常模式自动降级或冻结
- 额度耗尽策略:停止高风险动作,保留低风险服务与续费入口
### 7.4 反转售与授权条款(商业控制)
- 合同中明确:
- 禁止未经授权的二次转售、接口共享、账号借用
- 发现违规可暂停服务并追偿商业损失
- 合规转售路径:
- 必须购买对应商业授权级别
- 必须接入SDK与 end_user_id
- 必须接受分成与审计条款
- 技术+法务双保险:
- 技术侧识别可疑租户行为
- 法务侧保留追责与解约权利
### 7.5 风险分级处置机制
- 低风险:告警 + 限速 + 客服核验
- 中风险:临时冻结高风险能力 + 补充资质
- 高风险:立即停服 + 法务通知 + 黑名单
---
## 附90天落地执行路线图建议
### 第1阶段1~30天打基础现金流
- 上线三档套餐与试用漏斗
- 搭建销售SOP与行业Demo库
- 建立按量计费与额度告警
### 第2阶段31~60天做增长与渠道
- 启动邀请返佣与代理招募
- 发布行业ROI案例与转化脚本
- 跑通工作室与企业客户升级路径
### 第3阶段61~90天做平台化放大
- 推出平台授权与白标方案
- 签2~5家平台型客户试点分成
- 建立 end_user_id 审计与反转售闭环
最终目标:
- 短期3个月订阅现金流稳定 + 销售流程标准化
- 中期6个月平台客户贡献新增收入并形成分成
- 长期12个月形成“订阅 + 按量 + 授权 + 分成”四引擎增长模型

View File

@@ -0,0 +1,158 @@
# 微信自动化增长平台(客户决策版方案)
## 1. 我们能为您解决什么问题
如果您正在做私域运营,通常会遇到三类问题:
- 人工成本高:重复触达、回复、运营动作靠人堆
- 执行不稳定:不同员工执行标准不一,结果波动大
- 规模难扩大:账号、社群、内容、成交链路无法系统化复制
本平台的价值是:
> 帮您把私域运营从“人工作坊”升级为“可复制的自动化增长系统”,在控制风险的前提下提升转化和人效。
---
## 2. 方案价值(老板最关心)
- **降本**:自动化高频动作,减少重复人工投入
- **增收**:提高触达效率、跟进及时性和转化闭环
- **可控**:多账号、多团队统一管理,过程可追踪
- **可扩张**:支持企业级协同,也支持平台化对外服务
---
## 3. 三档标准套餐(可立即上线)
### A. 初级版300元/月
适合:个人经营者、小规模私域团队
包含:基础自动化运营能力、基础消息与互动管理、基础数据看板
限制:账号与调用额度较低,仅限自用,不支持对外商业转售
### B. 高级版600元/月
适合:工作室、增长团队、代运营团队
包含:多账号协同、批量任务能力、进阶数据统计、基础开放能力
限制:额度中等,子账户数量有限,商业转售需另购授权
### C. 定制版1200元/月
适合:企业客户、连锁品牌、组织化运营团队
包含:高优先级资源、组织权限管理、审计能力、深度业务集成支持
限制:不含白标,不含无限调用;重大定制按项目评估
### D. 白标/OEM高价 + 分成
适合:平台型客户、渠道平台、生态型服务商
包含品牌定制、SDK接入、子客户管理、商业化分账能力
建议模式:授权费 + 月服务费 + 收入分成10%~20%
---
## 4. 收费规则(透明可控)
### 4.1 一次性授权费(按商业用途)
- 3000基础商业使用授权仅自营
- 5000团队运营授权多操作者
- 10000企业商业授权对外服务场景
- 50000平台/OEM授权可构建二级商业体系
### 4.2 月费
- 300 / 600 / 1200对应三档标准版
### 4.3 按量收费(超额才计费)
对高频动作采用“套餐内额度 + 超额计费”:
- 群发任务、加好友、朋友圈营销、消息调用等
优势:先低风险试用,业务放量后按效果扩容,避免前期重投入。
### 4.4 用户规模收费
- 每个客户默认含100个终端用户
- 超过100后1元/人/月
### 4.5 分成模型(适用于您对外变现时)
- 当您基于平台对外收费时可采用10%~20%分成
- 适合白标/OEM、平台客户、渠道体系客户
---
## 5. ROI与回本逻辑决策依据
建议用三个指标评估:
- 人效提升:单人可管理的私域规模提升
- 转化提升:触达率、回复率、成交率提升
- 成本下降:重复动作人工时间明显下降
**典型回本周期1~2个月**(取决于业务规模与执行力度)。
---
## 6. 项目落地方式(可执行)
### 第一阶段7天试运行
- 明确目标(拉新/成交/复购)
- 上线关键流程(高频动作优先)
- 输出首轮数据复盘
### 第二阶段30天标准化
- 沉淀可复用运营模板
- 建立团队协同与权限机制
- 启动按量优化与成本控制
### 第三阶段60~90天规模化
- 业务放量与模型优化
- 必要时升级定制版或白标模式
- 形成稳定“增长+变现”闭环
---
## 7. 风控与合规保障(对企业负责)
- 统一SDK入口保障调用可控
- end_user_id机制确保使用可审计
- 限流与异常策略,防止滥用与风险放大
- 明确商业授权边界,保护双方权益
---
## 8. 推荐采购路径(给决策人)
### 保守路径(低风险)
先上高级版600/月)+ 基础授权5000跑通1个业务闭环后再升级。
### 成长路径(追求规模)
直接定制版1200/月)+ 企业授权1000030天内完成组织化落地。
### 平台路径(以变现为目标)
白标/OEM授权50000起+ 月服务费 + 分成10%~20%),构建自有商业平台。
---
## 9. 商务建议与下一步
为便于快速决策建议您当前确认以下3项
- 本期目标:提效、增收、还是平台化变现
- 预算区间:标准订阅、企业定制、或白标投入
- 上线节奏:先试运行还是直接组织化部署
确认后可在48小时内给您输出
- 专属报价单
- 对应行业ROI测算
- 30天落地计划表

View File

@@ -0,0 +1,248 @@
# 微信自动化平台完整计费方案(客户可读版)
## 0. 先看结论1分钟看懂
本方案采用 **“月费套餐 + 一次性授权 + 超量计费 + 人数计费 + 分成”** 五层收费:
- 月费套餐300 / 600 / 1200 / 白标OEM
- 一次性授权3000 / 5000 / 10000 / 50000
- 超量计费:消息、加好友、群发、朋友圈、企业动作按量计费
- 人数计费超过100终端用户后 1元/人/月
- 分成计费客户对外收费时按10%~20%抽成
适合客户从“小团队试水”到“平台化变现”全阶段使用。
---
## 1. 功能模块分层(基于你的功能表抽象)
为方便客户决策,所有功能按 5 层价值分组,而不是按接口名称分组。
### L1 基础运营层(必需)
- 登录与设备管理(扫码/密码登录、多设备状态、在线管理)
- 文本/图片/语音/视频消息收发
- 好友与联系人管理
- 基础群管理
### L2 增长自动化层(增长核心)
- 批量群发、消息同步、自动化任务
- 标签管理、关键词回复、欢迎语、基础运营规则
- 朋友圈发布与互动(评论、点赞、转发)
### L3 成交变现层(直接赚钱)
- 支付动作(收款、转账、红包)
- 公众号/小程序联动(阅读、授权、互动)
- 视频号与内容分发相关能力
### L4 组织协同层(企业级)
- 多角色权限、团队协同
- 企业微信相关能力(企业群、企业通讯录、企业协作)
- 审计、策略配置、组织化运营支持
### L5 平台商业层(平台客户)
- 授权码管理、子客户管理、分发管理
- 白标品牌化、渠道分销、二级商业体系
- 商业风控(限流、审计、反转售)
---
## 2. 套餐与价格(客户直接选)
## 2.1 初级版300元/月)
适合:个人、微团队、首次试水客户
- 包含:
- L1 基础运营层全部
- L2 增长自动化层的基础能力(基础群发/基础标签/基础规则)
- 套餐额度(建议):
- 消息调用2万次/月
- 群发任务300次/月
- 加好友动作500次/月
- 朋友圈动作300次/月
- 活跃终端用户100人
- 限制:
- 账号数 1~2
- 不含企业协同、白标、转售权限
## 2.2 高级版600元/月)
适合:工作室、代运营团队、增长团队
- 包含:
- L1 + L2 全量
- L3 成交变现层基础能力
- 套餐额度(建议):
- 消息调用8万次/月
- 群发任务1500次/月
- 加好友动作3000次/月
- 朋友圈动作1200次/月
- 活跃终端用户300人
- 限制:
- 账号数 3~10
- 对外商业转售需购买授权
## 2.3 定制版1200元/月)
适合:企业客户、连锁品牌、组织化运营方
- 包含:
- L1 + L2 + L3 全量
- L4 组织协同层(企业协同、权限管理、审计支持)
- 套餐额度(建议):
- 消息调用20万次/月
- 群发任务5000次/月
- 加好友动作10000次/月
- 朋友圈动作5000次/月
- 活跃终端用户1000人
- 限制:
- 不含白标品牌与二级平台分销权
## 2.4 白标/OEM高价 + 分成)
适合:平台型客户、渠道平台、生态服务商
- 建议价格结构:
- 一次性平台授权50000元起
- 月技术服务费3000~20000元
- 分成10%~20%
- 包含:
- L1~L5 全量能力
- 子客户管理、品牌定制、商业化分账
---
## 3. 一次性授权费(必须单列)
- 3000基础商业授权自营
- 5000团队商业授权多操作者
- 10000企业商业授权可服务外部客户
- 50000平台/OEM商业授权可搭建二级商业体系
说明:
- 授权费不替代月费
- 授权按主体绑定,不可随意转移
- 商业转售必须匹配对应授权等级
---
## 4. 超量计费(超出套餐后才收费)
## 4.1 建议单价区间
- 消息调用(收发/同步0.005~0.02 元/次
- 群发任务0.03~0.08 元/次
- 加好友动作0.05~0.20 元/次
- 朋友圈动作0.02~0.06 元/次
- 企微高级动作0.05~0.30 元/次(按风险等级)
- 媒体下载/上传(图片/语音/视频):可按流量包或次数包计费
## 4.2 阶梯计费(建议)
以消息调用为例:
- 0 ~ 套餐内额度0元
- 超额 0 ~ 5万次0.012 元/次
- 超额 5万 ~ 20万次0.009 元/次
- 超额 20万次以上0.007 元/次
同理可应用于群发、好友、朋友圈动作,鼓励客户放量。
---
## 5. 用户规模计费(必须)
- 每套餐含 100 个终端用户(初级)或按套餐提升
- 超过100后**1元/人/月**
平台型客户可用阶梯价(可选):
- 101~10001元/人/月
- 1001~100000.8元/人/月
- 10000+0.5元/人/月
---
## 6. 分成模型(客户赚钱时再抽成)
适用场景客户基于本平台向其下游客户收费SaaS服务费、代运营费、增值服务费等
- 标准档15%
- 优惠档10%(年框、量大、保底)
- 高支持档20%(由平台提供销售支持/交付支持)
推荐规则:
- 每月对账,次月结算
- 设保底服务费,避免低活跃占用资源
---
## 7. 三种客户常用报价模板(销售可直接发)
## 7.1 试水型客户(低风险)
- 方案:高级版 600/月 + 5000授权
- 适用:工作室、小团队
- 预估首年费用:
- 授权5000
- 月费600 x 12 = 7200
- 合计12200不含超量
## 7.2 成长型企业(组织化)
- 方案:定制版 1200/月 + 10000授权
- 适用:品牌企业、连锁门店
- 预估首年费用:
- 授权10000
- 月费1200 x 12 = 14400
- 合计24400不含超量与服务包
## 7.3 平台变现型客户(高价值)
- 方案OEM授权50000 + 月服务费8000 + 分成15%
- 适用:渠道平台、生态服务商
- 预估首年固定费用:
- 授权50000
- 月服务费8000 x 12 = 96000
- 固定合计146000 + 分成
---
## 8. 合同与计费口径(避免争议)
- 计费周期:自然月
- 费用组成:授权费 + 月费 + 超量费 + 人数费 + 分成
- 数据口径:平台计费后台为准
- 发票与付款:可按月/季/年
- 停服规则:逾期未付可降级或暂停高风险能力
---
## 9. 推荐对外呈现方式(客户更容易决策)
对客户只展示以下三张表:
- 表1套餐对比表300/600/1200/OEM
- 表2超量计费表消息、群发、好友、朋友圈、企微
- 表3三种采购路径试水/成长/平台)
这样客户能在 10 分钟内完成预算评估并进入签约流程。
---
## 10. 下一步(可直接执行)
如确认此计费方案,可立即落地:
- 输出正式《报价单(对外版)》
- 输出《合同计费条款(法务版)》
- 输出《销售口径一页纸(团队版)》
以上三份可在同一口径下同步,避免销售、交付、财务口径不一致。

169
方案.md Normal file
View File

@@ -0,0 +1,169 @@
# 微信自动化平台报价方案(严谨版)
## 1) 标准报价单
| 版本 | 月费 | 一次性授权费 | 适用客户 | 核心价值 |
|---|---:|---:|---|---|
| 初级版 | 300元/月 | 3000元 | 个人、微团队 | 基础收发与基础运营,适合项目起步 |
| 高级版 | 600元/月 | 5000元 | 工作室、代运营 | 关键增长能力(群发、朋友圈深度、支付) |
| 定制版 | 1200元/月 | 10000元 | 企业客户 | 企业协同与管理能力(企微、授权、小店) |
| 白标/OEM | 3000~20000元/月 | 50000元起 | 平台型客户 | 在定制版能力上增加商业授权条款 |
说明:
- 授权费为商业使用许可,不抵扣月费。
- 白标/OEM新增内容以商务合同为准非默认标准功能。
---
## 2) 对应功能说明(具体功能点)
### 2.1 初级版300元/月)
包含功能:
- 登录基础:扫码登录、登录二维码获取、登录状态查询、在线状态查询、退出登录
- 消息基础发送文本、发送图片、发送语音、接收同步消息HTTP轮询
- 好友基础:搜索联系人、同意好友、添加好友、联系人列表查询、联系人详情查询
- 群基础:创建群、邀请成员、群详情、群成员详情、群二维码、设置群名称、退出群
- 用户基础设置:获取个人资料、获取个人二维码、修改昵称、修改签名、修改备注
- 标签基础:新增标签、删除标签、修改标签、标签列表
- 朋友圈基础:发布朋友圈、点赞评论、朋友圈同步、朋友圈主页查询
- 设备基础:在线设备信息、安全设备列表
不包含功能:
- 消息增强:群发文本、群发图片、历史消息同步、消息管理器、转发图片/视频/表情、撤回消息、高清图片下载、语音下载、视频下载、媒体上传CDN
- 朋友圈增强:上传朋友圈图片、指定用户朋友圈、朋友圈详情、设置朋友圈背景图、设置可见天数
- 好友/用户增强:删除好友、好友关系查询、上传手机通讯录、通讯录好友、自动回复关键词、欢迎词、邀请入群关键词、踢人关键词、管理员关键词、上传头像
- 支付、公众号/小程序、收藏、视频号、企业微信、管理授权码、微信小店、WebSocket同步
套餐额度:
- 消息调用8万次/月
- 群发任务0次/月(不含群发)
- 加好友动作200次/月
- 朋友圈动作200次/月
- 活跃终端用户100人
限制:
- 1~5个账号
- 不含商业转售/白标授权
---
### 2.2 高级版600元/月)
包含功能(初级版 + 以下新增):
- 消息增强:群发文本、群发图片、历史消息同步、消息管理器、转发图片/视频/表情、撤回消息、下载语音、下载视频、高清图片下载、视频上传、图片上传CDN
- 朋友圈增强:上传朋友圈图片、指定用户朋友圈、朋友圈详情、设置朋友圈背景图、设置可见天数
- 好友/用户增强:删除好友、好友关系查询、上传手机通讯录、通讯录好友、自动回复关键词、欢迎词、邀请入群关键词、踢人关键词、管理员关键词、上传头像
- 群增强:添加成员、设置群公告、设置群内昵称、同意入群
- 支付:创建转账、确认转账、收款确认、生成收款二维码、创建红包、拆红包、红包详情、红包领取列表、银行卡列表
- 公众号/小程序:公众号授权登录、关注公众号、授权链接获取、公众号历史消息、公众号文章阅读、公众号文章点赞、文章阅读数、小程序授权、小程序云函数操作、二维码授权请求与确认
- 收藏:收藏同步、收藏列表、收藏详情、批量删除收藏
- 视频号:视频号扫码登录、视频号搜索、关注/取消关注、视频号中心
- 同步通道WebSocket消息同步
- 其他工具:上传文件、缓存消息读取、附近的人、步数修改、指令状态更新
套餐额度:
- 消息调用28万次/月
- 群发任务1500次/月
- 加好友动作3000次/月
- 朋友圈动作1200次/月
- 活跃终端用户300人
限制:
- 11~50个账号
- 对外收费型业务需升级授权
- 不含企业微信、授权码管理、微信小店
---
### 2.3 定制版1200元/月)
包含功能(高级版 + 以下新增):
- 企业微信:同意进企业群、创建企业群、删除企业群、企业群拉人、企业群成员移除、企业群管理员增删、企业群公告、企业群二维码、企业群转让、企业群成员查询、企业群信息查询、企业通讯录同步、企业群同步、企业联系人检索与备注
- 管理(授权码):生成授权码、禁用授权码、删除授权码、授权码延期、激活授权查询、授权状态同步、代理映射查询
- 微信小店:小店登录确认、小店扫码事件上报、小店扩展设备登录确认相关流程
- 登录增强:验证码验证、滑块验证、代理设置下登录
- 用户增强:设置代理、修改加好友验证属性、设置拍一拍名称、设置微信号、设置性别
- 其他增强:企微图片下载、硬件设备绑定信息、删除安全设备
套餐额度:
- 消息调用68万次/月
- 群发任务5000次/月
- 加好友动作10000次/月
- 朋友圈动作5000次/月
- 活跃终端用户1000人
---
### 2.4 白标/OEM高价 + 分成)
包含内容:
- 定制版全部功能
- 商业授权与对外服务许可(以合同条款为准)
- 可约定授权码分配规则(以合同条款为准)
---
## 3) 超量计费说明(超出套餐后生效)
| 计费项 | 单价区间(元/次) | 对应具体功能 |
|---|---:|---|
| 消息调用 | 0.005 ~ 0.02 | 发送/接收/同步/转发/撤回等消息动作 |
| 群发任务 | 0.03 ~ 0.08 | 文本群发、图片群发 |
| 加好友动作 | 0.05 ~ 0.20 | 搜索联系人、发起验证、同意好友 |
| 朋友圈动作 | 0.02 ~ 0.06 | 发布、点赞评论、详情读取、同步 |
| 企业微信动作 | 0.05 ~ 0.30 | 企业群管理、企业通讯录同步、企业联系人动作 |
建议:采用“套餐内免费额度 + 阶梯超额价”。
---
## 4) 用户规模计费
- 套餐内含基础用户数(见各版本额度)
- 超出100人后1元/人/月
- 平台客户可申请阶梯价(量大更优)
---
## 5) 分成计费(客户对外收费时)
当客户基于本平台向下游客户收费时,执行分成:
- 标准分成15%
- 优惠分成10%(年框或保底)
- 高支持分成20%(联合销售/交付支持)
---
## 6) 付款与商务条款
- 计费周期:按自然月
- 推荐签约:季付/年付(年付可申请优惠)
- 开票类型:可开具增值税发票(按合同)
- 逾期规则:逾期可先降级后停高风险能力
- 交付边界:报价文档写明功能点为交付范围,未列明功能默认不包含
---
## 7) 联系方式
- 公司名称:上海丙维数字科技有限公司
- 联系人Daniel商务负责人
- 联系电话13585795811
- 邮箱bimwe@bimwe.com
- 官网www.bimwe.com
---

View File

@@ -0,0 +1,190 @@
# 微信自动化平台标准报价单(含功能说明)
> 适用对象:个人用户 / 工作室 / 企业客户 / 平台型客户
> 报价有效期30天可按项目调整
> 币种人民币CNY
---
## 1) 标准报价单
| 版本 | 月费 | 一次性授权费 | 适用客户 | 核心价值 |
|---|---:|---:|---|---|
| 初级版 | 300元/月 | 3000元 | 个人、微团队 | 低门槛上手,快速跑通基础自动化 |
| 高级版 | 600元/月 | 5000元 | 工作室、代运营 | 多账号协同,支持规模化增长动作 |
| 定制版 | 1200元/月 | 10000元 | 企业客户 | 组织化运营、权限管理、稳定交付 |
| 白标/OEM | 3000~20000元/月 | 50000元起 | 平台型客户 | 品牌化输出、子客户体系、商业分成 |
说明:
- 授权费为商业使用许可,不抵扣月费。
- 白标/OEM按需求评估通常同时配置分成条款。
---
## 2) 对应功能说明(客户可读)
### 2.1 初级版300元/月)
**包含功能**
- 账号登录与在线管理(扫码/密码、在线状态、退出)
- 基础消息能力(文本/图片/语音/视频收发)
- 基础好友与联系人管理
- 基础群管理(建群、拉人、群信息管理)
- 基础运营配置(关键词回复、欢迎语、基础标签)
- 基础朋友圈操作(发布与基础互动)
**建议额度**
- 消息调用2万次/月
- 群发任务300次/月
- 加好友动作500次/月
- 朋友圈动作300次/月
- 活跃终端用户100人
**限制**
- 1~2个账号
- 不含企业微信深度能力
- 不含商业转售/白标权限
---
### 2.2 高级版600元/月)
**包含功能**
- 初级版全部能力
- 批量群发、批量转发、消息同步能力增强
- 多账号协同与策略模板
- 好友/群/标签的批量运营能力
- 公众号/小程序基础联动能力
- 支付能力基础接入(收款、转账、红包流程)
**建议额度**
- 消息调用8万次/月
- 群发任务1500次/月
- 加好友动作3000次/月
- 朋友圈动作1200次/月
- 活跃终端用户300人
**限制**
- 3~10个账号
- 企业级审计与深度权限能力有限
- 对外收费型业务需升级授权
---
### 2.3 定制版1200元/月)
**包含功能**
- 高级版全部能力
- 企业级组织管理(角色、权限、审计)
- 企业微信能力(企业群、企业通讯录、企业协同动作)
- 高并发任务与优先资源保障
- 管理类能力增强(授权生命周期、代理映射、状态同步)
- 定制化对接支持(按项目评估)
**建议额度**
- 消息调用20万次/月
- 群发任务5000次/月
- 加好友动作10000次/月
- 朋友圈动作5000次/月
- 活跃终端用户1000人
**限制**
- 默认不含白标品牌与二级分销体系
---
### 2.4 白标/OEM高价 + 分成)
**包含功能**
- 定制版全部能力
- 独立品牌化输出(名称、界面、交付口径)
- SDK接入、子客户管理、多租户商业体系
- 平台化授权与分账能力
- 专项风控能力(限流、审计、反转售)
**商业条款建议**
- 授权费50000元起
- 月服务费3000~20000元
- 分成10%~20%
---
## 3) 超量计费说明(超出套餐后生效)
| 计费项 | 单价区间(元/次) | 说明 |
|---|---:|---|
| 消息调用(收发/同步) | 0.005 ~ 0.02 | 用量大建议走阶梯价 |
| 群发任务 | 0.03 ~ 0.08 | 按任务次计费 |
| 加好友动作 | 0.05 ~ 0.20 | 按风险等级定价 |
| 朋友圈动作 | 0.02 ~ 0.06 | 发布/互动类动作 |
| 企业协同高级动作 | 0.05 ~ 0.30 | 企业微信高阶能力 |
建议:采用“套餐内免费额度 + 阶梯超额价”,避免客户前期投入过重。
---
## 4) 用户规模计费
- 套餐内含基础用户数(见各版本额度)
- 超出100人后**1元/人/月**
- 平台客户可申请阶梯价(量大更优)
---
## 5) 分成计费(客户对外收费时)
当客户基于本平台向下游客户收费时,执行分成:
- 标准分成15%
- 优惠分成10%(年框或保底)
- 高支持分成20%(联合销售/交付支持)
---
## 6) 付款与商务条款
- 计费周期:按自然月
- 推荐签约:季付/年付(年付可申请优惠)
- 开票类型:可开具增值税发票(按合同)
- 逾期规则:逾期可先降级后停高风险能力
---
## 7) 三个常用成交方案(直接选)
### 方案A试水启动低风险
- 高级版 600/月 + 5000授权
- 适合:工作室/小团队先跑通闭环
### 方案B企业增长稳定扩张
- 定制版 1200/月 + 10000授权
- 适合:有组织协同和稳定运营需求的企业
### 方案C平台变现高增长
- 白标 50000起 + 月服务费 + 10%~20%分成
- 适合:渠道平台/生态服务商
---
## 8) 联系销售时需确认的3件事
- 本期目标:提效 / 增收 / 平台化变现
- 预估规模:账号数、月动作量、终端用户数
- 采购方式:月付试运行 / 季付 / 年框
确认后可在48小时内提供正式合同版报价。