sub2api 开通授初始余额:余额为 0 的 key 在网关侧直接 403
This commit is contained in:
1 parent
ec47328d3c
commit
dbfa026a4e
3 files changed
+85
-4
No files matched your search
+36
-4
@@ -73,6 +73,24 @@ def gateway_group_name():
|
||||
or "codex-system"
|
||||
|
||||
|
||||
def opening_balance():
|
||||
"""开通时授的初始余额(美元):默认 10,显式值优先。
|
||||
|
||||
新用户余额为 0 时网关鉴权层直接 403(余额门在任何上游路由
|
||||
之前),所以开通必须同时授余额,否则发出的 key 立刻不可用。
|
||||
显式配 0 表示不授(调用方自理);非法/负值回落默认 10。
|
||||
"""
|
||||
raw = os.environ.get(
|
||||
"CLOUD_SUB2API_OPENING_BALANCE_USD", "").strip()
|
||||
if not raw:
|
||||
return 10.0
|
||||
try:
|
||||
value = float(raw)
|
||||
except ValueError:
|
||||
return 10.0
|
||||
return value if value >= 0 else 10.0
|
||||
|
||||
|
||||
def ensure_gateway_keys_table(conn):
|
||||
conn.execute(GATEWAY_TABLE_SQL)
|
||||
|
||||
@@ -181,6 +199,16 @@ class Sub2apiAdmin:
|
||||
"DELETE", "/api/v1/admin/users/%s" % sub_user_id)
|
||||
return st in (200, 204)
|
||||
|
||||
def set_balance(self, sub_user_id, amount):
|
||||
st, data = self._call(
|
||||
"POST", "/api/v1/admin/users/%s/balance" % sub_user_id,
|
||||
{"balance": amount, "operation": "set",
|
||||
"notes": "codex provisioning opening balance"})
|
||||
if st != 200:
|
||||
raise Sub2apiError(
|
||||
"sub2api 授余额失败: %s"
|
||||
% ((data or {}).get("message") or st), status=st)
|
||||
|
||||
def list_groups(self):
|
||||
st, data = self._call("GET", "/api/v1/admin/groups")
|
||||
payload = (data or {}).get("data")
|
||||
@@ -277,11 +305,12 @@ def list_gateway_models(origin, api_key, request=None):
|
||||
|
||||
|
||||
def ensure_user_gateway_key(conn, user_id, admin=None, request=None):
|
||||
"""幂等开通:已有行直接返回 key;否则建号->登录->发 key->入库。
|
||||
"""幂等开通:已有行直接返回 key;否则建号->登录->发 key->授余额->入库。
|
||||
|
||||
入库失败时尽力清理刚建的 key 与账号(避免孤儿 key),再抛原错。
|
||||
调用方负责 conn 的提交语义:本函数在入库后 commit(开通是独立
|
||||
事务,不跟调用方的业务事务绑在一起)。
|
||||
入库失败时尽力清理刚建的 key 与账号(避免孤儿 key),再抛原错;
|
||||
授余额失败同样走这条清理(余额为 0 的 key 在网关侧直接 403,
|
||||
留着没有意义)。调用方负责 conn 的提交语义:本函数在入库后
|
||||
commit(开通是独立事务,不跟调用方的业务事务绑在一起)。
|
||||
"""
|
||||
ensure_gateway_keys_table(conn)
|
||||
row = get_user_gateway_key(conn, user_id)
|
||||
@@ -304,6 +333,9 @@ def ensure_user_gateway_key(conn, user_id, admin=None, request=None):
|
||||
key_id, key = user_create_key(origin, user_token,
|
||||
"codex-task-key", group_id,
|
||||
request=req)
|
||||
amount = opening_balance()
|
||||
if amount > 0:
|
||||
admin.set_balance(sub_id, amount)
|
||||
now = time.time()
|
||||
conn.execute(
|
||||
"INSERT INTO user_gateway_keys(user_id, sub2api_user_id, "
|
||||
|
||||
Reference in new issue
Block a user