跳转至

配对 API

先决条件

要使用匹配 API,您需要准备以下项目。

  • API调用的身份验证令牌(Certification Key):Hive 控制台应用中心 > 管理项目 > 从游戏列表中选择您的游戏 > 游戏详情 > 基本信息 > 认证密钥
  • 游戏索引(gameIndex):Hive 控制台应用中心 > 管理项目 > 从游戏列表中选择您的游戏 > 游戏详情 > 基本信息 > 游戏索引
  • 匹配ID(matchId):您可以在Hive 控制台创建匹配时检查此项。

请求 URL 根

服务器 网址
实时 api-match.withhive.com
沙盒 sandbox-api-match.withhive.com

常见响应代码

这些是常见的API响应代码。

代码 描述
200 成功 参考每个API响应
400 错误请求 请求参数或请求体输入不正确
401 未授权 请求消息中的授权头缺失或无效
403 禁止 API调用的身份验证令牌(认证密钥)无效
404 未找到 API路径不正确
500 内部服务器错误 发生内部服务器错误

请求匹配

当每个用户请求匹配时调用此 API。与 matchId 对应的匹配必须在 Hive 控制台中预先创建。

请求 URL

实时 URL https://api-match.withhive.com/gameindexes/{gameIndex}/matchmakings/{matchId}/players
沙盒 URL https://sandbox-api-match.withhive.com/gameindexes/{gameIndex}/matchmakings/{matchId}/players
HTTP 方法 POST
内容类型 application/json

头部参数

字段名称 描述 类型 必需
授权 API调用的身份验证令牌(Bearer) 字符串

路径参数

字段名称 描述 类型 是否必需
gameIndex 在Hive 控制台应用中心可用的项目标识符 int
matchId 在Hive 控制台中创建的每个比赛标识符 int

请求体

字段名称 描述 类型 必需
playerId 账户标识符 长整型
point 用于比赛的分数。输入范围是0 ~ 999,999,999。如果未输入,将使用`0`。 整数
extraData 附加账户信息(昵称、等级、国家等)。最多可以输入256个字符。它包含在比赛结果中。 字符串

回复

字段名称 描述
playerId 账户标识符
matchInfo 请求目标信息
  • gameIndex: gameIndex
  • matchId: matchId
requestingStatus 请求状态信息
  • requested: 匹配请求成功
  • notRequested: 匹配未被请求,或匹配已完成,因此没有正在进行的匹配请求
requestingInfo 请求信息
  • requestTimeUtc: UTC+0 的请求时间
  • point: 请求时输入的point
  • extraData: 请求时输入的extraData
matchingInfo 匹配状态信息 (status)
  • matchingInProgress: 匹配进行中
  • timeout: 匹配未在时间限制内完成
  • matched: 匹配已完成

请求示例

curl --location 'https://sandbox-api-match.withhive.com/gameindexes/1/matchmakings/1/request' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJIaXZlIiwiaWF0IjoxNzAyNDU4MTkzLCJqdGkiOiIxMzY2NDk4MjcxIn0.VSwvsTE-tS0sL_e9p9gNvHRkMCbsycSO4ObE4J2ya3a' \
--data '{
   "playerId":100,
   "point": 1000
}'

响应示例

{
   "playerId": 100,
   "matchInfo": {
       "gameIndex": 1,
       "matchId": 1
   },
   "requestingStatus": "requested",
   "requestingInfo": {
       "requestTimeUtc": "2024-06-05T05:09:28.72",
       "point": 1000
   },
   "matchingInfo": {
       "status": "matchingInProgress"
   }
}

检查匹配状态

检查请求比赛的状态。

请求 URL

实时 URL https://api-match.withhive.com/gameindexes/{gameIndex}/matchmakings/{matchId}/players
沙盒 URL https://sandbox-api-match.withhive.com/gameindexes/{gameIndex}/matchmakings/{matchId}/players
HTTP 方法 GET

头部参数

字段名称 描述 类型 必需
授权 API调用的身份验证令牌(Bearer) 字符串

路径参数

字段名称 描述 类型 必需
gameIndex 在 Hive 控制台应用中心可用的项目标识符 int
matchId 在 Hive 控制台中生成的每场比赛的标识符 int

