花一周时间写了一个 LLM-API 管理订阅的会员系统 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
chnwine
V2EX    分享创造

花一周时间写了一个 LLM-API 管理订阅的会员系统

  •  
  •   chnwine 54 天前 1617 次点击
    这是一个创建于 54 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Hi, 大家好

    我在做另一个产品Swiflow的,时候一直犹豫要不要做一个会员系统。我把 App 发给周围的朋友时,好多都问 Api Key 怎么获取,有时无奈只好把自己的 Key 直接发给对方。

    犹豫再三,便决定接入一个会员系统,刚开始有去了解 one-api\newapi 这些,但这些更多的是 api 管理,而我期望的是像 Trae\Cursor 这样的封闭型系统,

    • 会员不关心那么多杂七杂八的设置,只要注册、充值、使用即可
    • 开发者只需要关注自己的业务,像正常的使用 openai 的接口就行

    在这个基础上于是就有了现在的《基于订阅和套餐的 LLM 会员管理系统》(llm-member),话不多说,上链接

    演示地址: https://llm-member.fly.dev/

    后台地址: https://llm-member.fly.dev/admin

    账号密码:admin/admin123

    Github: https://github.com/OptLTD/llm-member

    附上 Readme, 欢迎大家吐槽拍砖


    LLM Member - 支持 LLM Proxy 的会员管理系统

    一个专为开发者和企业打造的 LLM 代理服务平台,提供完整的会员管理体系和灵活的模型接入管理。

    产品定位

    面向用户:

    • 会员注册登录: 完整的用户注册、登录体系
    • 充值续费: 支持多种支付方式的充值和套餐续费
    • 使用统计: 清晰的用量统计和消费记录
    • 权限管理: 基于套餐的服务权限控制

    面向管理:

    • 套餐管理: 灵活设置会员套餐和计费规则
    • 模型接入: 支持多种大模型的统一接入和管理
    • 在线支付: 集成多种支付方式,支持自动续费
    • 会员管理: 完整的会员信息、订单、日志管理
    • 数据分析: 收入统计、增长分析、运营数据监控

    解决什么问题?

    • 不用处理不同模型的接口差异
    • 不用担心模型服务的稳定性和切换
    • 不用从零开始构建用户管理和计费系统
    • 不用在业务侧频繁升级调整模型适配
    • 不用担心 API KEY 在业务侧泄漏

    核心价值

    对用户完全透明的 AI 服务

    您的用户只需要:

    1. 注册账号
    2. 选择套餐
    3. 开始使用

    用户无需知道:

    • 什么是 GPT 、Claude 、通义千问
    • 什么是 Token 、Temperature 、Max Tokens
    • 哪个模型适合什么场景
    • 如何申请 API 密钥

    对管理侧可灵活调整上游模型

    • 智能路由: 根据负载和成本自动选择最优模型
    • 策略配置: 灵活配置不同场景下的模型使用策略
    • 实时切换: 支持在线调整模型配置,无需重启服务
    • 成本控制: 精细化的成本控制和预算管理

    开箱即用,兼容 OpenAI 接口

    只要是适配 OpenAI 的接口,直接接入即可使用,无需任何修改:

    // 标准 OpenAI 接口调用方式 fetch('/v1/chat/completions', { method: 'POST', headers: { 'Authorization': 'Bearer user_token', 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'gpt-3.5-turbo', messages: [{ role: 'user', content: '帮我写一份产品介绍' }] }) }) 

    快速开始

    1. 部署服务

    docker run -d \ --name llm-member-app \ -p 8080:8080 \ -v llm_storage:/app/storage \ -e APP_PORT=8080 \ -e APP_MODE=test \ -e ADMIN_USERNAME=admin \ -e ADMIN_PASSWORD=admin123 \ -e DEEPSEEK_API_KEY=sk-you-api-key \ optltd/llm-member:latest 

    完整配置参考.env.example

    2. 配置您的产品

    2.1. 在您的产品中集成 LLM Member 认证服务:

    增加登录注册功能,用户可以通过 LLM Member 认证服务进行注册和登录。 Authorization Url: https://your-domain.com/authorization

    2.2. 在您的产品中存储用户认证信息:

    在 LLM Member 认证成功后,如果设置了Callback Url,认证服务会将用户信息返回给您的产品。您需要在您的产品中存储这些信息,以便后续的 API 调用。

    payload:

    { "token": "sk-xxxxxxxxxxxxxxxx", // 临时 token "sign": "sn-xxxxxxxxxxxxxxxxx", // 签名信息 "time": "2023-12-31T23:59:59Z" // current time } 

    2.2.1 Web Callback 设置: Web App Callback Url: https://your-web-app.com/auth-callback 实际回调请求为: https://your-web-app.com/auth-callback?token=sk-...&sign=...&time=...

    2.2.2 Mobile App Callback 设置: Mobile App Callback Url: x-you-app://auth-callback 实际回调请求为: x-you-app://auth-callback?token=sk-...&sign=...&time=...

    2.2.3 Desktop App Callback 设置: Mobile App Callback Url: x-you-app://auth-callback 实际回调请求为: x-you-app://auth-callback?token=sk-...&sign=...&time=...

    2.2.4 通过token获取用户信息: 获取用户信息接口:https://your-domain.com/v1/verify-token

    const resp = fetch(`https://your-domain.com/v1/verify-token`, { method: 'GET', headers: { 'Authorization': 'Bearer ${token}', 'Content-Type': 'application/json' }, }) 

    响应体:

    { "email": "[email protected]", "username": "User Name", "user_plan": "basic", "api_token": "sk-xxxxxxxxxxxxxxxx", "expire_at": "2023-12-31T23:59:59Z" } 

    2.3. 在您的产品中集成 LLM Member 服务:

    2.3.1 请求大模型: Base Url:https://your-domain.com/v1 实例请求:

    // 标准 OpenAI 接口调用方式 fetch(`${baseURL}/chat/completions`, { method: 'POST', headers: { 'Authorization': `Bearer ${api_token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'gpt-3.5-turbo', messages: [{ role: 'user', content: '帮我写一份产品介绍' }] }) }) 

    2.3.2 获取用户信息: 获取用户信息接口:https://your-domain.com/v1/user-profile

    const resp = fetch(`https://your-domain.com/v1/user-profile`, { method: 'GET', headers: { 'Authorization': `Bearer ${api_token}`, 'Content-Type': 'application/json' }, }) 

    响应体:

    { "email": "[email protected]", "username": "User Name", "user_plan": "basic", "expire_at": "2023-12-31T23:59:59Z" } 

    2.3.3 获取使用统计信息: 获取用户信息接口:https://your-domain.com/api/usage

    cosnt resp = fetch(`https://your-domain.com/api/usage`, { method: 'GET', headers: { 'Authorization': 'Bearer user_token', 'Content-Type': 'application/json' }, }) 

    响应体:

    { "email": "[email protected]", "username": "User Name", "user_plan": "basic", "expire_at": "2023-12-31T23:59:59Z" } 

    3. 为用户提供服务

    用户访问您的产品时:

    1. 引导用户注册/登录
    2. 展示套餐选择页面
    3. 用户选择套餐并支付
    4. 立即开始使用 AI 功能

    让 AI 能力触手可及,让您专注于核心业务价值创造。

    7 条回复    2025-08-24 02:23:49 +08:00
    chnwine
        1
    chnwine  
    OP
       54 天前
    这个好像更完善: https://v2ex.com/t/1021608
    tangxiangpi325
        2
    tangxiangpi325  
       51 天前 via Android
    支持 stripe 支付么
    chnwine
        3
    chnwine  
    OP
       51 天前
    @tangxiangpi325 我可以给你加上,抖抖手的事儿
    tangxiangpi325
        4
    tangxiangpi325  
       51 天前
    @chnwine 刚才试用了下,支付按钮是灰色的,现在集成的是啥支付?
    chnwine
        5
    chnwine  
    OP
       51 天前
    @tangxiangpi325 支付宝、微信相关的代码是加进去了,但我还在申请相关的账号,约等于验证过的都还没有。非 release 模式,有一个 mock 支付可验证下流程是否符合自己的业务
    flavoury
        6
    flavoury  
       50 天前
    楼主,这玩意你写了多久啊
    chnwine
        7
    chnwine  
    OP
       50 天前 via Android
    @flavoury 8.9 号开始写的,8.15 号整个糊起来带 readme 发的 github.从这个点算是一周,但中间修 token 计算、修会员限制、修统计功能又花了两三天
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3206 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 12:07 PVG 20:07 LAX 05:07 JFK 08:07
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86