设为首页收藏本站
  • 官方微信
    lmkj_wx 微信公众号 添加方式:
    1:扫描左侧二维码
  • 手机访问
    lmkj_sj
  •  找回密码
     立即注册

    QQ登录

    只需一步,快速开始

    查看: 22|回复: 0

    传奇游戏在服务端里添加充值记录

    [复制链接]
    avatar
    • 打卡等级:魔龙套勇士
    • 打卡总天数:130
    • 打卡月天数:23
    • 打卡总奖励:14868
    • 最近打卡:2025-08-23 00:38:01

    7084

    主题

    150

    回帖

    8650

    积分

    管理员

    本站站长

    积分
    8650
    online_admin 发表于 2025-7-27 16:36:42 | 显示全部楼层 |阅读模式
    在传奇游戏服务端中添加充值记录功能,需通过数据库存储+脚本触发记录+查询机制实现,用于追踪玩家充值信息(金额、时间、订单号等)。以下是针对主流引擎(GOM、GEE、BLUE)的详细实现方案,包含具体代码和配置步骤:
    一、前期准备
    1. 工具与环境
    数据库工具:MySQL(推荐,支持多端同步)或 Access(适合单机服务端,如 BLUE 引擎默认)。
    脚本编辑器:Notepad++(编辑服务端脚本)。
    核心文件:
    支付回调脚本(如PayCallBack.txt,处理充值通知)。
    数据库配置文件(如DataBase.ini,配置数据库连接)。
    二、步骤 1:创建充值记录数据库表
    需新建一张表存储充值记录,以下是两种数据库的表结构设计:
    (1)MySQL 数据库(推荐 GOM/GEE 引擎)
    使用 Navicat 或 MySQL 命令行创建表pay_log:

    sql
    CREATE TABLE `pay_log` (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
      `account` varchar(50) NOT NULL COMMENT '玩家账号(与登录账号一致)',
      `role_name` varchar(50) DEFAULT NULL COMMENT '角色名',
      `money` decimal(10,2) NOT NULL COMMENT '充值金额(单位:元)',
      `gold` int(11) NOT NULL COMMENT '获得元宝数量',
      `order_no` varchar(64) NOT NULL COMMENT '支付订单号(唯一,防重复)',
      `pay_type` varchar(20) DEFAULT NULL COMMENT '支付方式(微信/支付宝)',
      `pay_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '充值时间',
      `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态(1=成功,0=失败)',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_order_no` (`order_no`) COMMENT '订单号唯一约束'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='充值记录';
    (2)Access 数据库(适合 BLUE 引擎)
    用 DBC2000 创建PayLog.db,字段设置如下:

    字段名        类型        长度        说明(同 MySQL)
    id        自动编号        -        自增 ID
    account        文本        50        玩家账号
    role_name        文本        50        角色名
    money        双精度        -        充值金额
    gold        整数        -        元宝数量
    order_no        文本        64        订单号(设置 “唯一索引”)
    pay_type        文本        20        支付方式
    pay_time        日期 / 时间        -        充值时间
    status        整数        -        状态(1 = 成功,0 = 失败)
    三、步骤 2:配置服务端数据库连接
    服务端需连接数据库以写入记录,不同引擎配置方式不同:
    (1)GOM/GEE 引擎(MySQL)
    打开配置文件:Mir200\Envir\DataBase.ini
    配置 MySQL 连接信息(确保与创建表的数据库一致):

    ini
    [MySQL]
    Enable=1                  ; 启用MySQL(1=开启,0=关闭)
    Host=127.0.0.1            ; 数据库IP(本地服务填127.0.0.1)
    Port=3306                 ; 端口(默认3306)
    User=root                 ; 数据库用户名
    Password=123456           ; 数据库密码
    DataBase=mir2_pay         ; 数据库名(需包含创建的pay_log表)
    CharSet=utf8mb4           ; 字符集(避免中文乱码)
    (2)BLUE 引擎(Access)
    无需额外配置,将创建的PayLog.db放入服务端Mir200\DB目录,引擎会自动识别。
    四、步骤 3:编写充值记录脚本(核心)
    充值成功后,支付平台会通过回调接口通知服务端,需在处理 “加元宝” 的同时写入记录。
    (1)GOM 引擎脚本(Mir200\Envir\QuestDiary\Pay\PayCallBack.txt)
    lua
    -- 充值回调处理函数(支付平台通知服务端时触发)
    function OnPaySuccess(Account, RoleName, Money, Gold, OrderNo, PayType)
        -- 1. 校验订单是否已处理(防重复充值)
        local checkSql = "SELECT id FROM pay_log WHERE order_no = '" .. OrderNo .. "'"
        local result = DB_Query(checkSql)  -- 执行查询
        if result and #result > 0 then
            return 0  -- 订单已存在,返回失败
        end

        -- 2. 给玩家增加元宝(GOM引擎自带函数)
        local ret = AddYuanBao(Account, Gold)  -- 增加元宝
        if ret ~= 1 then
            return 0  -- 元宝添加失败,返回失败
        end

        -- 3. 写入充值记录到数据库
        local insertSql = string.format(
            "INSERT INTO pay_log (account, role_name, money, gold, order_no, pay_type, pay_time, status) " ..
            "VALUES ('%s', '%s', %.2f, %d, '%s', '%s', NOW(), 1)",
            Account, RoleName, Money, Gold, OrderNo, PayType
        )
        DB_Execute(insertSql)  -- 执行插入

        -- 4. 发送游戏内通知
        SendMsgToAccount(Account, "充值成功!到账" .. Gold .. "元宝,订单号:" .. OrderNo)

        return 1  -- 通知支付平台处理成功
    end
    (2)GEE 引擎脚本(Mir200\Envir\QuestDiary\System\PayNotice.txt)
    lua
    -- GEE引擎充值回调函数
    function PayCallBack(Account, OrderNo, Money, Gold, PayType)
        -- 1. 校验订单唯一性
        local check = DBQuery("SELECT * FROM pay_log WHERE order_no = '" .. OrderNo .. "'")
        if check ~= "" then
            return "FAIL"
        end

        -- 2. 增加元宝(GEE引擎函数)
        local player = GetPlayer(Account)
        if player then
            player.AddGold(Gold)  -- 给在线玩家加元宝
        else
            -- 玩家离线,写入离线元宝表(GEE需额外处理)
            DBExecute("INSERT INTO off_gold (account, gold) VALUES ('" .. Account .. "', " .. Gold .. ") ON DUPLICATE KEY UPDATE gold = gold + " .. Gold)
        end

        -- 3. 写入充值记录
        local roleName = player and player.Name or "离线玩家"
        local sql = string.format(
            "INSERT INTO pay_log (account, role_name, money, gold, order_no, pay_type, status) " ..
            "VALUES ('%s', '%s', %.2f, %d, '%s', '%s', 1)",
            Account, roleName, Money, Gold, OrderNo, PayType
        )
        DBExecute(sql)

        return "SUCCESS"
    end
    (3)BLUE 引擎脚本(Mir200\Envir\Script\PayScript.txt)
    lua
    -- BLUE引擎充值处理(Access数据库)
    function PaySuccess(Account, RoleName, Money, Gold, OrderNo, PayType)
        -- 1. 检查订单是否存在(Access查询语法)
        local checkSql = "SELECT * FROM PayLog WHERE order_no = '" .. OrderNo .. "'"
        local exists = DBQuery(checkSql)
        if exists then
            return 0
        end

        -- 2. 增加元宝(BLUE引擎函数)
        AddPlayerGold(Account, Gold)

        -- 3. 写入Access数据库(日期格式需用#包裹)
        local time = os.date("%Y-%m-%d %H:%M:%S")
        local insertSql = string.format(
            "INSERT INTO PayLog (account, role_name, money, gold, order_no, pay_type, pay_time, status) " ..
            "VALUES ('%s', '%s', %.2f, %d, '%s', '%s', #%s#, 1)",
            Account, RoleName, Money, Gold, OrderNo, PayType, time
        )
        DBExecute(insertSql)

        return 1
    end
    五、步骤 4:添加充值记录查询功能
    (1)GM 命令查询(供管理员使用)
    在 GM 脚本中添加查询命令(以 GOM 为例,Mir200\Envir\QuestDiary\Admin\AdminCmd.txt):

    lua
    -- 命令格式:@查询充值 玩家账号 [天数]
    function OnAdminCommand(AdminAccount, Command, Args)
        if Command == "查询充值" then
            local account = Args[1]  -- 玩家账号
            local days = Args[2] or 30  -- 默认查30天
            local sql = string.format(
                "SELECT pay_time, money, gold, order_no FROM pay_log " ..
                "WHERE account = '%s' AND pay_time >= DATE_SUB(NOW(), INTERVAL %d DAY) " ..
                "ORDER BY pay_time DESC",
                account, days
            )
            local result = DB_Query(sql)
            if not result or #result == 0 then
                SendMsgToAdmin(AdminAccount, "该玩家无充值记录")
                return 1
            end
            SendMsgToAdmin(AdminAccount, "查询到" .. #result .. "条记录:")
            for i, row in ipairs(result) do
                local msg = string.format(
                    "[%s] 金额:%.2f元,元宝:%d,订单号:%s",
                    row.pay_time, row.money, row.gold, row.order_no
                )
                SendMsgToAdmin(AdminAccount, msg)
            end
            return 1
        end
    end
    (2)Web 后台查询(可选,适合多管理员)
    用 PHP+MySQL 搭建简单查询页面(示例代码):

    php
    <?php
    // 连接数据库
    $conn = mysqli_connect("127.0.0.1", "root", "123456", "mir2_pay");
    if (!$conn) die("数据库连接失败");

    // 接收查询参数
    $account = $_GET['account'] ?? '';
    $sql = "SELECT * FROM pay_log WHERE account = '$account' ORDER BY pay_time DESC";
    $result = mysqli_query($conn, $sql);
    ?>

    <!-- 页面显示 -->
    <form method="get">
        玩家账号:<input type="text" name="account" value="<?= $account ?>">
        <button type="submit">查询充值记录</button>
    </form>

    <table border="1">
        <tr>
            <th>时间</th>
            <th>金额(元)</th>
            <th>元宝</th>
            <th>订单号</th>
            <th>支付方式</th>
        </tr>
        <?php while ($row = mysqli_fetch_assoc($result)): ?>
        <tr>
            <td><?= $row['pay_time'] ?></td>
            <td><?= $row['money'] ?></td>
            <td><?= $row['gold'] ?></td>
            <td><?= $row['order_no'] ?></td>
            <td><?= $row['pay_type'] ?></td>
        </tr>
        <?php endwhile; ?>
    </table>
    六、测试与验证
    模拟充值测试:
    通过支付平台的 “测试接口” 发起充值(如调用OnPaySuccess函数,传入测试参数)。
    检查数据库pay_log表是否新增记录,玩家元宝是否到账。
    防重复测试:
    用同一订单号重复发起充值,验证是否仅写入 1 条记录(依赖order_no唯一索引)。
    异常处理测试:
    断开数据库连接,测试充值失败时是否返回错误状态,避免玩家已支付但未到账。
    七、注意事项
    数据安全:
    对order_no等参数进行过滤,防止 SQL 注入(如用mysqli_real_escape_string处理字符串)。
    定期备份pay_log表,避免记录丢失。
    引擎兼容性:
    不同引擎的函数名不同(如加元宝函数:GOMAddYuanBao、GEEAddGold、BLUEAddPlayerGold),需替换为对应引擎的函数。
    日志记录:
    在脚本中添加操作日志(如WriteLog("PayLog", "账号"..Account.."充值"..Money.."元")),便于排查问题。

    通过以上步骤,可实现充值记录的完整存储与查询,满足游戏运营中的财务对账和玩家咨询需求。

    您需要登录后才可以回帖 登录 | 立即注册 qq_login

    本版积分规则

    QQArchiver 手机版 小黑屋 39传奇素材网 ( 蜀ICP备2022016510号-3 )

    快速回复 快速发帖 返回顶部 返回列表