跳轉至

匹配 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 帳號識別碼 long
point 比賽中使用的分數。輸入範圍為0 ~ 999,999,999。如果未輸入,將使用`0`。 integer
extraData 額外的帳號資訊(暱稱、等級、國家等)。最多可以輸入256個字元。它包含在比賽結果中。 string

回應

字段名称 描述
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) 字串 Y

路徑參數

欄位名稱 描述 類型 必填
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: 請求比賽時輸入的 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 回應,則匹配結果回調將因系統管理目的而在一定時間內不會發送。