dede会员充值金额如何直接到账?

99ANYc3cd6
预计阅读时长 31 分钟
位置: 首页 DEDE建站 正文

核心步骤概览

  1. 定位文件:找到并修改会员中心的充值页面模板文件。
  2. 修改表单:移除支付方式选择的单选按钮,只保留金额输入框和提交按钮。
  3. 修改处理逻辑:找到处理充值请求的PHP文件,修改其代码,使其直接更新数据库中的会员金额/积分,并生成充值记录。
  4. (可选)增加后台审核功能:更安全的方式是,在前台提交充值申请,然后在后台由管理员审核确认后,金额才到账,下面会提供两种方案。

直接充值(无审核)

这种方式最简单,用户提交后金额立即到账,适用于内部管理、虚拟币等场景。

dede会员输入金额直接充值到账
(图片来源网络,侵删)

第一步:修改充值页面模板

  1. 找到文件: 通常位于 templets/default/member/ 目录下,文件名为 charge.htmrecharge.htm,具体名称取决于你的DedeCMS版本和模板。

  2. 编辑文件: 用代码编辑器(如 VS Code, Sublime Text, Dreamweaver)打开这个文件。

  3. 修改代码: 你需要找到类似这样的支付方式选择部分,并将其注释掉或删除。

    原始代码可能长这样:

    dede会员输入金额直接充值到账
    (图片来源网络,侵删)
    <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">&nbsp;</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">&nbsp;</td>
                <td><input type="submit" name="submit" value="立即充值" class="coolbg np" /></td>
            </tr>
        </table>
    </form>

    关键修改点

    • 移除了支付方式选择的 <tr> 部分。
    • dopost 的值从 alipay 改为 pay(或其他自定义值),以便在PHP文件中区分是直接充值还是第三方支付。

第二步:修改处理逻辑的PHP文件

  1. 找到文件: 通常位于 /member/ 目录下,文件名为 mcharge.php

  2. 编辑文件: 在文件中找到处理 dopost 参数的 switch 语句。

    dede会员输入金额直接充值到账
    (图片来源网络,侵删)
  3. 修改代码: 在 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;

第四步:创建后台审核功能

  1. 在后台创建一个专门管理充值订单的页面,/dede/charge_manage.php
  2. 在这个页面中,列出所有 status = 0 的待审核订单。
  3. 为每个订单提供“审核通过”和“审核拒绝”的按钮。
  4. 点击“审核通过”时,执行方案一中的更新会员金额和记录日志的逻辑,然后将订单的 status 改为 1
  5. 点击“审核拒绝”时,只需将订单的 status 改为 2,并可以填写拒绝原因。

总结与注意事项

  • 备份数据:在进行任何数据库和文件修改之前,务必备份数据库和网站文件
  • 权限:确保你的网站目录有正确的读写权限,特别是 /member/ 目录和数据库。
  • 字段名dede_member 表中的金额字段可能是 money,也可能是 jifen(积分)或其他,请根据你的实际情况修改SQL语句中的字段名。
  • 安全性:方案一虽然简单,但直接操作数据库,务必做好输入验证,防止SQL注入等安全问题,方案二通过后台审核,流程更规范,安全性更高。
  • 测试:修改完成后,务必先用一个测试账号进行完整的充值流程测试,确保功能正常。

选择适合你网站运营模式的方案进行操作即可,对于大多数商业网站,方案二(后台审核)是更稳妥的选择

-- 展开阅读全文 --
头像
dede副栏目如何快速选择?栏目快速选择器怎么用?
« 上一篇 2025-12-21
爱风尚dede内核淘宝客导购程序有什么优势?
下一篇 » 2025-12-21

相关文章

取消
微信二维码
支付宝二维码

目录[+]