39传奇素材网 发表于 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

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-- 玩家账号
      local days = Args 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.."元")),便于排查问题。

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

页: [1]
查看完整版本: 传奇游戏在服务端里添加充值记录