传奇游戏在服务端里添加充值记录
在传奇游戏服务端中添加充值记录功能,需通过数据库存储+脚本触发记录+查询机制实现,用于追踪玩家充值信息(金额、时间、订单号等)。以下是针对主流引擎(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]