游戏充值订单金额修改思路与实践

2025-05-15 22:28:00

一、目的

修改游戏中元宝充值订单金额,如下图将3000元订单改为一元

二、思路与实践

首先我们先了解一下微信和支付宝在app中的调用流程(图片来源网络,侵删):

上图中可以看到, 商户app请求订单 -> 商户Server返回支付参数 -> 商户app调起第三方支付。(微信,支付宝同理)

那么我们是否可以在app调起第三方支付时将商户Server返回的参数中的订单金额修改掉。

上一篇中我们已经解密了传奇手游的lua脚本代码,这里不在赘述。

在手游脚本中搜索“支付”关键字,有很多脚本,最后我们锁定“CallFCommand.lua”

第一次尝试时,找错了代码,所以没有成功,这个文章后面我会讲。我们先讲成功修改的方法。

锁定代码:

local jData = {}

jData.productPrice = tostring( price )

jData.productId = tostring( requestID )

jData.productName = tostring( name )

jData.productCoin = tostring( game_coin )

jData.roleName = propertyProxy:GetName()

jData.roleId = loginProxy:GetSelectedRoleID()

jData.serverId = loginProxy:GetSelectedServerId()

jData.serverName = loginProxy:GetSelectedServerName()

jData.userId = tostring( AuthProxy:GetUsername() )

jData.srvDomain = tostring( loginProxy:GetSelectedServerDomain() )

jData.ext = string.format("%s|%s|%s", serverip, platform, jsonData.order_no)

jData.order_no = jsonData.order_no

jData.roleCreate = tostring( loginProxy:GetSelectedRoleCTime() ) -- 创建时间

jData.rolePower = tostring( propertyProxy:GetMainPlayerPower() ) -- 战力

jData.roleJob = tostring( GetJobName(propertyProxy:GetRoleJob()) ) -- 职业 战/法/道

jData.roleSex = tostring( propertyProxy:GetRoleSex() + 1 ) -- 性别 1男 2女

jData.vipLevel = tostring( 0 ) -- vip等级

jData.roleVIPLev = tostring( 0 ) -- vip等级

jData.roleLevel = tostring( propertyProxy:GetRoleLevel() ) -- 角色等级

jData.roleBalance = tostring( MoneyProxy:GetMoneyCountById(4, true, true) ) -- 当前元宝数量

dump(jData)

-- on call of father

global.L_NativeBridgeManager:GN_onCallOF(jData)

观察代码,price变量在其他位置的代码注释中标注为付款金额(元),我们猜测这里有可能是商户server返回的订单信息,并且方法结尾有一个Native层的方法调用。

我们先输出一下price

release_print("test测试".. tostring( price ))

可以看到这里是我们调起10元充值的金额数。

我们直接将此处的price改为固定值为1

jData.productPrice = tostring( 1 )

这里我们重新加密.lua文件后不能按前一篇的方法,MT管理器直接覆盖掉apk目录下的同名文件。

因为apk安装之后路径下是没有“CallFCommand.lua”文件的,我搜索了整个手机文件都没有找到。(有知道的朋友欢迎交流)

所以我们这次采用重新打包apk。

apktool -b {路径}

打包后记得签名,如果对apktool命令不熟练,可以使用androidkiller中的apk签名。

安装后调起支付如下图,抓取到的支付信息是档位8,3000元的支付信息。

到这里我们已经修改成功,此方法只适用于商户server不校验真实充值金额的场景。商户server可以拿到充值后的订单详情,如果校验真实充值金额,那么可能会收不到充值的游戏道具。

第一次我锁定了这段错误代码,因为它的注释很清楚的有金额

local suffixTable =

{

["actor_id"] = loginProxy:GetSelectedRoleID(), -- 角色id

["ext"] = tostring(os.time()), -- 透传参数

["game_coin"] = tostring(game_coin), -- 游戏币数量

["game_id"] = tostring(moduleID), -- 游戏id

["money"] = tostring(price), -- 付款金额(元)

["product_id"] = tostring(id), -- 充值档位

["sid"] = loginProxy:GetSelectedServerId(), -- 区服id

["subject"] = tostring(name), -- 物品描述

["uid"] = tostring(AuthProxy:GetUsername()), -- 用户账号

["platform"] = platform, -- 渠道id

["sChrName"] = envProxy:GetAPKPackageName(), -- 包名

["actid"] = actID, -- 活动ID

}

我们将付款金额改为固定值1

["money"] = tostring(1), -- 付款金额(元)

我们看它返回的money还是10,我们尝试修改这个返回值,看是否可以

点击链接右键 -> save Response -> Map local Settings

但依然没有成功修改数值,此时我再次查看lua代码时才发现另一处代码。应该就是商户server返回信息调起支付的代码。跳转文章开头。