API การจับคู่
 ข้อกำหนดเบื้องต้น
 ในการใช้ API การจับคู่ คุณต้องเตรียมรายการต่อไปนี้
  - โทเค็นการตรวจสอบสิทธิ์สำหรับการเรียก API (Certification Key): Hive Console App Center > จัดการโครงการ > เลือกเกมของคุณจากรายการเกม > รายละเอียดเกม > ข้อมูลพื้นฐาน > Certification Key
- ดัชนีเกม (gameIndex): Hive Console App Center > จัดการโครงการ > เลือกเกมของคุณจากรายการเกม > รายละเอียดเกม > ข้อมูลพื้นฐาน > Game Index
- หมายเลขการแข่งขัน (matchId): คุณสามารถตรวจสอบสิ่งนี้เมื่อสร้างการแข่งขันใน Hive Console.
URL รากคำขอ
   | เซิร์ฟเวอร์ | URL | 
  | LIVE | api-match.withhive.com | 
  | SANDBOX | sandbox-api-match.withhive.com | 
 
 รหัสการตอบกลับทั่วไป
 นี่คือรหัสการตอบสนอง API ที่พบบ่อย
   | รหัส | ค่า | คำอธิบาย | 
  | 200 | สำเร็จ | ดูที่การตอบสนองของ API แต่ละรายการ | 
  | 400 | คำขอไม่ถูกต้อง | พารามิเตอร์คำขอหรือข้อมูลในคำขอไม่ถูกต้อง | 
  | 401 | ไม่ได้รับอนุญาต | ส่วนหัวการอนุญาตในข้อความคำขอขาดหายไปหรือไม่ถูกต้อง | 
  | 403 | ห้ามเข้าถึง | โทเค็นการตรวจสอบสิทธิ์ (Certification Key) สำหรับการเรียก API ไม่ถูกต้อง | 
  | 404 | ไม่พบ | เส้นทาง API ไม่ถูกต้อง | 
  | 500 | ข้อผิดพลาดของเซิร์ฟเวอร์ภายใน | เกิดข้อผิดพลาดภายในเซิร์ฟเวอร์ | 
 
 การจับคู่คำขอ
 เมื่อผู้ใช้แต่ละคนขอแมตช์ ให้เรียกใช้ API นี้ แมตช์ที่ตรงกับ matchId จะต้องถูกสร้างล่วงหน้าใน Hive Console.
 URL ที่ร้องขอ
    | ลิงก์สด | https://api-match.withhive.com/gameindexes/{gameIndex}/matchmakings/{matchId}/players | 
    | ลิงก์แซนด์บ็อกซ์ | https://sandbox-api-match.withhive.com/gameindexes/{gameIndex}/matchmakings/{matchId}/players | 
  | วิธีการ HTTP | POST | 
  | ประเภทเนื้อหา | application/json | 
  
 พารามิเตอร์หัว
    | ชื่อฟิลด์ | คำอธิบาย | ประเภท | จำเป็น | 
  | การอนุญาต | โทเค็นการตรวจสอบสิทธิ์สำหรับการเรียก API (Bearer) | string | Y | 
  
 พารามิเตอร์เส้นทาง
   | ชื่อฟิลด์ | คำอธิบาย | ประเภท | จำเป็น | 
  | gameIndex | รหัสโปรเจกต์ที่มีอยู่ใน Hive Console App Center | int | ใช่ | 
  | matchId | รหัสการแข่งขันแต่ละรายการที่สร้างขึ้นใน Hive Console | int | ใช่ | 
 
 เนื้อหาคำขอ
    | ชื่อฟิลด์ | คำอธิบาย | ประเภท | จำเป็น | 
  | playerId | รหัสประจำตัวบัญชี | long | Y | 
  | point | คะแนนที่จะใช้ในการแข่งขัน ช่วงค่าที่ป้อนคือ 0 ~ 999,999,999หากไม่ป้อน จะใช้ค่า `0` | integer | N | 
  | extraData | ข้อมูลบัญชีเพิ่มเติม (ชื่อเล่น, ระดับ, ประเทศ, ฯลฯ) สามารถป้อนได้สูงสุด 256 ตัวอักษร จะรวมอยู่ในผลการแข่งขัน | string | N | 
  
 การตอบกลับ
    | ชื่อฟิลด์ | คำอธิบาย | 
  | playerId | รหัสบัญชี | 
  | matchInfo | ข้อมูลเป้าหมายการร้องขอ  gameIndex: ค่าของgameIndexmatchId: ค่าของmatchId | 
  | requestingStatus | ข้อมูลสถานะการร้องขอ  requested: การร้องขอการแข่งขันสำเร็จnotRequested: การแข่งขันไม่ได้ถูกขอ หรือการแข่งขันได้เสร็จสิ้นแล้วจึงไม่มีการร้องขอการแข่งขันที่กำลังดำเนินอยู่ | 
  | requestingInfo | ข้อมูลการร้องขอ  requestTimeUtc: เวลาที่ร้องขอใน UTC+0point: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 ขอ
    | ลิงก์สด | https://api-match.withhive.com/gameindexes/{gameIndex}/matchmakings/{matchId}/players | 
    | ลิงก์แซนด์บ็อกซ์ | https://sandbox-api-match.withhive.com/gameindexes/{gameIndex}/matchmakings/{matchId}/players | 
  | วิธีการ HTTP | GET | 
  
 พารามิเตอร์หัว
    | ชื่อฟิลด์ | คำอธิบาย | ประเภท | จำเป็น | 
  | การอนุญาต | โทเค็นการตรวจสอบสิทธิ์สำหรับการเรียก API (Bearer) | string | Y | 
  
 พารามิเตอร์เส้นทาง
   | ชื่อฟิลด์ | คำอธิบาย | ประเภท | จำเป็น | 
  | gameIndex | ตัวระบุโครงการที่มีอยู่ใน Hive Console App Center | int | ใช่ | 
  | matchId | ตัวระบุสำหรับแต่ละแมตช์ที่สร้างขึ้นใน Hive Console | int | ใช่ | 
 
 พารามิเตอร์การค้นหา
   | ชื่อฟิลด์ | คำอธิบาย | ประเภท | จำเป็น | 
  | id | รหัสผู้ใช้ (`playerId`) | long | Y | 
 
 การตอบสนอง
    | ชื่อฟิลด์ | คำอธิบาย | 
  | playerId | รหัสบัญชี | 
  | matchInfo | ข้อมูลที่ร้องขอ  gameIndex: ค่าgameIndexmatchId: ค่าmatchId | 
  | requestingStatus | ข้อมูลสถานะการร้องขอ  requested: การร้องขอแมตช์สำเร็จnotRequested: ไม่ได้ร้องขอแมตช์ หรือแมตช์ได้เสร็จสิ้นแล้วจึงไม่มีการร้องขอแมตช์ที่กำลังดำเนินอยู่ | 
  | requestingInfo | ข้อมูลการร้องขอ  requestTimeUtc: เวลาที่ร้องขอใน UTC+0point: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 | N/A | กำลังจับคู่ | จับคู่หรือหมดเวลา | N/A | 
  | Remarks |  | กำลังจับคู่ | ก่อนการรับการเรียกกลับ |  | 
  
 ยกเลิกคำขอการแข่งขัน
 ยกเลิกคำขอจับคู่ เมื่อคุณยกเลิกคำขอจับคู่ ธุรกรรมคำขอจับคู่จะถูกลบออกจาก Hive Server.
 หากการแข่งขันเสร็จสิ้นหลังจาก Request Match และคุณได้รับ Match Result Callback และตอบกลับด้วย 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) | string | Y | 
  
 พารามิเตอร์เส้นทาง
   | ชื่อฟิลด์ | คำอธิบาย | ประเภท | จำเป็น | 
  | gameIndex | รหัสโปรเจกต์ที่มีอยู่ใน Hive Console App Center | int | ใช่ | 
  | matchId | รหัสสำหรับแต่ละแมตช์ที่สร้างใน Hive Console | int | ใช่ | 
  | playerId | รหัสผู้ใช้ | 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'
