核心步骤概览
- 定位文件:找到并修改会员中心的充值页面模板文件。
- 修改表单:移除支付方式选择的单选按钮,只保留金额输入框和提交按钮。
- 修改处理逻辑:找到处理充值请求的PHP文件,修改其代码,使其直接更新数据库中的会员金额/积分,并生成充值记录。
- (可选)增加后台审核功能:更安全的方式是,在前台提交充值申请,然后在后台由管理员审核确认后,金额才到账,下面会提供两种方案。
直接充值(无审核)
这种方式最简单,用户提交后金额立即到账,适用于内部管理、虚拟币等场景。

(图片来源网络,侵删)
第一步:修改充值页面模板
-
找到文件: 通常位于
templets/default/member/目录下,文件名为charge.htm或recharge.htm,具体名称取决于你的DedeCMS版本和模板。 -
编辑文件: 用代码编辑器(如 VS Code, Sublime Text, Dreamweaver)打开这个文件。
-
修改代码: 你需要找到类似这样的支付方式选择部分,并将其注释掉或删除。
原始代码可能长这样:
(图片来源网络,侵删)<form name='alipayment' action='{dede:global.cfg_memberurl/}/mcharge.php' method='post'> <input type="hidden" name="dopost" value="alipay"> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tr> <td height="50" align="right">充值金额:</td> <td><input name="money" type="text" id="money" size="20" value="0" class="textinput" /></td> </tr> <tr> <td height="50" align="right">支付方式:</td> <td> <input type="radio" name="pdtype" id="pdtype1" value="alipay" checked="checked" /> <label for="pdtype1">支付宝</label> <!-- 可能有其他支付方式,如微信 --> <input type="radio" name="pdtype" id="pdtype2" value="tenpay" /> <label for="pdtype2">财付通</label> </td> </tr> <tr> <td height="50" align="right"> </td> <td><input type="submit" name="submit" value="立即充值" class="coolbg np" /></td> </tr> </table> </form>修改后的代码(直接充值版):
<form name='directcharge' action='{dede:global.cfg_memberurl/}/mcharge.php' method='post'> <input type="hidden" name="dopost" value="pay"> <!-- 修改dopost值,避免与原有逻辑冲突 --> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tr> <td height="50" align="right">充值金额:</td> <td><input name="money" type="text" id="money" size="20" value="0" class="textinput" /></td> </tr> <!-- <tr> <td height="50" align="right">支付方式:</td> <td> <input type="radio" name="pdtype" id="pdtype1" value="alipay" checked="checked" /> <label for="pdtype1">支付宝</label> <input type="radio" name="pdtype" id="pdtype2" value="tenpay" /> <label for="pdtype2">财付通</label> </td> </tr> --> <tr> <td height="50" align="right"> </td> <td><input type="submit" name="submit" value="立即充值" class="coolbg np" /></td> </tr> </table> </form>关键修改点:
- 移除了支付方式选择的
<tr>部分。 - 将
dopost的值从alipay改为pay(或其他自定义值),以便在PHP文件中区分是直接充值还是第三方支付。
- 移除了支付方式选择的
第二步:修改处理逻辑的PHP文件
-
找到文件: 通常位于
/member/目录下,文件名为mcharge.php。 -
编辑文件: 在文件中找到处理
dopost参数的switch语句。
(图片来源网络,侵删) -
修改代码: 在
switch语句中,添加一个新的case 'pay'来处理直接充值逻辑。在
mcharge.php中添加如下代码:// ... 文件顶部和 switch 语句之前保持不变 ... switch($dopost) { // ... 原有的 'alipay', 'tenpay' 等case保持不变 ... // 新增:直接充值逻辑 case 'pay': // 1. 检查金额是否合法 if(empty($money) || !is_numeric($money) || $money <= 0) { ShowMsg('充值金额必须大于0!', '-1'); exit(); } // 2. 获取当前会员信息 $uid = $cfg_ml->M_ID; $row = $dsql->GetOne("SELECT `money`, `scores` FROM `dede_member` WHERE `mid` = '$uid'"); if(!$row) { ShowMsg('会员信息获取失败!', '-1'); exit(); } // 3. 计算新金额(这里以增加金钱为例,也可以增加积分 scores) $new_money = $row['money'] + $money; // 4. 更新会员表中的金额 $sql = "UPDATE `dede_member` SET `money` = '$new_money' WHERE `mid` = '$uid'"; if($dsql->ExecuteNoneQuery($sql)) { // 5. 记录充值日志(非常重要!) $loginfo = "在线直接充值,金额:¥{$money}"; $inquery = "INSERT INTO `dede_member_st`(`mid`,`money`,`sdate`,`type`,`moneytype`,`loginfo`) VALUES ('$uid','$money','".time()."','1','money','$loginfo');"; $dsql->ExecuteNoneQuery($inquery); // 6. 提示成功 ShowMsg("恭喜您,充值成功!金额已到账。", "javascript:;"); exit(); } else { ShowMsg('充值失败,数据库更新错误!', '-1'); exit(); } break; default: ShowMsg('请求的操作不存在!', '-1'); exit(); }
代码解释:
- 金额验证:确保用户输入的是有效的正数。
- 获取会员信息:从
dede_member表中读取当前用户的money(余额)和scores(积分)。 - 更新余额:将新金额 (
$row['money'] + $money) 更新回dede_member表。 - 记录日志:向
dede_member_st(会员账单/流水表) 中插入一条记录,这是追踪资金变动的关键。 - 提示用户:使用
ShowMsg函数显示成功或失败信息。
后台审核(更安全)
方案一虽然方便,但存在风险(比如用户恶意输入负数,虽然代码有验证,但仍有其他潜在问题),方案二是更推荐的商业网站做法。
第一步:修改模板(同方案一)
模板文件修改和方案一完全一样,将 dopost 设为 pay,并移除支付方式选择。
第二步:修改PHP文件(改为生成待审核订单)
修改 mcharge.php 中的 case 'pay' 部分,逻辑变为:生成一个充值订单,但不直接增加金额,而是等待后台审核。
// ... 在 mcharge.php 的 switch 语句中 ...
case 'pay':
// 1. 检查金额是否合法
if(empty($money) || !is_numeric($money) || $money <= 0)
{
ShowMsg('充值金额必须大于0!', '-1');
exit();
}
// 2. 生成充值订单
$uid = $cfg_ml->M_ID;
$order_sn = 'CZ' . date('YmdHis') . rand(1000, 9999); // 生成唯一订单号
$loginfo = "申请在线充值,金额:¥{$money},订单号:{$order_sn}";
// 3. 插入到订单表(如果不存在,需要先创建一个表,dede_member_charge_order)
// 假设我们有一个表:dede_member_charge_order (mid, order_sn, money, status, addtime)
$sql = "INSERT INTO `dede_member_charge_order` (`mid`, `order_sn`, `money`, `status`, `addtime`)
VALUES ('$uid', '$order_sn', '$money', '0', '".time()."')";
if($dsql->ExecuteNoneQuery($sql))
{
// 4. 提示用户等待审核
ShowMsg("您的充值申请已提交成功!订单号:{$order_sn},请等待管理员审核后金额将自动到账。", "javascript:;");
exit();
}
else
{
ShowMsg('申请失败,请重试!', '-1');
exit();
}
break;
第三步:创建订单表 在你的数据库中,执行以下SQL语句,创建一个用于存储充值订单的表:
CREATE TABLE `dede_member_charge_order` ( `id` int(11) NOT NULL AUTO_INCREMENT, `mid` int(11) NOT NULL COMMENT '会员ID', `order_sn` varchar(50) NOT NULL COMMENT '订单号', `money` decimal(10,2) NOT NULL COMMENT '充值金额', `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态:0-待审核, 1-已成功, 2-已失败', `adminnote` text COMMENT '管理员备注', `addtime` int(11) NOT NULL COMMENT '申请时间', PRIMARY KEY (`id`), UNIQUE KEY `order_sn` (`order_sn`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
第四步:创建后台审核功能
- 在后台创建一个专门管理充值订单的页面,
/dede/charge_manage.php。 - 在这个页面中,列出所有
status = 0的待审核订单。 - 为每个订单提供“审核通过”和“审核拒绝”的按钮。
- 点击“审核通过”时,执行方案一中的更新会员金额和记录日志的逻辑,然后将订单的
status改为1。 - 点击“审核拒绝”时,只需将订单的
status改为2,并可以填写拒绝原因。
总结与注意事项
- 备份数据:在进行任何数据库和文件修改之前,务必备份数据库和网站文件!
- 权限:确保你的网站目录有正确的读写权限,特别是
/member/目录和数据库。 - 字段名:
dede_member表中的金额字段可能是money,也可能是jifen(积分)或其他,请根据你的实际情况修改SQL语句中的字段名。 - 安全性:方案一虽然简单,但直接操作数据库,务必做好输入验证,防止SQL注入等安全问题,方案二通过后台审核,流程更规范,安全性更高。
- 测试:修改完成后,务必先用一个测试账号进行完整的充值流程测试,确保功能正常。
选择适合你网站运营模式的方案进行操作即可,对于大多数商业网站,方案二(后台审核)是更稳妥的选择。
