$FAILED, "respMsg" => ""); if ($apiMethod == "common.roleQuery") { $bizResp["role"] = array(); $bizResp["guidRoles"] = array(); } else if ($apiMethod == "common.serverQuery") { $bizResp["serverList"] = array(); } else { $ret = $FAILED . ":apiMethodError"; \Logging\LogError($ret); echo $ret; exit; } // 验签 $payload = Signature::genPayload($apiMethod, $appkey, $reqTime, $bizParams, $gameType); $verifyRet = Signature::verify($payload, $signature, $pubkey); if ($verifyRet != 1) { $ret = $FAILED . ":sign_data_verify_failed"; \Logging\LogError($ret . " verifyRet:" . $verifyRet . " payload:" . $payload); echo $ret; exit; } if ($apiMethod == "common.roleQuery") { $ok = roleQuery($appid, $bizParams, $bizResp); } else if ($apiMethod == "common.serverQuery") { $ok = serverQuery($appid, $bizParams, $bizResp); } else { exit; } if ($ok) { $bizResp["respCode"] = "SUCCESS"; $bizResp["respMsg"] = ""; } // Response字段 类型 必选 说明 // bizResp String 是 响应参数,值为每个接口对应响应参数的JSON字符串 // apiMethod String 是 接口名称 // respTime String 是 响应时间,格式使用ISO8601规范,示例:2022-06-29T15:08:44+0800 // appkey String 是 游戏appkey // gameType String 是 游戏端类型,网游为client H5游戏为 h5 // signature String 是 响应签名(签名方式参见下文) // osType String 否 系统类型,ios或android $respTime = \CommFunc\StrDateTimeFormatConver("", DATE_ISO8601); $bizResp = \CommFunc\MyJson_encode($bizResp); $payload = Signature::genPayload($apiMethod, $appkey, $respTime, $bizResp, $gameType); \Logging\LogInfo("Response payload:" . print_r($payload, true)); $signature = Signature::sign($payload, $prikey); $responseData = array( "bizResp" => $bizResp, "apiMethod" => $apiMethod, "respTime" => $respTime, "appkey" => $appkey, "gameType" => $gameType, "signature" => $signature, "osType" => $osType, ); echo json_encode($responseData); } function roleQuery($appid, $bizParams, &$bizResp) { \Logging\LogInfo("roleQuery bizParams:" . $bizParams); $bizParams = json_decode($bizParams, true); // bizParams字段 类型 必选 说明 // roleId String 是 游戏角色ID // guid String 是 单个小7小号ID // guids String[] 否 多个小7小号ID // serverId String 否 区服ID,限定guid或guids参数对应的区服 // 注意: // 0. (重要)对于roleId需要保证游戏内的唯一性,如果角色id会重复,可通过拼接其他参数等方式实现唯一性。 // 1. roleId和guid(s)参数一般不会同时传递,但需要保证同时传递时接口也可正常使用。 // 2. guid和guids参数不会同时传递,但建议将guid参数和guids参数合并查询角色数据并在guidRoles字段中返回。 // 3. 按guid(s)查询时,如果传递了serverId,则只需要返回小号下对应区服的角色数据。 // 4. 请求参数中的roleId来源于SDK接口获取的角色信息或使用guid参数调用此接口查询返回的角色信息。 // bizResp字段 类型 必选 说明 // respCode String 是 响应码,SUCCESS代表成功 // respMsg String 是 响应提示信息 // role Role 是 角色信息,返回请求参数roleId对应的角色信息,未传递roleId请求参数查询时可返回空对象 {} // guidRoles Role[] 是 角色信息数组,返回请求参数guid或guids对应小号拥有的所有角色信息,若传递了serverId,则只需返回对应区服的角色数据;未传递guid或guids请求参数查询或没有角色数据时可返回空数组[] $roleId = $bizParams["roleId"]; // 这里传的是完整游戏账号,由前端登录后汇报给对方 $guid = $bizParams["guid"]; $guids = $bizParams["guids"]; $serverId = $bizParams["serverId"]; if (!$roleId && !$guid && !$guids) { $bizResp["respMsg"] = "not roleId guid guids"; return; } $gameServers = \CommFunc\GetGameServers($appid); // 指定游戏账号查询 if ($roleId) { $accIDInfoList = explode("@", $roleId); $infoCount = count($accIDInfoList); if ($infoCount < 3) { $bizResp["respMsg"] = "roleId error"; \Logging\LogError("roleQuery roleId:" . $roleId . " error -> explode:" . print_r($accIDInfoList, true)); return; } $sid = $accIDInfoList[$infoCount - 1]; $platform = $accIDInfoList[$infoCount - 2]; if ($appid != $platform) { $bizResp["respMsg"] = "roleId appid error"; \Logging\LogError("roleQuery roleId:" . $roleId . " error -> platform:" . $platform . " != appid:" . $appid); return; } $AccountID = join("@", array_slice($accIDInfoList, 0, $infoCount - 2)); $find = array("Channel" => $appid, "AccountID" => $AccountID); if (!\DBOper\FindOne("GameRoles", $find, $findData) || !isset($findData)) { $bizResp["respMsg"] = "roleId not found"; \Logging\LogError("roleQuery roleId:" . $roleId . " not found. find:" . print_r($find, true)); return; } if (!array_key_exists($sid, $findData)) { $bizResp["respMsg"] = "roleId not found serverId"; \Logging\LogError("roleQuery roleId:" . $roleId . " not role. sid:" . $sid); return; } $roleInfo = $findData[$sid]; $bizResp["role"] = getRoleObj($roleId, $AccountID, substr($sid, 1), $roleInfo, $gameServers); } // 多平台账号查询 else { $findDataList = array(); if ($guid && !$guids) { $find = array("Channel" => $appid, "AccountID" => $guid); if (!\DBOper\FindOne("GameRoles", $find, $findData) || !isset($findData)) { \Logging\LogInfo("roleQuery guid not found:" . print_r($find, true)); return true; } array_push($findDataList, $findData); } else { $queryguids = array(); if ($guids) { $queryguids = array_merge($queryguids, $guids); } if ($guid) { array_push($queryguids, $guid); } $find = array("Channel" => $appid, "AccountID" => array('$in' => $queryguids)); if (!\DBOper\Find("GameRoles", $find, $findDataList) || !isset($findDataList)) { \Logging\LogInfo("roleQuery queryguids not found:" . print_r($find, true)); return true; } } $guidRoles = array(); foreach ($findDataList as $findData) { if ($serverId) { $sid = "s" . $serverId; if (!array_key_exists($sid, $findData)) { continue; } $AccountID = $findData["AccountID"]; $roleInfo = $findData[$sid]; array_push($guidRoles, getRoleObj($AccountID . "@" . $appid . "@" . $sid, $AccountID, $serverId, $roleInfo, $gameServers)); } else { foreach ($findData as $field => $value) { $serverID = \CommFunc\GetServerIDBySid($field); if ($serverID <= 0) { continue; } $sid = $field; $AccountID = $findData["AccountID"]; $roleInfo = $value; array_push($guidRoles, getRoleObj($AccountID . "@" . $appid . "@" . $sid, $AccountID, $serverID, $roleInfo, $gameServers)); } } } $bizResp["guidRoles"] = $guidRoles; } return true; } function getRoleObj($roleId, $guid, $serverId, $roleInfo, $gameServers) { // Role字段 类型 (长度) 必选 说明 // roleId String (64) 是 游戏角色ID // guid String (64) 是 小7小号ID // roleName String (100) 是 角色名称 // serverId String (64) 是 角色所属区服ID // serverName String (64) 是 角色所属区服名称 // roleLevel String (100) 是 角色等级, 示例:100 // roleCE String (100) 是 角色战力,示例:20000 // roleStage String (100) 是 角色关卡,示例:2-3 // roleRechargeAmount Float (10,2) 是 角色总充值,精度为小数点后2位 // roleGuild String (100) 否 角色所属公会 $serverId .= ""; $serverName = ""; if (array_key_exists($serverId, $gameServers)) { $serverName = $gameServers[$serverId]["Name"]; } $FightPower = array_key_exists("FightPower", $roleInfo) ? $roleInfo["FightPower"] : 0; $AllCoinTotal = array_key_exists("AllCoinTotal", $roleInfo) ? round($roleInfo["AllCoinTotal"] / 100.0, 2) : 0; $FamilyName = array_key_exists("FamilyName", $roleInfo) ? $roleInfo["FamilyName"] : ""; if ($FamilyName == null) { $FamilyName = ""; } return array( "roleId" => $roleId, "guid" => $guid, "roleName" => $roleInfo["PlayerName"], "serverId" => $serverId, "serverName" => $serverName, "roleLevel" => $roleInfo["LV"] . "", "roleCE" => $FightPower . "", "roleStage" => "", "roleRechargeAmount" => $AllCoinTotal, "roleGuild" => $FamilyName, ); } function serverQuery($appid, $bizParams, &$bizResp) { \Logging\LogInfo("serverQuery bizParams:" . $bizParams); $bizParams = json_decode($bizParams, true); // bizParams字段 类型 必选 说明 // startTime String 是 开始时间,为空时表示不限制开始时间,格式使用ISO8601规范,示例:2022-06-29T15:08:44+0800 // endTime String 是 截止时间,为空时表示不限制截止时间,格式使用ISO8601规范 $startTime = $bizParams["startTime"]; $endTime = $bizParams["endTime"]; // $appid = "x7bt5"; // $startTime = "2022-06-29T15:08:44+0800"; // $endTime = "2022-07-10T17:25:50+0800"; $find = array("Channel" => $appid, "Statue" => \ServerOPS\ServerStatue::Open); $StartDateCond = array(); if ($startTime) { $startTime = \CommFunc\StrDateTimeFormatConver($startTime); $StartDateCond['$gte'] = $startTime; } if ($endTime) { $endTime = \CommFunc\StrDateTimeFormatConver($endTime); $StartDateCond['$lte'] = $endTime; } if (count($StartDateCond) > 0) { $find["StartDate"] = $StartDateCond; } \DBOper\Find("GameServers", $find, $serverDataList); $serverList = array(); if (isset($serverDataList)) { foreach ($serverDataList as $serverData) { // Server字段 类型 必选 说明 // serverId String 是 区服ID(区服编号) // serverTime String 是 开服时间,格式使用ISO8601规范,示例:2022-06-29T15:08:44+0800 // serverName String 否 区服名称,可为空 // apiServer String 否 api区服,如不为空,角色信息查询等接口会优先使用此值作为serverId进行调用查询 array_push($serverList, array( "serverId" => $serverData["ServerID"] . "", "serverTime" => \CommFunc\StrDateTimeFormatConver($serverData["StartDate"], DATE_ISO8601), "serverName" => $serverData["ServerName"], "apiServer" => "", )); } } $bizResp["serverList"] = $serverList; return true; }