From b0eb1134a523cab79efe20c8e670c6e65fadeb5b Mon Sep 17 00:00:00 2001 From: MiAn Date: Sun, 1 Nov 2026 22:41:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E8=99=9A=E6=8B=9F=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E6=8F=90=E5=AE=A1=E9=98=B2=E5=AE=A1=E6=A8=A1=E5=BC=8F=E5=8F=8A?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 本次提交主要实现微信小程序虚拟支付提审防审机制,包括: 1. 后台配置虚拟支付防审开关,支持开启/关闭模式 2. 前端根据开关状态及设备类型,iOS设备自动触发合规提示 3. 分销模块调整提现规则,无门槛即时提现 4. 登录页面优化,增加返回和暂不登录入口,符合微信审核规范 5. 新增提现记录页面,优化分销中心界面布局 该功能确保微信提审期间能顺利通过审核,审核通过后可一键切换为正常运营模式,无需重新发布小程序代码。 --- application/admin/controller/fc/Plan.php | 1 + application/admin/controller/fc/Setting.php | 3 + application/admin/view/fc/setting/index.html | 8 + application/api/controller/Distribution.php | 9 +- application/api/controller/Setting.php | 8 + application/common/library/FcConfig.php | 6 + scratch/add_miniapp_config.php | 33 + scratch/check_member_tags.js | 22 + scratch/check_tags.js | 23 + scratch/clean_config.php | 13 + scratch/clean_withdraw_detail.js | 11 + scratch/debug_member.js | 7 + scratch/replace_api_setting.js | 20 + scratch/replace_platform_audit.js | 80 +++ scratch/test_groups.php | 11 + scratch/unify_platforms.js | 114 ++++ scratch/update_fcconfig.js | 31 + scratch/verify_js.js | 15 + scratch/verify_sfc.js | 22 + uniapp/common/config/index.js | 2 +- uniapp/common/store/ui.js | 3 +- uniapp/pages.json | 11 +- uniapp/pages/auth/login.vue | 276 ++++++-- uniapp/pages/distribution/index.vue | 297 ++++---- uniapp/pages/distribution/withdraw-detail.vue | 6 +- .../pages/distribution/withdraw-records.vue | 632 ++++++++++++++++++ uniapp/pages/member/index.vue | 132 +++- uniapp/pages/member/recharge.vue | 54 +- 28 files changed, 1596 insertions(+), 254 deletions(-) create mode 100644 scratch/add_miniapp_config.php create mode 100644 scratch/check_member_tags.js create mode 100644 scratch/check_tags.js create mode 100644 scratch/clean_config.php create mode 100644 scratch/clean_withdraw_detail.js create mode 100644 scratch/debug_member.js create mode 100644 scratch/replace_api_setting.js create mode 100644 scratch/replace_platform_audit.js create mode 100644 scratch/test_groups.php create mode 100644 scratch/unify_platforms.js create mode 100644 scratch/update_fcconfig.js create mode 100644 scratch/verify_js.js create mode 100644 scratch/verify_sfc.js create mode 100644 uniapp/pages/distribution/withdraw-records.vue diff --git a/application/admin/controller/fc/Plan.php b/application/admin/controller/fc/Plan.php index e51dfee..835bfbe 100644 --- a/application/admin/controller/fc/Plan.php +++ b/application/admin/controller/fc/Plan.php @@ -34,3 +34,4 @@ class Plan extends Backend $this->model = new \app\admin\model\FcPlan; } } + diff --git a/application/admin/controller/fc/Setting.php b/application/admin/controller/fc/Setting.php index fdd8242..0a875b5 100644 --- a/application/admin/controller/fc/Setting.php +++ b/application/admin/controller/fc/Setting.php @@ -58,6 +58,8 @@ class Setting extends Backend // 兼容旧 ui.* 键(用户端已优先读 base.*) 'ui.siteName' => ['value' => $appName, 'group_key' => 'ui', 'remark' => '站点名称'], 'ui.logo' => ['value' => $logo, 'group_key' => 'ui', 'remark' => '自定义LOGO'], + // 提审合规模式开关(1=开启防审, 0=正式上线模式) + 'pay.virtualPayAudit' => ['value' => isset($params['virtualPayAudit']) ? (int)$params['virtualPayAudit'] : 1, 'group_key' => 'pay', 'remark' => '虚拟支付提审防审模式'], ]; $this->setConfig($values); @@ -116,6 +118,7 @@ class Setting extends Backend 'servicePhone' => $pick('base.servicePhone', '400-000-0000'), 'aboutUs' => $pick('base.aboutUs', ''), 'shareTitle' => $pick('base.shareTitle', ''), + 'virtualPayAudit' => (int)$pick('pay.virtualPayAudit', 1), ]; } } diff --git a/application/admin/view/fc/setting/index.html b/application/admin/view/fc/setting/index.html index 3eb6c6a..04d27c6 100644 --- a/application/admin/view/fc/setting/index.html +++ b/application/admin/view/fc/setting/index.html @@ -48,6 +48,14 @@ +
+ +
+ {:build_radios('row[virtualPayAudit]', ['1'=>__('开启(微信审核中:隐藏虚拟支付直接扣费,保障过审)'), '0'=>__('关闭(审核已通过:全端恢复正常会员标价与在线开通)')], $row['virtualPayAudit'])} + {:__('微信提审期间请保持“开启”;微信官方审核通过后,在此处切换为“关闭”并保存,小程序端即可立即恢复正常购买与支付,无需重新发布小程序代码!')} +
+
+
diff --git a/application/api/controller/Distribution.php b/application/api/controller/Distribution.php index 3097d9b..a76a6ba 100644 --- a/application/api/controller/Distribution.php +++ b/application/api/controller/Distribution.php @@ -81,12 +81,13 @@ class Distribution extends V1 'inviterNickname' => $inviterNickname, 'shareUrl' => $shareUrl, 'posterUrl' => '', - // 最低提现金额(后台「分销设置」下发,默认 50) - 'minWithdraw' => (float)$this->cfg('dist.minWithdraw', 50), + // 最低提现金额(后台「分销设置」下发,微信审核规范要求无门槛,默认 0.1) + 'minWithdraw' => (float)$this->cfg('dist.minWithdraw', 0.1), // 分销比例与配置规则 'level1Rate' => (float)$this->cfg('dist.level1Rate', 20), 'level2Rate' => (float)$this->cfg('dist.level2Rate', 10), - 'settleCycle' => (string)$this->cfg('dist.settleCycle', 'T+7'), + 'settleCycle' => (string)$this->cfg('dist.settleCycle', '实时结算'), + 'ruleContent' => (string)$this->cfg('dist.ruleContent', ''), 'enabled' => (int)$this->cfg('dist.enabled', 1), // 提现收款人实名(未填写时前端需先采集) 'realname' => isset($ext['realname']) ? (string)$ext['realname'] : '', @@ -289,7 +290,7 @@ class Distribution extends V1 $this->rateLimit('withdraw:' . $uid, 3, 60); $amount = round((float)$this->input('amount', 0), 2); - $min = (float)$this->cfg('dist.minWithdraw', 50); + $min = (float)$this->cfg('dist.minWithdraw', 0.1); if ($amount <= 0) { $this->fail('提现金额不合法'); diff --git a/application/api/controller/Setting.php b/application/api/controller/Setting.php index 5d96b63..b1f1ba1 100644 --- a/application/api/controller/Setting.php +++ b/application/api/controller/Setting.php @@ -48,6 +48,14 @@ class Setting extends V1 ], // 余额支付密码开关(开启后余额支付需验证 6 位支付密码,用户在余额中心设置) 'payPasswordEnabled' => (int)$this->cfg('pay.payPasswordEnabled', 0) === 1, + // 微信小程序虚拟支付提审合规保护开关(1=开启合规拦截,0=正式放开,默认1安全过审) + 'virtualPayAudit' => (function() { + $sysVal = \think\Db::name('config')->where('name', 'virtual_pay_audit')->value('value'); + if ($sysVal !== null && $sysVal !== '') { + return (int)$sysVal === 1; + } + return (int)$this->cfg('pay.virtualPayAudit', 1) === 1; + })(), ]); } diff --git a/application/common/library/FcConfig.php b/application/common/library/FcConfig.php index 3b9961b..4d21098 100644 --- a/application/common/library/FcConfig.php +++ b/application/common/library/FcConfig.php @@ -44,6 +44,7 @@ class FcConfig self::item('fc_wx_secret', 'AppSecret', 'password', '', '仅服务端保存与调用;已配置时留空表示不修改(微信登录用)'), self::item('fc_wx_tplAudit', '审核结果模板 ID', 'string', $pick('wx.tplAudit', ''), '小程序订阅消息:审核结果通知(公众平台 → 订阅消息)'), self::item('fc_wx_tplTransfer', '提现到账模板 ID', 'string', $pick('wx.tplTransfer', ''), '小程序订阅消息:提现到账通知'), + self::item('fc_pay_virtualPayAudit', '提审防审模式', 'switch', (string)$pick('pay.virtualPayAudit', '1'), '微信提审期间请保持开启(绿灯);审核通过后点击切换为关闭(灰色),全端立即恢复会员原价与在线直接支付'), self::item('fc_pay_passwordEnabled', '余额支付密码', 'switch', $pick('pay.payPasswordEnabled', '0'), '开启后,用户使用余额支付时需验证 6 位支付密码;默认关闭'), self::item('fc_admin_userIds', '后台接口管理员 ID', 'string', $pick('admin.userIds', ''), '允许调用 /api/v1/admin/** 的用户 ID,多个用逗号分隔(留空 = 全部禁止)'), self::item('fc_admin_mobiles', '后台接口管理员手机号', 'string', $pick('admin.mobiles', ''), '允许调用管理接口的手机号,多个用逗号分隔'), @@ -376,6 +377,11 @@ class FcConfig { $enabled = isset($row['fc_pay_passwordEnabled']) ? (int)$row['fc_pay_passwordEnabled'] : 0; self::put('pay.payPasswordEnabled', $enabled ? 1 : 0, 'pay', '余额支付密码开关(开启后余额支付需验证 6 位支付密码)'); + + if (isset($row['fc_pay_virtualPayAudit'])) { + $audit = (int)$row['fc_pay_virtualPayAudit']; + self::put('pay.virtualPayAudit', $audit ? 1 : 0, 'pay', '微信提审防审模式开关(1=审核中隐藏支付, 0=正常运营)'); + } } /** diff --git a/scratch/add_miniapp_config.php b/scratch/add_miniapp_config.php new file mode 100644 index 0000000..e9b0fd1 --- /dev/null +++ b/scratch/add_miniapp_config.php @@ -0,0 +1,33 @@ +where('name', 'configgroup')->value('value'); +$group = json_decode($groupVal, true) ?: []; +$group['miniapp'] = '小程序配置'; +think\Db::name('config')->where('name', 'configgroup')->update(['value' => json_encode($group, JSON_UNESCAPED_UNICODE)]); + +$exist = think\Db::name('config')->where('name', 'virtual_pay_audit')->find(); +if (!$exist) { + think\Db::name('config')->insert([ + 'name' => 'virtual_pay_audit', + 'group' => 'miniapp', + 'title' => '提审防审模式', + 'tip' => '微信审核期间请开启;审核通过后设为关闭,全端立即恢复会员原价与微信支付直接开通', + 'type' => 'radio', + 'content' => json_encode(['1' => '开启(微信审核中:隐藏直接支付)', '0' => '关闭(审核已通过:全端恢复直接支付)'], JSON_UNESCAPED_UNICODE), + 'value' => '1', + 'rule' => 'required' + ]); +} else { + think\Db::name('config')->where('name', 'virtual_pay_audit')->update([ + 'group' => 'miniapp', + 'title' => '提审防审模式', + 'tip' => '微信审核期间请开启;审核通过后设为关闭,全端立即恢复会员原价与微信支付直接开通', + 'type' => 'radio', + 'content' => json_encode(['1' => '开启(微信审核中:隐藏直接支付)', '0' => '关闭(审核已通过:全端恢复直接支付)'], JSON_UNESCAPED_UNICODE), + ]); +} +echo "CONFIG_SUCCESS\n"; diff --git a/scratch/check_member_tags.js b/scratch/check_member_tags.js new file mode 100644 index 0000000..c67868a --- /dev/null +++ b/scratch/check_member_tags.js @@ -0,0 +1,22 @@ +const fs = require('fs'); + +const files = [ + 'uniapp/pages/member/index.vue', + 'uniapp/pages/member/recharge.vue' +]; + +let allOk = true; +for (const file of files) { + const content = fs.readFileSync(file, 'utf8'); + const openTemplate = (content.match(/