ตัวอย่างการตอบกลับ
 ไม่มีการตอบสนองเฉพาะหากคำขอถูกยกเลิกตามปกติ
 ผลลัพธ์การจับคู่ callback
 เมื่อการแข่งขันเสร็จสิ้น เซิร์ฟเวอร์ Hive จะส่งผลการแข่งขันไปยังเซิร์ฟเวอร์ของคุณเป็นการเรียกกลับ หากเซิร์ฟเวอร์ของคุณได้รับการเรียกกลับผลการแข่งขันโดยไม่มีปัญหา เซิร์ฟเวอร์ของคุณควรตอบสนองด้วย HttpStatus 200 โดยการลงทะเบียน URL เซิร์ฟเวอร์ที่ต้องการใน Hive Console ผลการแข่งขันจะถูกส่งไปยังที่อยู่นี้เป็นการเรียกกลับ ที่อยู่ต้องเป็น URL ที่เข้าถึงได้สาธารณะ ข้อมูล API มีดังนี้
 URL การรับ Callback (Hive เซิร์ฟเวอร์ → เซิร์ฟเวอร์ของคุณ)
 เมื่อจุดสิ้นสุด API เซิร์ฟเวอร์ของคุณถูกลงทะเบียนใน Hive Console เซิร์ฟเวอร์ Hive จะส่งผลลัพธ์การเรียกกลับไปยังจุดสิ้นสุดนี้เมื่อการจับคู่เสร็จสมบูรณ์
 พารามิเตอร์หัวเรื่อง
    | ชื่อฟิลด์ | คำอธิบาย | ประเภท | จำเป็น | 
  | X-Match-Signature | ค่าลายเซ็นของเนื้อหาที่เข้ารหัสด้วยอัลกอริธึม HMAC SHA-256 | สตริง | ใช่ | 
  
 ค่าที่ส่งผ่านกับการเรียกกลับ
    | ชื่อฟิลด์ | คำอธิบาย | ประเภท | 
  | gameIndex | ค่า gameIndex ของการแข่งขันที่เสร็จสมบูรณ์ | int | 
  | matchId | ค่า matchId ของการแข่งขันที่เสร็จสมบูรณ์ | int | 
  | matchingInfos | อาร์เรย์ของข้อมูลของผู้ใช้แอปที่ถูกจับคู่ ผู้ใช้ที่มีค่า `playerId` เป็น `0` จะถือว่าเป็นบอท  matchingId: รหัสการแข่งขันprivateInfos: อาร์เรย์ของข้อมูลของผู้ใช้ที่จับคู่ในเกมเดี่ยว (รูปแบบเดียวกับ timeoutPlayerInfos)teamInfos: อาร์เรย์ของข้อมูลของผู้ใช้ที่จับคู่ในเกมทีม (teamIndex: หมายเลขทีม, playerInfos: อาร์เรย์ของข้อมูลสมาชิกทีม, รูปแบบเดียวกับ timeoutPlayerInfos) | json | 
  | timeoutPlayerInfos | อาร์เรย์ของข้อมูลของผู้ใช้แอปที่ไม่ได้จับคู่และหมดเวลา  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": []
}'
 คุณสามารถตรวจสอบความถูกต้องของผลลัพธ์การเรียกกลับโดยใช้ค่าของพารามิเตอร์ Header X-Match-Signature และกุญแจที่จะใช้ในการคำนวณอัลกอริธึมสามารถพบได้ใน Hive Console ด้านล่างเป็นตัวอย่างของโค้ด Java เพื่อรับ Signature
 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 หรือ Timeout: การตอบกลับผลการแข่งขันจะถูกส่งซ้ำในระยะเวลาปกติ
หากเซิร์ฟเวอร์ Hive ไม่สามารถรับการตอบสนองสถานะ HTTP 200 ติดต่อกันได้ ผลลัพธ์การจับคู่จะไม่ถูกส่งกลับเป็นระยะเวลาหนึ่งเพื่อวัตถุประสงค์ในการจัดการระบบ