查询参数

字段名称 描述 类型 是否必填
id 用户ID (`playerId`) long Y

响应

字段名称 描述
playerId 账户标识符
matchInfo 请求的信息
  • gameIndex: gameIndex
  • matchId: matchId
requestingStatus 请求状态信息
  • requested: 匹配请求成功
  • notRequested: 匹配未被请求,或者匹配已经完成,因此没有正在进行的匹配请求
requestingInfo 请求信息
  • requestTimeUtc: UTC+0 的请求时间
  • point: 请求时输入的point
  • extraData: 请求时输入的extraData
matchingInfo 匹配状态信息 (status)
  • matchingInProgress: 匹配进行中
  • timeout: 匹配未在时间限制内完成
  • matched: 匹配完成

请求示例

curl --location --request GET 'https://sandbox-api-match.withhive.com/gameindexes/1/matchmakings/1/players?id=100' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJIaXZlIiwiaWF0IjoxNzAyNDU4MTkzLCJqdGkiOiIxMzY2NDk4MjcxIn0.VSwvsTE-tS0sL_e9p9gNvHRkMCbsycSO4ObE4J2ya3a'

响应示例

当您尚未发出匹配请求时,匹配状态如下。

{
   "playerId": 100,
   "matchInfo": {
       "gameIndex": 1,
       "matchId": 1
   },
   "requestingStatus": "notRequested"
}


Request Match 返回 requestedmatchingInProgress 状态,当匹配仍在进行中时。

{
   "playerId": 100,
   "matchInfo": {
       "gameIndex": 1,
       "matchId": 1
   },
   "requestingStatus": "requested",
   "requestingInfo": {
       "requestTimeUtc": "2024-06-05T05:09:28.72",
       "point": 1000
   },
   "matchingInfo": {
       "status": "matchingInProgress"
   }
}


在比赛完成后检查请求状态时,它返回matchedtimeout结果。这是比赛已完成但尚未收到比赛结果回调的状态。

    {
       "playerId": 100,
       "matchInfo": {
           "gameIndex": 1,
           "matchId": 1
       },
       "requestingStatus": "requested",
       "requestingInfo": {
           "requestTimeUtc": "2024-06-05T05:09:28.72",
           "point": 1000
       },
       "matchingInfo": {
           "status": "matched"
       }
   }


一旦比赛完成,Hive 服务器会将 比赛结果回调 发送到您的服务器。如果您的服务器接收到比赛结果回调,返回 HTTPStatus 200 给 Hive 服务器,并且如果您再次检查比赛请求状态,它将变为 notRequested,并且 matchingInfo 键将被删除,如下所示。这是因为 Hive 服务器在收到回调的 HTTPStatus 200 后认为您的比赛请求已完成,并删除比赛请求事务。

{
   "playerId": 100,
   "matchInfo": {
       "gameIndex": 1,
       "matchId": 1
   },
   "requestingStatus": "notRequested"
}


匹配请求前 匹配请求后 匹配结果创建后 回调接收后
requestingStatus 未请求 已请求 已请求 未请求
matchingInfo > Status 不适用 匹配进行中 已匹配或超时 不适用
备注 匹配进行中 回调接收前

取消匹配请求

取消匹配请求。当您取消匹配请求时,匹配请求交易将从 Hive 服务器中删除。

如果在 请求匹配 之后比赛已完成,并且您已收到 匹配结果回调 并以 HTTPStatus 200 响应,则 Hive 服务器将认为匹配已完成并删除匹配请求事务。在此状态下,即使您调用取消匹配请求,由于匹配请求事务已被删除,取消操作将不会执行,也不会返回任何异常。

请求 URL

实时 URL https://api-match.withhive.com/gameindexes/{gameIndex}/matchmakings/{matchId}/players/{playerId}
沙盒 URL https://sandbox-api-match.withhive.com/gameindexes/{gameIndex}/matchmakings/{matchId}/players/{playerId}
HTTP 方法 DELETE

头部参数

字段名称 描述 类型 必需
授权 API调用的身份验证令牌(Bearer) 字符串

路径参数

字段名称 描述 类型 是否必填
gameIndex 在Hive 控制台应用中心中可用的项目标识符 int
matchId 在Hive 控制台中创建的每个比赛的标识符 int
playerId 用户ID long

