From fbd10ad1f9079ef850cb3fe63c1be6b6fa02d390 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Tue, 14 Apr 2026 00:12:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E5=90=8E=E5=8F=B0=E5=92=8C=E4=BB=A3=E7=90=86=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=90=8C=E4=B8=80=E4=B8=AA=E5=9F=9F=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- codes/agent/game-docker/.env.example | 74 ++------- codes/agent/game-docker/.gitattributes | 17 ++ codes/agent/game-docker/api/NJMfcWBpvG.txt | 1 + .../game-docker/api/sample/offlinepay.html | 2 +- .../api/sample/offlinepay/index.php | 6 +- .../api/sample/offlinepay/js/common.js | 2 +- .../game-docker/api/sample/onlinepay.html | 15 +- .../api/sample/onlinepay/index.php | 8 +- .../api/sample/onlinepay/js/common.js | 2 +- .../game-docker/api/sample/onlinepay/test.php | 10 +- .../game-docker/api/sample/refund/index.php | 9 +- .../api/sample/refund/js/common.js | 2 +- .../game-docker/api/sample/transfer/index.php | 4 +- .../api/sample/transfer/index1.php | 4 +- .../api/sample/transfer/js/common.js | 2 +- .../game-docker/api/source/apis/activity.php | 6 +- .../game-docker/api/source/apis/apiBase.php | 6 +- .../api/source/apis/commendpic.php | 2 +- .../game-docker/api/source/apis/login.php | 12 +- .../game-docker/api/source/apis/market.php | 2 +- .../game-docker/api/source/apis/newpay.php | 6 +- .../agent/game-docker/api/source/apis/pay.php | 2 +- .../game-docker/api/source/apis/transfer.php | 4 +- codes/agent/game-docker/api/source/conf.php | 10 +- .../game-docker/api/source/login/common.php | 4 +- .../game-docker/api/source/login/js/common.js | 2 +- .../game-docker/api/source/login/login.php | 12 +- .../game-docker/api/source/pay/common.php | 4 +- .../game-docker/api/source/pay/js/common.js | 2 +- .../api/tests/debug/debug_weixin.php | 6 +- .../integration/business_function_test.php | 12 +- .../tests/integration/system_verification.php | 6 +- .../dlweb/api/common/config.inc.php | 56 +++---- .../dlweb/api/config/game_config.inc.php | 2 +- .../game-docker/dlweb/api/ext/Synchronize.php | 4 +- .../dlweb/api/ext/SynchronizeReportData.php | 4 +- .../dlweb/api/lib/1.0/config/game.config.php | 2 +- .../game-docker/dlweb/api/lib/1.0/game.php | 4 +- .../dlweb/api/web2/Charge_card.html | 1 + .../dlweb/api/web2/SalesTransCard.html | 1 + .../game-docker/dlweb/api/web2/Yesterday.html | 1 + .../dlweb/api/web2/agent_list.html | 1 + .../dlweb/api/web2/agent_list_admin.html | 14 +- .../dlweb/api/web2/become_sales.html | 1 + .../dlweb/api/web2/become_sales_free.html | 1 + .../game-docker/dlweb/api/web2/bind_club.html | 1 + .../dlweb/api/web2/bind_phone.html | 1 + .../dlweb/api/web2/bind_player.html | 1 + .../dlweb/api/web2/bind_player_template.html | 1 + .../dlweb/api/web2/bind_sales.html | 1 + .../dlweb/api/web2/bind_sales_template.html | 1 + .../dlweb/api/web2/charge_star.html | 1 + .../dlweb/api/web2/components/common_mixin.js | 2 +- .../game-docker/dlweb/api/web2/download.html | 9 +- .../game-docker/dlweb/api/web2/gift.html | 1 + .../game-docker/dlweb/api/web2/gift_pack.html | 1 + .../game-docker/dlweb/api/web2/guanlitj.html | 1 + .../game-docker/dlweb/api/web2/increase.html | 1 + .../game-docker/dlweb/api/web2/index.html | 1 + .../game-docker/dlweb/api/web2/invite.html | 1 + .../dlweb/api/web2/invite_target.html | 1 + .../dlweb/api/web2/js/env-config.js | 58 +++++++ .../dlweb/api/web2/js/function-a.js | 36 ++--- .../game-docker/dlweb/api/web2/js/function.js | 62 +++----- .../dlweb/api/web2/js/public_method.js | 2 +- .../game-docker/dlweb/api/web2/js/tangjian.js | 9 +- .../game-docker/dlweb/api/web2/links.html | 29 ++-- .../dlweb/api/web2/lower_player_list.html | 1 + .../game-docker/dlweb/api/web2/manage.html | 1 + .../dlweb/api/web2/manage_login.html | 1 + .../dlweb/api/web2/manage_login_phone.html | 1 + .../agent/game-docker/dlweb/api/web2/my.html | 1 + .../game-docker/dlweb/api/web2/notify.html | 1 + .../game-docker/dlweb/api/web2/notify_a.html | 1 + .../game-docker/dlweb/api/web2/pay_qcode.html | 1 + .../dlweb/api/web2/player_buy.html | 1 + .../dlweb/api/web2/power_daiguanxi.html | 1 + .../dlweb/api/web2/power_daiquan.html | 1 + .../dlweb/api/web2/power_duanshezhi.html | 1 + .../dlweb/api/web2/power_fadai.html | 1 + .../dlweb/api/web2/power_fawan.html | 1 + .../dlweb/api/web2/power_fengdai.html | 1 + .../dlweb/api/web2/power_fengwan.html | 1 + .../dlweb/api/web2/power_qingdai.html | 1 + .../dlweb/api/web2/power_register_sales.html | 1 + .../dlweb/api/web2/power_tj_daicha.html | 1 + .../dlweb/api/web2/power_tj_daishui.html | 1 + .../dlweb/api/web2/power_tj_goumai.html | 1 + .../dlweb/api/web2/power_tj_wanshui.html | 1 + .../dlweb/api/web2/power_wanjie.html | 1 + .../dlweb/api/web2/power_yjdaili.html | 1 + .../dlweb/api/web2/power_yongjin.html | 1 + .../dlweb/api/web2/query_sales_password.html | 1 + .../game-docker/dlweb/api/web2/record.html | 1 + .../dlweb/api/web2/record_gold.html | 1 + .../dlweb/api/web2/sales_bind_player.html | 1 + .../dlweb/api/web2/sales_unbind.html | 1 + .../dlweb/api/web2/short_room.html | 1 + .../dlweb/api/web2/ticket_card.html | 1 + .../dlweb/api/web2/top_sales_manage.html | 1 + .../dlweb/api/web2/transform_product.html | 1 + .../dlweb/api/web2/wan_purchase_new.html | 1 + .../dlweb/api/web2/white_list.html | 1 + .../dlweb/api/web2/winner_record.html | 1 + .../dlweb/api/web2/winner_record_player.html | 1 + .../dlweb/api/web2/your_purchase.html | 1 + .../dlweb/api/web2/your_purchase_new.html | 1 + codes/agent/game-docker/docker-compose.yml | 20 ++- .../docker/dlweb/docker-entrypoint.sh | 146 +++++------------- .../docker/nginx/default.conf.template | 17 +- .../wxserver_daoqi/config/index.js | 8 +- .../agent/game-docker/wxserver_daoqi/index.js | 115 +++++++++----- 112 files changed, 510 insertions(+), 405 deletions(-) create mode 100644 codes/agent/game-docker/.gitattributes create mode 100644 codes/agent/game-docker/api/NJMfcWBpvG.txt create mode 100644 codes/agent/game-docker/dlweb/api/web2/js/env-config.js diff --git a/codes/agent/game-docker/.env.example b/codes/agent/game-docker/.env.example index 2379c87..cd44c0f 100644 --- a/codes/agent/game-docker/.env.example +++ b/codes/agent/game-docker/.env.example @@ -70,6 +70,10 @@ WX_MINI_APPSECRET=d326aaf93eb4d106e35592667ef022f5 # ---- 微信公众号 ---- WX_OA_APPID=wx7a1c6f324182bc83 WX_OA_APPSECRET=a90ba94e3a2dca8d09656dcc364e1df0 +# wxserver OAuth 回调基础地址,优先于 WX_OA_REDIRECT_DOMAIN_KEY +# api 与 wxserver 共用 api.ROOT_DOMAIN,通过 /wx/ 前缀区分 +# 回调完整地址为:WX_OA_REDIRECT_DOMAIN + /auth/oa/callback +# WX_OA_REDIRECT_DOMAIN= (由 docker-compose.yml 自动注入,无需在此配置) WX_OA_REDIRECT_DOMAIN_KEY=minipro_api_url # ---- 微信支付 (dlweb) ---- @@ -99,75 +103,19 @@ DLWEB_PORT=8082 # WXSERVER_PORT 同时用于容器内监听和宿主机映射 # ---- 域名配置 (只需填写父域名) ---- -# 三个子域名由 docker-compose.yml 自动推导,无需单独配置: -# API_DOMAIN = api. -# DLWEB_DOMAIN = dlapi. -# WX_DOMAIN = wxapi. +# 所有子域名由 docker-compose.yml 从 ROOT_DOMAIN 自动拼接,无需单独配置: +# api.ROOT_DOMAIN API 服务 +# dlapi.ROOT_DOMAIN 代理管理后台 +# wxapi.ROOT_DOMAIN 微信小程序 +# api2.ROOT_DOMAIN API2 服务 +# sdk.ROOT_DOMAIN SDK 域名 +# open.ROOT_DOMAIN 活动/图片资源 ROOT_DOMAIN=daoqijuyou77.cn # ---- SSL 证书 (Let's Encrypt) ---- # 用于接收证书到期提醒邮件(必填) SSL_EMAIL=lanterngames@163.com -# ============================================ -# 站点域名配置(PHP env() 和 Docker entrypoint 使用) -# ============================================ - -# 以下变量均由 docker-compose.yml 从 ROOT_DOMAIN 自动推导注入,无需手动配置: -# DLWEB_API_BASE_URL = https://dlapi. (dlweb 本身 API 基地址) -# DLWEB_SDK_API_URL = https://api. (sdk login/pay,指向 api 容器) -# DLWEB_DL_API_V3_URL = https://dlapi. (tangjian.js 推广 API) -# SITE_API_URL = https://api. (支付表单 action 域名) -# SITE_PAY_NOTIFY_URL = https://api. (微信支付异步回调) -# SITE_OPEN_URL = http://open. (活动/市场图片前缀) - -# 如需覆盖某个子域名(非标准命名),取消注释并填写: -# API_DOMAIN=api.daoqijuyou77.cn -# DLWEB_DOMAIN=dlapi.daoqijuyou77.cn -# WX_DOMAIN=wxapi.daoqijuyou77.cn -# SITE_API_URL=https://api.daoqijuyou77.cn -# SITE_PAY_NOTIFY_URL=https://api.daoqijuyou77.cn -# SITE_OPEN_URL=http://open.daoqijuyou77.cn - -# API2 / SDK 域名(使用独立域名时才需要配置) -# SITE_API2_URL=https://api2.tscce.cn -# SITE_SDK_DOMAIN=sdk.tscce.cn - -# QQ 登录回调地址 -# QQ_CALLBACK_URL=http://syhd.daoqijuyou77.cn - -# ============================================ -# DLWEB 前端域名配置(Docker entrypoint sed 替换使用) -# ============================================ - - - -# 结算后台地址 -# DLWEB_SETTLE_URL=http://dlsettle.daoqijuyou77.cn/mobile/ -# DLWEB_SETTLE_FULL_URL=http://dlsettle.tscce.cn - -# 默认头像地址 -# DLWEB_AVATAR_URL=https://dlwebv3.tscce.cn/images/noavatar.png - - -# DLWEB_SDK_API2_URL=https://api2.tscce.cn - -# DLWEB 代理测试/管理地址 -# DLWEB_PROXY_URL=https://proxytest.tscce.cn -# DLWEB_PROXY_77_URL=https://proxytest.daoqijuyou77.cn -# DLWEB_DL_API_V3_URL 由 docker-compose.yml 自动推导(= https://dlapi.),无需配置 - -# 运营后台地址 -# DLWEB_OPERATE_URL=https://operate.daoqijuyou77.cn - -# 下载页 CDN/图片地址 -# DLWEB_DOWNLOAD_CDN_URL=http://tsqiniu1.tscce.cn -# DLWEB_GAME_IMAGE_URL=http://tsgames.daoqijuyou77.cn -# DLWEB_SKYGAMES_URL=https://skygames.tscce.cn - -# 游戏服务查询地址 -# SITE_GAME_SERVICE_URL=http://ylyxservice1.daoqijuyou77.cn:1089/index.html - # ============================================ # 定时同步任务 (Synchronize.php) # ============================================ diff --git a/codes/agent/game-docker/.gitattributes b/codes/agent/game-docker/.gitattributes new file mode 100644 index 0000000..47a5fb6 --- /dev/null +++ b/codes/agent/game-docker/.gitattributes @@ -0,0 +1,17 @@ +# Docker 项目中所有脚本和配置文件必须使用 LF 行尾符,否则容器中无法正常工作 +*.sh text eol=lf +*.php text eol=lf +*.conf text eol=lf +*.yml text eol=lf +*.yaml text eol=lf +*.env text eol=lf +*.sql text eol=lf +*.ini text eol=lf +*.json text eol=lf +*.js text eol=lf +*.html text eol=lf +*.css text eol=lf +*.xml text eol=lf +*.htaccess text eol=lf +Dockerfile text eol=lf +docker-compose*.yml text eol=lf diff --git a/codes/agent/game-docker/api/NJMfcWBpvG.txt b/codes/agent/game-docker/api/NJMfcWBpvG.txt new file mode 100644 index 0000000..49426ce --- /dev/null +++ b/codes/agent/game-docker/api/NJMfcWBpvG.txt @@ -0,0 +1 @@ +e8c43dd296b1de0360e899de7964eea9 \ No newline at end of file diff --git a/codes/agent/game-docker/api/sample/offlinepay.html b/codes/agent/game-docker/api/sample/offlinepay.html index 9837865..0051d0a 100644 --- a/codes/agent/game-docker/api/sample/offlinepay.html +++ b/codes/agent/game-docker/api/sample/offlinepay.html @@ -33,7 +33,7 @@ 'orderid' : randomChar(6), 'fee' : 1, 'title' : 'test', - 'notice_url' : 'https://api.tscce.cn/1.php', + 'notice_url' : window.location.origin + '/1.php', 'paytype' : paytype, 'version' : 1, 'sign' : '', diff --git a/codes/agent/game-docker/api/sample/offlinepay/index.php b/codes/agent/game-docker/api/sample/offlinepay/index.php index ba885ca..0d95387 100644 --- a/codes/agent/game-docker/api/sample/offlinepay/index.php +++ b/codes/agent/game-docker/api/sample/offlinepay/index.php @@ -1,6 +1,8 @@ error && count($result->data) > 0) /// 调用成功, 并且有支援的支付方式 { /// 这里只获取第一种支付方式 @@ -282,7 +284,7 @@ function SendPost($url, $data) $data['sign'] = SignParameter($data, $sign_key); /// 生成签名 /// 调用接口 - $result = new ResultObject(rawurldecode(SendPost('https://api2.tscce.cn/api/newpay/pay/offline/', $data))); + $result = new ResultObject(rawurldecode(SendPost($_api2_base . '/api/newpay/pay/offline/', $data))); if (0 != $result->error) /// error不为0表示有错误发生 { diff --git a/codes/agent/game-docker/api/sample/offlinepay/js/common.js b/codes/agent/game-docker/api/sample/offlinepay/js/common.js index aa4ab58..b44f0f7 100644 --- a/codes/agent/game-docker/api/sample/offlinepay/js/common.js +++ b/codes/agent/game-docker/api/sample/offlinepay/js/common.js @@ -1,6 +1,6 @@ //var g_appid = '14919772144482'; //var g_devkey = '14915485974028'; -var g_RequestAddress = 'https://api.daoqijuyou77.cn'; +var g_RequestAddress = window.location.origin; /** * @note 字符串格式化 diff --git a/codes/agent/game-docker/api/sample/onlinepay.html b/codes/agent/game-docker/api/sample/onlinepay.html index 5845019..9fc9e9f 100644 --- a/codes/agent/game-docker/api/sample/onlinepay.html +++ b/codes/agent/game-docker/api/sample/onlinepay.html @@ -6,7 +6,7 @@ - - - - {{v.name}} —— 正式 + {{v.name}} —— 正式 @@ -41,6 +38,7 @@ + + diff --git a/codes/agent/game-docker/dlweb/api/web2/become_sales_free.html b/codes/agent/game-docker/dlweb/api/web2/become_sales_free.html index 5a79675..d762428 100644 --- a/codes/agent/game-docker/dlweb/api/web2/become_sales_free.html +++ b/codes/agent/game-docker/dlweb/api/web2/become_sales_free.html @@ -60,6 +60,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/bind_club.html b/codes/agent/game-docker/dlweb/api/web2/bind_club.html index 8ba79b7..bf53be1 100644 --- a/codes/agent/game-docker/dlweb/api/web2/bind_club.html +++ b/codes/agent/game-docker/dlweb/api/web2/bind_club.html @@ -37,6 +37,7 @@ + + + + + + + diff --git a/codes/agent/game-docker/dlweb/api/web2/components/common_mixin.js b/codes/agent/game-docker/dlweb/api/web2/components/common_mixin.js index 737ef16..bd08e01 100644 --- a/codes/agent/game-docker/dlweb/api/web2/components/common_mixin.js +++ b/codes/agent/game-docker/dlweb/api/web2/components/common_mixin.js @@ -30,7 +30,7 @@ var commonMixin = { openid: that.tel, unionid: that.tel, nickname: ( that.wxInfo.nickname ? that.wxInfo.nickname : '代理'+$.randomString(4, '0123456789')), - avatar: (that.wxInfo.headimgurl ? that.wxInfo.headimgurl : 'https://dlwebv3.tscce.cn/images/noavatar.png'), + avatar: (that.wxInfo.headimgurl ? that.wxInfo.headimgurl : ((window.__ENV__ && window.__ENV__.AVATAR_URL) || '')), sex: (that.wxInfo.sex ? that.wxInfo.sex : 0), province: (that.wxInfo.province ? that.wxInfo.province : ''), islog: 0 diff --git a/codes/agent/game-docker/dlweb/api/web2/download.html b/codes/agent/game-docker/dlweb/api/web2/download.html index 736f909..1c847ad 100644 --- a/codes/agent/game-docker/dlweb/api/web2/download.html +++ b/codes/agent/game-docker/dlweb/api/web2/download.html @@ -37,6 +37,7 @@ + + diff --git a/codes/agent/game-docker/dlweb/api/web2/gift_pack.html b/codes/agent/game-docker/dlweb/api/web2/gift_pack.html index db1526a..a4d8313 100644 --- a/codes/agent/game-docker/dlweb/api/web2/gift_pack.html +++ b/codes/agent/game-docker/dlweb/api/web2/gift_pack.html @@ -90,6 +90,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/guanlitj.html b/codes/agent/game-docker/dlweb/api/web2/guanlitj.html index 10910a8..feda45e 100644 --- a/codes/agent/game-docker/dlweb/api/web2/guanlitj.html +++ b/codes/agent/game-docker/dlweb/api/web2/guanlitj.html @@ -196,6 +196,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/increase.html b/codes/agent/game-docker/dlweb/api/web2/increase.html index 7030733..e18b86d 100644 --- a/codes/agent/game-docker/dlweb/api/web2/increase.html +++ b/codes/agent/game-docker/dlweb/api/web2/increase.html @@ -82,6 +82,7 @@ + + diff --git a/codes/agent/game-docker/dlweb/api/web2/invite.html b/codes/agent/game-docker/dlweb/api/web2/invite.html index 9fb389c..787a38a 100644 --- a/codes/agent/game-docker/dlweb/api/web2/invite.html +++ b/codes/agent/game-docker/dlweb/api/web2/invite.html @@ -145,6 +145,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/invite_target.html b/codes/agent/game-docker/dlweb/api/web2/invite_target.html index 8147748..7414d7d 100644 --- a/codes/agent/game-docker/dlweb/api/web2/invite_target.html +++ b/codes/agent/game-docker/dlweb/api/web2/invite_target.html @@ -6,6 +6,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/js/env-config.js b/codes/agent/game-docker/dlweb/api/web2/js/env-config.js new file mode 100644 index 0000000..29cd75c --- /dev/null +++ b/codes/agent/game-docker/dlweb/api/web2/js/env-config.js @@ -0,0 +1,58 @@ +/** + * 环境域名配置文件 + * + * Docker 部署时由 docker-entrypoint.sh 自动覆盖此文件(从 .env 读取)。 + * 本地开发时保留此默认版本,所有 URL 为空字符串, + * function.js / function-a.js 会根据 window.location 自动推导。 + * + * !!! 请勿在此文件中硬编码生产域名 !!! + */ +;(function () { + var _host = window.location.hostname; + var _protocol = window.location.protocol; + var _isLocal = (_host === 'localhost' || _host === '127.0.0.1'); + + // 从当前域名提取根域名: dlapi.daoqijuyou77.cn → daoqijuyou77.cn + var _rootDomain = _isLocal ? '' : _host.replace(/^[^.]+\./, ''); + + // 工具函数:拼接子域名 URL + function _url(sub, path) { + if (_isLocal) return path || ''; + return _protocol + '//' + sub + '.' + _rootDomain + (path || ''); + } + + window.__ENV__ = { + // ---- 根域名 ---- + ROOT_DOMAIN: _rootDomain, + + // ---- DLWEB API 基地址(当前站点) ---- + DLWEB_API_BASE_URL: _isLocal ? 'http://localhost/proxy/trunk/api' : (_protocol + '//' + _host), + + // ---- SDK API 地址 (function.js 使用) ---- + SDK_API_URL: _url('api'), + + // ---- SDK API2 地址 (function-a.js 使用) ---- + SDK_API2_URL: _url('api2'), + + // ---- 结算后台 ---- + SETTLE_URL: _url('dlsettle', '/mobile/'), + SETTLE_FULL_URL: _url('dlsettle'), + + // ---- 代理测试 ---- + PROXY_URL: _url('proxytest'), + + // ---- 运营后台 ---- + OPERATE_URL: _url('operate'), + + // ---- 默认头像 ---- + AVATAR_URL: _url('dlwebv3', '/images/noavatar.png'), + + // ---- 下载页资源 ---- + DOWNLOAD_CDN_URL: _url('tsqiniu1'), + GAME_IMAGE_URL: _url('tsgames'), + SKYGAMES_URL: _url('skygames'), + + // ---- 游戏服务查询 ---- + GAME_SERVICE_URL: _url('ylyxservice1', ':1089/index.html') + }; +})(); diff --git a/codes/agent/game-docker/dlweb/api/web2/js/function-a.js b/codes/agent/game-docker/dlweb/api/web2/js/function-a.js index 8d7f4a2..05238d1 100644 --- a/codes/agent/game-docker/dlweb/api/web2/js/function-a.js +++ b/codes/agent/game-docker/dlweb/api/web2/js/function-a.js @@ -1,32 +1,27 @@ ;(function ($) { + // 环境配置(由 env-config.js 提供,或自动根据当前域名推导) + var _env = window.__ENV__ || {}; + var _dlapiBase = _env.DLWEB_API_BASE_URL || ''; + var _sdkApi2Url = _env.SDK_API2_URL || ''; + var _avatarUrl = _env.AVATAR_URL || ''; + // 初始化函数 var init = function () { - - // 通过域名判断环境 - $.API_URL = 'https://dlapi.daoqijuyou77.cn/Index.php'; - $.RETURN_URL = 'https://dlapi.daoqijuyou77.cn/web2/notify.html'; - + $.API_URL = _dlapiBase + '/Index.php'; + $.RETURN_URL = _dlapiBase + '/web2/notify.html'; }; $.extend( { API_URL: '', RETURN_URL: '', // 微信支付成功后的跳转地址 - AVATAR_URL: 'https://dlwebv3.tscce.cn/images/noavatar.png', // 没有头像的默认地址 - - // ts已修改2021 - // SID_SCODE_URL: 'https://api.tscce.cn/source/login/login.php', // 获取sid和scode的地址 - // WX_INFO_URL: 'https://api.tscce.cn/api/user', // 获取微信用户信息地址 - // PAY_URL: 'https://api.tscce.cn/source/pay/pay_1.php', // 微信支付地址 - // NOTICE_URL: 'https://api.tscce.cn/source/pay/notify.php?v=', // 支付成功后的异步通知地址 - // SHARE_LINK: 'https://api.tscce.cn/api/weixin/wx_share_info', - - SID_SCODE_URL: 'https://api2.tscce.cn/source/login/login.php', // 获取sid和scode的地址 - WX_INFO_URL: 'https://api2.tscce.cn/api/user', // 获取微信用户信息地址 - PAY_URL: 'https://api2.tscce.cn/source/pay/pay_1.php', // 微信支付地址 - NOTICE_URL: 'https://api2.tscce.cn/source/pay/notify.php?v=', // 支付成功后的异步通知地址 - SHARE_LINK: 'https://api2.tscce.cn/api/weixin/wx_share_info', + AVATAR_URL: _avatarUrl, // 没有头像的默认地址 + SID_SCODE_URL: _sdkApi2Url + '/source/login/login.php', // 获取sid和scode的地址 + WX_INFO_URL: _sdkApi2Url + '/api/user', // 获取微信用户信息地址 + PAY_URL: _sdkApi2Url + '/source/pay/pay_1.php', // 微信支付地址 + NOTICE_URL: _sdkApi2Url + '/source/pay/notify.php?v=', // 支付成功后的异步通知地址 + SHARE_LINK: _sdkApi2Url + '/api/weixin/wx_share_info', wxInfo: {}, // 微信信息 @@ -579,8 +574,7 @@ $.ajax( { // ts已修改2021 - // url: 'https://api.tscce.cn/api/login/ylnn', - url: 'https://api2.tscce.cn/api/login/ylnn', + url: _sdkApi2Url + '/api/login/ylnn', type: 'POST', dataType: 'json', async: false, diff --git a/codes/agent/game-docker/dlweb/api/web2/js/function.js b/codes/agent/game-docker/dlweb/api/web2/js/function.js index ff867eb..dab7dbe 100644 --- a/codes/agent/game-docker/dlweb/api/web2/js/function.js +++ b/codes/agent/game-docker/dlweb/api/web2/js/function.js @@ -1,31 +1,17 @@ ;(function ($) { - /** - * 结算后台地址 - * 注意:顺序不能乱 - * @type {string[]} - */ - var url_settle = [ - 'http://localhost/proxy/trunk/settle/mobile/', - 'https://proxytest.tscce.cn/settle/mobile/', - // ts已修改2021 - // 'http://dlsettle.tscce.cn/mobile/' - 'http://dlsettle.tscce.cn/mobile/' - ]; + // 环境配置(由 env-config.js 提供,或自动根据当前域名推导) + var _env = window.__ENV__ || {}; + var _dlapiBase = _env.DLWEB_API_BASE_URL || ''; + var _sdkApiUrl = _env.SDK_API_URL || ''; + var _settleUrl = _env.SETTLE_URL || ''; + var _avatarUrl = _env.AVATAR_URL || ''; // 初始化函数 var init = function () { - - // 通过域名判断环境 - - - $.API_URL = 'https://dlapi.daoqijuyou77.cn/Index.php'; - $.RETURN_URL = 'https://dlapi.daoqijuyou77.cn/web2/notify.html'; - $.SETTLE_URL = 'http://dlsettle.daoqijuyou77.cn/mobile/'; - - - - + $.API_URL = _dlapiBase + '/Index.php'; + $.RETURN_URL = _dlapiBase + '/web2/notify.html'; + $.SETTLE_URL = _settleUrl; }; $.extend( @@ -33,22 +19,20 @@ IS_DEBUG: false, API_URL: '', RETURN_URL: '', // 微信支付成功后的跳转地址 - AVATAR_URL: 'https://dlwebv3.tscce.cn/images/noavatar.png', // 没有头像的默认地址 - // ts已修改2021 - SID_SCODE_URL: 'https://api.daoqijuyou77.cn/source/login/login.php', // 获取sid和scode的地址 - WX_INFO_URL: 'https://api.daoqijuyou77.cn/api/user', // 获取微信用户信息地址 - PAY_URL: 'https://api.daoqijuyou77.cn/source/pay/pay.php', // 微信支付地址 - NOTICE_URL: 'https://api.daoqijuyou77.cn/source/pay/notify.php?v=', // 支付成功后的异步通知地址 - SHARE_LINK: 'https://api.daoqijuyou77.cn/api/weixin/wx_share_info', - - // SID_SCODE_URL: 'https://api.tscce.cn/source/login/login.php', // 获取sid和scode的地址 - // WX_INFO_URL: 'https://api.tscce.cn/api/user', // 获取微信用户信息地址 - // PAY_URL: 'https://api.tscce.cn/source/pay/pay.php', // 微信支付地址 - // NOTICE_URL: 'https://api.tscce.cn/source/pay/notify.php?v=', // 支付成功后的异步通知地址 - // SHARE_LINK: 'https://api.tscce.cn/api/weixin/wx_share_info', - - + AVATAR_URL: _avatarUrl, // 没有头像的默认地址 + SID_SCODE_URL: _sdkApiUrl + '/source/login/login.php', // 获取sid和scode的地址 + WX_INFO_URL: _sdkApiUrl + '/api/user', // 获取微信用户信息地址 + PAY_URL: _sdkApiUrl + '/source/pay/pay.php', // 微信支付地址 + NOTICE_URL: _sdkApiUrl + '/source/pay/notify.php?v=', // 支付成功后的异步通知地址 + SHARE_LINK: _sdkApiUrl + '/api/weixin/wx_share_info', SETTLE_URL: '', // 结算后台地址 + // 额外域名配置,供 HTML 页面引用 + PROXY_URL: _env.PROXY_URL || '', + SETTLE_FULL_URL: _env.SETTLE_FULL_URL || '', + OPERATE_URL: _env.OPERATE_URL || '', + DOWNLOAD_CDN_URL: _env.DOWNLOAD_CDN_URL || '', + GAME_IMAGE_URL: _env.GAME_IMAGE_URL || '', + SKYGAMES_URL: _env.SKYGAMES_URL || '', wxInfo: {}, // 微信信息 userInfo: {}, // 用户信息 cache: {}, // 缓存 @@ -712,7 +696,7 @@ $.ajax( { - url: 'https://api.daoqijuyou77.cn/api/login/ylnn', + url: _sdkApiUrl + '/api/login/ylnn', type: 'POST', dataType: 'json', diff --git a/codes/agent/game-docker/dlweb/api/web2/js/public_method.js b/codes/agent/game-docker/dlweb/api/web2/js/public_method.js index 20921bf..67a0a8d 100644 --- a/codes/agent/game-docker/dlweb/api/web2/js/public_method.js +++ b/codes/agent/game-docker/dlweb/api/web2/js/public_method.js @@ -8,7 +8,7 @@ var public_appid = ""; //开发者平台的app_id 支付使用 var public_devkey = ""; var public_businessid = ""; -var public_server_url_one = "http://ylyxservice1.daoqijuyou77.cn:1089/index.html";// +var public_server_url_one = (window.__ENV__ && window.__ENV__.GAME_SERVICE_URL) || '';// diff --git a/codes/agent/game-docker/dlweb/api/web2/js/tangjian.js b/codes/agent/game-docker/dlweb/api/web2/js/tangjian.js index ac521e7..b1a5885 100644 --- a/codes/agent/game-docker/dlweb/api/web2/js/tangjian.js +++ b/codes/agent/game-docker/dlweb/api/web2/js/tangjian.js @@ -21,16 +21,15 @@ // 初始化函数 var init = function () { - // 通过域名判断环境 + // 通过 env-config.js 获取 API 地址,无需硬编码域名 + var _env = window.__ENV__ || {}; + var _dlapiBase = _env.DLWEB_API_BASE_URL || ''; switch (window.location.hostname) { case 'localhost': defaults.api_url = 'http://localhost/proxy/trunk/api/Index.php'; break; - case 'proxytest.tscce.cn': - defaults.api_url = 'https://proxytest.tscce.cn/api/Index.php'; - break; default: - defaults.api_url = 'https://dlapiv3.tscce.cn/Index.php'; + defaults.api_url = _dlapiBase + '/Index.php'; } if($.getPageName() === 'welcome.html') diff --git a/codes/agent/game-docker/dlweb/api/web2/links.html b/codes/agent/game-docker/dlweb/api/web2/links.html index 5c1c2f7..dcc2005 100644 --- a/codes/agent/game-docker/dlweb/api/web2/links.html +++ b/codes/agent/game-docker/dlweb/api/web2/links.html @@ -18,7 +18,7 @@ -
+ @@ -58,11 +56,11 @@
@@ -94,6 +92,19 @@ + + + \ No newline at end of file diff --git a/codes/agent/game-docker/dlweb/api/web2/lower_player_list.html b/codes/agent/game-docker/dlweb/api/web2/lower_player_list.html index dc9c69e..af65420 100644 --- a/codes/agent/game-docker/dlweb/api/web2/lower_player_list.html +++ b/codes/agent/game-docker/dlweb/api/web2/lower_player_list.html @@ -46,6 +46,7 @@ + + diff --git a/codes/agent/game-docker/dlweb/api/web2/manage_login.html b/codes/agent/game-docker/dlweb/api/web2/manage_login.html index c01380e..2f76554 100644 --- a/codes/agent/game-docker/dlweb/api/web2/manage_login.html +++ b/codes/agent/game-docker/dlweb/api/web2/manage_login.html @@ -44,6 +44,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/manage_login_phone.html b/codes/agent/game-docker/dlweb/api/web2/manage_login_phone.html index d81baf9..596f1f5 100644 --- a/codes/agent/game-docker/dlweb/api/web2/manage_login_phone.html +++ b/codes/agent/game-docker/dlweb/api/web2/manage_login_phone.html @@ -43,6 +43,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/my.html b/codes/agent/game-docker/dlweb/api/web2/my.html index be1bac5..8fb0c84 100644 --- a/codes/agent/game-docker/dlweb/api/web2/my.html +++ b/codes/agent/game-docker/dlweb/api/web2/my.html @@ -105,6 +105,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/notify.html b/codes/agent/game-docker/dlweb/api/web2/notify.html index 473a8f7..b438d50 100644 --- a/codes/agent/game-docker/dlweb/api/web2/notify.html +++ b/codes/agent/game-docker/dlweb/api/web2/notify.html @@ -34,6 +34,7 @@ + + + + diff --git a/codes/agent/game-docker/dlweb/api/web2/power_daiguanxi.html b/codes/agent/game-docker/dlweb/api/web2/power_daiguanxi.html index d08c816..9d14b7f 100644 --- a/codes/agent/game-docker/dlweb/api/web2/power_daiguanxi.html +++ b/codes/agent/game-docker/dlweb/api/web2/power_daiguanxi.html @@ -83,6 +83,7 @@ + + diff --git a/codes/agent/game-docker/dlweb/api/web2/power_duanshezhi.html b/codes/agent/game-docker/dlweb/api/web2/power_duanshezhi.html index 8639c6c..ece6401 100644 --- a/codes/agent/game-docker/dlweb/api/web2/power_duanshezhi.html +++ b/codes/agent/game-docker/dlweb/api/web2/power_duanshezhi.html @@ -112,6 +112,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/power_fadai.html b/codes/agent/game-docker/dlweb/api/web2/power_fadai.html index 2ddc40b..e2a8428 100644 --- a/codes/agent/game-docker/dlweb/api/web2/power_fadai.html +++ b/codes/agent/game-docker/dlweb/api/web2/power_fadai.html @@ -67,6 +67,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/power_fawan.html b/codes/agent/game-docker/dlweb/api/web2/power_fawan.html index df9cfe0..01cfd9e 100644 --- a/codes/agent/game-docker/dlweb/api/web2/power_fawan.html +++ b/codes/agent/game-docker/dlweb/api/web2/power_fawan.html @@ -65,6 +65,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/power_fengdai.html b/codes/agent/game-docker/dlweb/api/web2/power_fengdai.html index 6efecbe..e95e06e 100644 --- a/codes/agent/game-docker/dlweb/api/web2/power_fengdai.html +++ b/codes/agent/game-docker/dlweb/api/web2/power_fengdai.html @@ -61,6 +61,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/power_fengwan.html b/codes/agent/game-docker/dlweb/api/web2/power_fengwan.html index 9c562b9..a0a5f60 100644 --- a/codes/agent/game-docker/dlweb/api/web2/power_fengwan.html +++ b/codes/agent/game-docker/dlweb/api/web2/power_fengwan.html @@ -56,6 +56,7 @@ + + diff --git a/codes/agent/game-docker/dlweb/api/web2/power_register_sales.html b/codes/agent/game-docker/dlweb/api/web2/power_register_sales.html index 15fe368..cee3c70 100644 --- a/codes/agent/game-docker/dlweb/api/web2/power_register_sales.html +++ b/codes/agent/game-docker/dlweb/api/web2/power_register_sales.html @@ -45,6 +45,7 @@ + + diff --git a/codes/agent/game-docker/dlweb/api/web2/power_tj_daishui.html b/codes/agent/game-docker/dlweb/api/web2/power_tj_daishui.html index 5639c22..1e8884c 100644 --- a/codes/agent/game-docker/dlweb/api/web2/power_tj_daishui.html +++ b/codes/agent/game-docker/dlweb/api/web2/power_tj_daishui.html @@ -92,6 +92,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/power_tj_goumai.html b/codes/agent/game-docker/dlweb/api/web2/power_tj_goumai.html index c167d69..f656d7f 100644 --- a/codes/agent/game-docker/dlweb/api/web2/power_tj_goumai.html +++ b/codes/agent/game-docker/dlweb/api/web2/power_tj_goumai.html @@ -86,6 +86,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/power_tj_wanshui.html b/codes/agent/game-docker/dlweb/api/web2/power_tj_wanshui.html index 36db231..2aaa508 100644 --- a/codes/agent/game-docker/dlweb/api/web2/power_tj_wanshui.html +++ b/codes/agent/game-docker/dlweb/api/web2/power_tj_wanshui.html @@ -84,6 +84,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/power_wanjie.html b/codes/agent/game-docker/dlweb/api/web2/power_wanjie.html index 8097069..b24e5b0 100644 --- a/codes/agent/game-docker/dlweb/api/web2/power_wanjie.html +++ b/codes/agent/game-docker/dlweb/api/web2/power_wanjie.html @@ -60,6 +60,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/power_yjdaili.html b/codes/agent/game-docker/dlweb/api/web2/power_yjdaili.html index 22c00d0..7f21f76 100644 --- a/codes/agent/game-docker/dlweb/api/web2/power_yjdaili.html +++ b/codes/agent/game-docker/dlweb/api/web2/power_yjdaili.html @@ -196,6 +196,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/power_yongjin.html b/codes/agent/game-docker/dlweb/api/web2/power_yongjin.html index eaf8ff0..6979d76 100644 --- a/codes/agent/game-docker/dlweb/api/web2/power_yongjin.html +++ b/codes/agent/game-docker/dlweb/api/web2/power_yongjin.html @@ -51,6 +51,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/query_sales_password.html b/codes/agent/game-docker/dlweb/api/web2/query_sales_password.html index dcc9089..a298d79 100644 --- a/codes/agent/game-docker/dlweb/api/web2/query_sales_password.html +++ b/codes/agent/game-docker/dlweb/api/web2/query_sales_password.html @@ -47,6 +47,7 @@ + + diff --git a/codes/agent/game-docker/dlweb/api/web2/record_gold.html b/codes/agent/game-docker/dlweb/api/web2/record_gold.html index 6a3dd8a..f7464c7 100644 --- a/codes/agent/game-docker/dlweb/api/web2/record_gold.html +++ b/codes/agent/game-docker/dlweb/api/web2/record_gold.html @@ -47,6 +47,7 @@ + + diff --git a/codes/agent/game-docker/dlweb/api/web2/sales_unbind.html b/codes/agent/game-docker/dlweb/api/web2/sales_unbind.html index feaa7a1..54e36c5 100644 --- a/codes/agent/game-docker/dlweb/api/web2/sales_unbind.html +++ b/codes/agent/game-docker/dlweb/api/web2/sales_unbind.html @@ -45,6 +45,7 @@ + + diff --git a/codes/agent/game-docker/dlweb/api/web2/ticket_card.html b/codes/agent/game-docker/dlweb/api/web2/ticket_card.html index d53d4dc..ee9ae0a 100644 --- a/codes/agent/game-docker/dlweb/api/web2/ticket_card.html +++ b/codes/agent/game-docker/dlweb/api/web2/ticket_card.html @@ -57,6 +57,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/top_sales_manage.html b/codes/agent/game-docker/dlweb/api/web2/top_sales_manage.html index 10d6bfd..a22c72c 100644 --- a/codes/agent/game-docker/dlweb/api/web2/top_sales_manage.html +++ b/codes/agent/game-docker/dlweb/api/web2/top_sales_manage.html @@ -187,6 +187,7 @@ + + + + diff --git a/codes/agent/game-docker/dlweb/api/web2/winner_record.html b/codes/agent/game-docker/dlweb/api/web2/winner_record.html index a6fde67..3ced8de 100644 --- a/codes/agent/game-docker/dlweb/api/web2/winner_record.html +++ b/codes/agent/game-docker/dlweb/api/web2/winner_record.html @@ -87,6 +87,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/winner_record_player.html b/codes/agent/game-docker/dlweb/api/web2/winner_record_player.html index c781f92..1e6338b 100644 --- a/codes/agent/game-docker/dlweb/api/web2/winner_record_player.html +++ b/codes/agent/game-docker/dlweb/api/web2/winner_record_player.html @@ -110,6 +110,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/your_purchase.html b/codes/agent/game-docker/dlweb/api/web2/your_purchase.html index d38f808..4bb0bb3 100644 --- a/codes/agent/game-docker/dlweb/api/web2/your_purchase.html +++ b/codes/agent/game-docker/dlweb/api/web2/your_purchase.html @@ -124,6 +124,7 @@ + diff --git a/codes/agent/game-docker/dlweb/api/web2/your_purchase_new.html b/codes/agent/game-docker/dlweb/api/web2/your_purchase_new.html index b02a8c2..a756d85 100644 --- a/codes/agent/game-docker/dlweb/api/web2/your_purchase_new.html +++ b/codes/agent/game-docker/dlweb/api/web2/your_purchase_new.html @@ -318,6 +318,7 @@ + diff --git a/codes/agent/game-docker/docker-compose.yml b/codes/agent/game-docker/docker-compose.yml index 42dc8c4..402118a 100644 --- a/codes/agent/game-docker/docker-compose.yml +++ b/codes/agent/game-docker/docker-compose.yml @@ -54,11 +54,16 @@ services: env_file: - .env environment: - # 从 ROOT_DOMAIN 自动推导,覆盖 env_file 中可能未设置的值 + # 所有子域名从 ROOT_DOMAIN 自动推导,无需在 .env 中单独配置 + ROOT_DOMAIN: ${ROOT_DOMAIN} API_DOMAIN: api.${ROOT_DOMAIN} SITE_API_URL: https://api.${ROOT_DOMAIN} + SITE_API2_URL: https://api2.${ROOT_DOMAIN} + SITE_SDK_DOMAIN: sdk.${ROOT_DOMAIN} SITE_PAY_NOTIFY_URL: https://api.${ROOT_DOMAIN} SITE_OPEN_URL: http://open.${ROOT_DOMAIN} + SDK_API_URL: https://api.${ROOT_DOMAIN} + SDK_API2_URL: https://api2.${ROOT_DOMAIN} volumes: - api-logs:/var/www/html/logs - api-source-logs:/var/www/html/source/logs @@ -79,10 +84,19 @@ services: env_file: - .env environment: - # 从 ROOT_DOMAIN 自动推导,覆盖 env_file 中可能未设置的值 + # 所有子域名从 ROOT_DOMAIN 自动推导,无需在 .env 中单独配置 + ROOT_DOMAIN: ${ROOT_DOMAIN} API_DOMAIN: api.${ROOT_DOMAIN} DLWEB_DOMAIN: dlapi.${ROOT_DOMAIN} DLWEB_DL_API_V3_URL: https://dlapi.${ROOT_DOMAIN} + DLWEB_API_BASE_URL: https://dlapi.${ROOT_DOMAIN} + DLWEB_SDK_API_URL: https://api.${ROOT_DOMAIN} + DLWEB_SDK_API2_URL: https://api2.${ROOT_DOMAIN} + SITE_API_URL: https://api.${ROOT_DOMAIN} + SITE_OPEN_URL: http://open.${ROOT_DOMAIN} + SDK_API_URL: https://api.${ROOT_DOMAIN} + SDK_API2_URL: https://api2.${ROOT_DOMAIN} + SITE_SDK_DOMAIN: sdk.${ROOT_DOMAIN} volumes: - dlweb-logs:/var/www/html/api/logs - dlweb-debug:/var/www/html/api/ext/debug @@ -104,6 +118,8 @@ services: - .env environment: - NODE_ENV=production + # wxserver OAuth 回调基础地址(含 /wx 前缀,与 nginx 路由对应) + - WX_OA_REDIRECT_DOMAIN=https://api.${ROOT_DOMAIN}/wx restart: unless-stopped networks: youle-net: diff --git a/codes/agent/game-docker/docker/dlweb/docker-entrypoint.sh b/codes/agent/game-docker/docker/dlweb/docker-entrypoint.sh index a37dc02..11b626f 100644 --- a/codes/agent/game-docker/docker/dlweb/docker-entrypoint.sh +++ b/codes/agent/game-docker/docker/dlweb/docker-entrypoint.sh @@ -3,122 +3,60 @@ set -e # ============================================ # DLWEB 服务启动入口脚本 -# 在 Apache 启动前替换静态 JS/HTML 文件中的硬编码域名 +# 生成 env-config.js,为前端页面注入环境变量 # ============================================ -echo "[entrypoint] Replacing hardcoded domains in JS/HTML files..." +echo "[entrypoint] Generating env-config.js from environment variables..." # 从 ROOT_DOMAIN 推导子域名(docker-compose.yml 通常已注入,这里仅作容器外单跑的兜底) _ROOT="${ROOT_DOMAIN:-daoqijuyou77.cn}" # 从环境变量读取,提供默认值 -# DLWEB_API_BASE_URL 和 DLWEB_SDK_API_URL 从 API_DOMAIN / DLWEB_DOMAIN 自动推导 DLWEB_API_BASE_URL="https://${DLWEB_DOMAIN:-dlapi.${_ROOT}}" -DLWEB_SETTLE_URL="${DLWEB_SETTLE_URL:-http://dlsettle.daoqijuyou77.cn/mobile/}" -DLWEB_AVATAR_URL="${DLWEB_AVATAR_URL:-https://dlwebv3.tscce.cn/images/noavatar.png}" +DLWEB_SETTLE_URL="${DLWEB_SETTLE_URL:-http://dlsettle.${_ROOT}/mobile/}" +DLWEB_AVATAR_URL="${DLWEB_AVATAR_URL:-https://dlwebv3.${_ROOT}/images/noavatar.png}" DLWEB_SDK_API_URL="https://${API_DOMAIN:-api.${_ROOT}}" -DLWEB_SDK_API2_URL="${DLWEB_SDK_API2_URL:-https://api2.tscce.cn}" -DLWEB_PROXY_URL="${DLWEB_PROXY_URL:-https://proxytest.tscce.cn}" +DLWEB_SDK_API2_URL="${DLWEB_SDK_API2_URL:-https://api2.${_ROOT}}" +DLWEB_PROXY_URL="${DLWEB_PROXY_URL:-https://proxytest.${_ROOT}}" DLWEB_DL_API_V3_URL="${DLWEB_DL_API_V3_URL:-https://dlapi.${_ROOT}}" -DLWEB_WEB_DOMAIN="${DLWEB_WEB_DOMAIN:-https://dlwebv3.tscce.cn}" -DLWEB_SETTLE_FULL_URL="${DLWEB_SETTLE_FULL_URL:-http://dlsettle.tscce.cn}" -DLWEB_OPERATE_URL="${DLWEB_OPERATE_URL:-https://operate.daoqijuyou77.cn}" -DLWEB_PROXY_77_URL="${DLWEB_PROXY_77_URL:-https://proxytest.daoqijuyou77.cn}" -SITE_GAME_SERVICE_URL="${SITE_GAME_SERVICE_URL:-http://ylyxservice1.daoqijuyou77.cn:1089/index.html}" -DLWEB_DOWNLOAD_CDN_URL="${DLWEB_DOWNLOAD_CDN_URL:-http://tsqiniu1.tscce.cn}" -DLWEB_GAME_IMAGE_URL="${DLWEB_GAME_IMAGE_URL:-http://tsgames.daoqijuyou77.cn}" -DLWEB_SKYGAMES_URL="${DLWEB_SKYGAMES_URL:-https://skygames.tscce.cn}" +DLWEB_WEB_DOMAIN="${DLWEB_WEB_DOMAIN:-https://dlwebv3.${_ROOT}}" +DLWEB_SETTLE_FULL_URL="${DLWEB_SETTLE_FULL_URL:-http://dlsettle.${_ROOT}}" +DLWEB_OPERATE_URL="${DLWEB_OPERATE_URL:-https://operate.${_ROOT}}" +DLWEB_PROXY_77_URL="${DLWEB_PROXY_77_URL:-https://proxytest.${_ROOT}}" +SITE_GAME_SERVICE_URL="${SITE_GAME_SERVICE_URL:-http://ylyxservice1.${_ROOT}:1089/index.html}" +DLWEB_DOWNLOAD_CDN_URL="${DLWEB_DOWNLOAD_CDN_URL:-http://tsqiniu1.${_ROOT}}" +DLWEB_GAME_IMAGE_URL="${DLWEB_GAME_IMAGE_URL:-http://tsgames.${_ROOT}}" +DLWEB_SKYGAMES_URL="${DLWEB_SKYGAMES_URL:-https://skygames.${_ROOT}}" -JS_DIR="/var/www/html/api/web2/js" -COMP_DIR="/var/www/html/api/web2/components" -HTML_DIR="/var/www/html/api/web2" +# ---- 生成 env-config.js(替代所有 sed 替换操作) ---- +ENV_CONFIG="/var/www/html/api/web2/js/env-config.js" +cat > "$ENV_CONFIG" < { - // 1. 尝试从远程配置获取动态域名 - const { agentid, gameid, channelid, marketid } = config.remoteConfig; - const key = config.officialAccount.redirectDomainKey || 'auth_redirect_domain'; - - let currentDomain = remoteConfig.getParaValue(key, agentid, gameid, channelid, marketid); - - if (!currentDomain) { - return res.status(500).send('Configuration Error: No redirect domain available in remote config.'); - } - - // 3. 格式化域名 (确保有 https且无末尾斜杠) - currentDomain = currentDomain.trim().replace(/\/$/, ''); - if (!currentDomain.startsWith('http')) { - currentDomain = `https://${currentDomain}`; + let currentDomain; + + if (config.officialAccount.redirectDomain) { + // 优先使用环境变量 WX_OA_REDIRECT_DOMAIN(支持带路径前缀,如 https://api.xxx.cn/wx) + currentDomain = config.officialAccount.redirectDomain.trim().replace(/\/$/, ''); + if (!currentDomain.startsWith('http')) { + currentDomain = `https://${currentDomain}`; + } + } else { + // 从远程配置获取动态域名 + const { agentid, gameid, channelid, marketid } = config.remoteConfig; + const key = config.officialAccount.redirectDomainKey || 'auth_redirect_domain'; + currentDomain = remoteConfig.getParaValue(key, agentid, gameid, channelid, marketid); + + if (!currentDomain) { + return res.status(500).send('Configuration Error: No redirect domain available in remote config.'); + } + + currentDomain = currentDomain.trim().replace(/\/$/, ''); + if (!currentDomain.startsWith('http')) { + currentDomain = `https://${currentDomain}`; + } } // 这里的 redirect_uri 必须是 encodeURIComponent 后的完整 URL @@ -65,26 +73,48 @@ app.get('/auth/oa/login', (req, res) => { res.redirect(url); }); +// code 使用缓存:防止微信 webview 双重请求导致 40163 "code been used" +// value 可能是:Promise(处理中)或 string(已完成的 HTML),TTL 60 秒后自动清理 +const codeCache = new Map(); +function setCacheWithTTL(code, value, ttlMs = 60000) { + codeCache.set(code, value); + setTimeout(() => codeCache.delete(code), ttlMs); +} + // Step 2: 微信回调,获取 code -> access_token -> userinfo -> 返回 HTML 给 web-view app.get('/auth/oa/callback', async (req, res) => { const code = req.query.code; - // console.log('WeChat Callback Code:', code); // 打印回调 Code logger.info('Auth', 'WeChat Callback Code:', code); if (!code) return res.send('Auth failed, no code'); + // 命中缓存:等待相同 code 的进行中 Promise 或直接返回已缓存 HTML + // 防止微信 webview 双重请求(race condition)触发 40163 + if (codeCache.has(code)) { + logger.info('Auth', 'Returning cached response for code:', code); + const cached = codeCache.get(code); + const html = (cached instanceof Promise) ? await cached : cached; + return res.send(html); + } + + // 立即写入 Promise 占位,后续并发请求直接等待此 Promise + let resolveHtml; + const htmlPromise = new Promise(resolve => { resolveHtml = resolve; }); + setCacheWithTTL(code, htmlPromise); + try { // 1. 获取 access_token const tokenUrl = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=${config.officialAccount.appId}&secret=${config.officialAccount.appSecret}&code=${code}&grant_type=authorization_code`; - // console.log('Requesting Token URL:', tokenUrl); // 打印 Token 请求链接 (注意:生产环境不要打印 Secret) logger.debug('Auth', 'Requesting Token URL (Secret Hidden)'); const tokenRes = await axios.get(tokenUrl); - // console.log('Token Response:', tokenRes.data); // 打印 Token 响应结果 logger.debug('Auth', 'Token Response:', tokenRes.data); if (tokenRes.data.errcode) { - return res.send('Token Error: ' + JSON.stringify(tokenRes.data)); + const errHtml = 'Token Error: ' + JSON.stringify(tokenRes.data); + resolveHtml(errHtml); + setCacheWithTTL(code, errHtml); + return res.send(errHtml); } const { access_token, openid } = tokenRes.data; @@ -92,50 +122,65 @@ app.get('/auth/oa/callback', async (req, res) => { // 2. 获取用户信息 (包含永久头像 headimgurl) const infoUrl = `https://api.weixin.qq.com/sns/userinfo?access_token=${access_token}&openid=${openid}&lang=zh_CN`; const infoRes = await axios.get(infoUrl); - // console.log('User Info Response:', infoRes.data); // 打印用户信息响应 logger.success('Auth', 'User Info Retrieved:', infoRes.data.nickname); const userInfo = infoRes.data; // { headimgurl, nickname, unionid, ... } // 3. 返回一个 HTML,利用 JSSDK 把数据传回小程序 - // 注意:wx.miniProgram.postMessage 只有在页面后退、销毁、分享时才会触发小程序的 bindmessage - // 所以这里我们发送数据后,立即调用 navigateBack + // 注意:wx.miniProgram.postMessage 只有在页面后退、销毁时才会触发小程序的 bindmessage + // 重要:JSON 中的 < > & 必须转义为 unicode 转义序列,避免昵称/URL 中含 导致 + // HTML 解析器提前关闭 script 标签,使整段 JS 失效(表现为一直循环无法返回小程序) + const safeUserData = JSON.stringify(userInfo) + .replace(//g, '\\u003e') + .replace(/&/g, '\\u0026'); + const html = ` 正在同步... - +

正在同步微信头像...

`; + + // 将最终 HTML 字符串写入缓存(替换 Promise 占位) + setCacheWithTTL(code, html); + resolveHtml(html); res.send(html); } catch (error) { console.error(error); - res.send('Auth error: ' + error.message); + const errHtml = 'Auth error: ' + error.message; + resolveHtml(errHtml); + res.send(errHtml); } });