配对 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 返回 requested 和 matchingInProgress 状态,当匹配仍在进行中时。
 {
   "playerId": 100,
   "matchInfo": {
       "gameIndex": 1,
       "matchId": 1
   },
   "requestingStatus": "requested",
   "requestingInfo": {
       "requestTimeUtc": "2024-06-05T05:09:28.72",
       "point": 1000
   },
   "matchingInfo": {
       "status": "matchingInProgress"
   }
}
  
 在比赛完成后检查请求状态时,它返回matched或timeout结果。这是比赛已完成但尚未收到比赛结果回调的状态。
     {
       "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 响应,则匹配结果回调将在一定时间内因系统管理目的而不被传递。