响应

如果是200 OK,则主体为空。

请求示例

curl --location --request DELETE 'https://sandbox-api-match.withhive.com/gameindexes/1/matchmakings/1/players/100' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJIaXZlIiwiaWF0IjoxNzAyNDU4MTkzLCJqdGkiOiIxMzY2NDk4MjcxIn0.VSwvsTE-tS0sL_e9p9gNvHRkMCbsycSO4ObE4J2ya3a'

响应示例

如果请求正常取消,则没有特定的响应。

匹配结果回调

当比赛完成时,Hive 服务器会将比赛结果作为回调发送到您的服务器。如果您的服务器没有任何问题地接收到比赛结果回调,则您的服务器应以 HttpStatus 200 响应。通过在 Hive 控制台中注册所需的服务器 URL,比赛结果将作为回调发送到此地址。该地址必须是一个公开可访问的 URL。API 信息如下。

回调接收 URL (Hive 服务器 → 你的服务器)

当您的服务器 API 端点在 Hive 控制台中注册时,Hive 服务器在匹配完成后将回调结果发送到此端点。

头部参数

字段名称 描述 类型 必需
X-Match-Signature 使用 HMAC SHA-256 算法加密主体内容的签名值 字符串

通过回调传递的值

字段名称 描述 类型
gameIndex 已完成比赛的 gameIndex 值 int
matchId 已完成比赛的 matchId 值 int
matchingInfos 匹配的应用用户信息数组。`playerId` 字段值为 `0` 的用户被视为机器人。
  • matchingId: 比赛 id
  • privateInfos: 在单人游戏中匹配的用户信息数组(与 timeoutPlayerInfos 相同的格式)
  • teamInfos: 在团队游戏中匹配的用户信息数组(teamIndex: 队伍编号,playerInfos: 队员信息数组,与 timeoutPlayerInfos 相同的格式)
json
timeoutPlayerInfos 未匹配并超时的应用用户信息数组
  • extraData: 请求比赛时输入的 extraData
  • point: 请求比赛时输入的点数
  • playerId: 请求比赛时输入的 playerId
json

回调示例 (Hive 服务器 → 你的服务器)

curl --location 'The API endpoint of your server registered in the Hive Console.' --header 'Content-Type: application/json' --header 'X-Match-Signature: nj2YlgGTlLXcAhrl6ijSgfD71gTWokBiM8WPn72xxg8=' --data '{
   "gameIndex": 1,
   "matchId": 1,
   "matchingInfos": [
       {
           "matchingId": "1:1_2024-06-05T05:43:28.91_1",
           "privateInfos": [
               {
                   "playerId": 100,
                   "point": 1000
               },
               {
                   "playerId": 101,
                   "point": 1000
               }
           ]
       }
   ],
   "timeoutPlayerInfos": []
}'


您可以使用头参数 X-Match-Signature 的值来验证回调结果的真实性,用于算法计算的密钥可以在 Hive 控制台中找到。下面是获取签名的 Java 代码示例。

import java.nio.charset.StandardCharsets;
import java.util.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
public class MatchSignature {  
   private static final String HMAC_SHA_256 = "HmacSHA256";
   private static final String UTF_8 = "UTF-8";
   public String getSignature(String secret, String httpRequestBody) throws Exception {
       SecretKeySpec key = new SecretKeySpec(secret.getBytes(), HMAC_SHA_256);
       Mac mac = Mac.getInstance(HMAC_SHA_256);
       mac.init(key);
       byte[] source = httpRequestBody.getBytes(UTF_8);

       return new String(Base64.getEncoder().encode(mac.doFinal(source)), StandardCharsets.UTF_8);
   }
}


如果从 Hive 服务器发送的回调成功接收,您应该返回 HTTP 状态 200 作为响应。

  • 响应状态为 HttpStatus 200:认为匹配已成功完成,因此匹配请求将被取消。
  • 响应值不是 HttpStatus 200 或超时:匹配结果回调将定期重新发送。

如果 Hive 服务器无法持续接收 HTTP 状态 200 响应,则匹配结果回调将在一定时间内因系统管理目的而不被传递。