Show TRC20 USDT pay address on the license page.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-17 20:12:09 +08:00
parent bd14121c02
commit 4fe0df6c6d
4 changed files with 87 additions and 3 deletions
+9 -2
View File
@@ -14,7 +14,10 @@ from lib.license.license_lib import (
get_license_status,
is_license_valid,
redeem_code,
usdt_address,
usdt_network,
validate_license,
wechat_id,
)
_TEMPLATE_PATH = Path(__file__).resolve().parent / "templates" / "license.html"
@@ -133,7 +136,9 @@ def install_license_middleware(app: FastAPI) -> None:
filled = (
html.replace("{{ device_id }}", get_device_id())
.replace("{{ api_url }}", str(status.get("api_url") or ""))
.replace("{{ wechat }}", "dekun03")
.replace("{{ wechat }}", wechat_id())
.replace("{{ usdt_address }}", usdt_address())
.replace("{{ usdt_network }}", usdt_network())
.replace("{{ message }}", msg)
.replace("{{ error }}", err)
.replace("{{ status_message }}", str(status.get("message") or ""))
@@ -150,7 +155,9 @@ def install_license_middleware(app: FastAPI) -> None:
message=msg,
error=err,
api_url=status.get("api_url") or "",
wechat="dekun03",
wechat=wechat_id(),
usdt_address=usdt_address(),
usdt_network=usdt_network(),
)
return HTMLResponse(filled)
+6 -1
View File
@@ -13,7 +13,10 @@ from lib.license.license_lib import (
get_license_status,
is_license_valid,
redeem_code,
usdt_address,
usdt_network,
validate_license,
wechat_id,
)
_TEMPLATE_PATH = Path(__file__).resolve().parent / "templates" / "license.html"
@@ -137,7 +140,9 @@ def install_license_gate(app: Flask) -> None:
message=msg,
error=err,
api_url=status.get("api_url") or "",
wechat="dekun03",
wechat=wechat_id(),
usdt_address=usdt_address(),
usdt_network=usdt_network(),
)
@app.before_request
+20
View File
@@ -23,6 +23,11 @@ DEFAULT_OFFLINE_GRACE_HOURS = 72
STATE_FILENAME = "license_state.json"
LICENSE_ENV_NAME = "license.env"
# USDT 收款(与授权站 app/plans.py 保持一致;可用环境变量覆盖)
DEFAULT_USDT_ADDRESS = "TEqtozJKTEJ6qZcyvienpfyswaeAHXc8ks"
DEFAULT_USDT_NETWORK = "TRC20"
DEFAULT_WECHAT_ID = "dekun03"
_lock = threading.RLock()
_cached_device_id: str | None = None
_env_loaded = False
@@ -61,6 +66,21 @@ def api_base_url() -> str:
return url or DEFAULT_API_URL
def usdt_address() -> str:
_load_license_env()
return (os.getenv("LICENSE_USDT_ADDRESS") or DEFAULT_USDT_ADDRESS).strip()
def usdt_network() -> str:
_load_license_env()
return (os.getenv("LICENSE_USDT_NETWORK") or DEFAULT_USDT_NETWORK).strip() or DEFAULT_USDT_NETWORK
def wechat_id() -> str:
_load_license_env()
return (os.getenv("LICENSE_WECHAT_ID") or DEFAULT_WECHAT_ID).strip() or DEFAULT_WECHAT_ID
def client_key() -> str:
_load_license_env()
env_key = (os.getenv("LICENSE_CLIENT_KEY") or "").strip()
+52
View File
@@ -43,6 +43,24 @@
font-family: ui-monospace, Consolas, monospace;
font-size: 0.85rem;
}
.pay-box {
margin-bottom: 16px;
padding: 12px;
border-radius: 10px;
border: 1px solid #2a3a2a;
background: #0e1610;
}
.pay-box .pay-title { font-size: 0.85rem; color: #9fe0b8; margin-bottom: 8px; }
.pay-row { display: flex; gap: 8px; align-items: stretch; }
.pay-row .id { flex: 1; }
.pay-row button {
width: auto;
margin: 0;
padding: 8px 12px;
flex-shrink: 0;
background: #2a4a36;
font-size: 0.85rem;
}
input[type=text], input[type=password] {
width: 100%;
padding: 10px 12px;
@@ -75,6 +93,17 @@
<h1>软件授权</h1>
<p class="muted">复制设备 ID,联系微信 <strong>{{ wechat }}</strong> 获取 <strong>客户密钥</strong> 与激活码。授权站:{{ api_url }}</p>
{% if usdt_address %}
<div class="pay-box">
<div class="pay-title">USDT 收款地址({{ usdt_network or 'TRC20' }}</div>
<div class="pay-row">
<div class="id" id="usdtAddress">{{ usdt_address }}</div>
<button type="button" id="copyUsdtBtn">复制</button>
</div>
<div class="hint">仅支持 {{ usdt_network or 'TRC20' }} 网络,转错链无法找回。年卡 1000 USDT + 部署费 100 USDT。</div>
</div>
{% endif %}
{% if message %}<p class="ok">{{ message }}</p>{% endif %}
{% if error %}<p class="err">{{ error }}</p>{% endif %}
@@ -102,5 +131,28 @@
套餐:{{ status.plan or '—' }} 到期:{{ status.expires_at or '—' }}
</div>
</div>
<script>
(function () {
var btn = document.getElementById("copyUsdtBtn");
var el = document.getElementById("usdtAddress");
if (!btn || !el) return;
btn.addEventListener("click", function () {
var text = (el.textContent || "").trim();
if (!text) return;
var done = function () {
var old = btn.textContent;
btn.textContent = "已复制";
setTimeout(function () { btn.textContent = old; }, 1500);
};
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(text).then(done).catch(function () {
window.prompt("复制地址", text);
});
} else {
window.prompt("复制地址", text);
}
});
})();
</script>
</body>
</html>