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 : ค่าของ 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 ขอ
ลิงก์สด | 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 : ค่า 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 | 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 ติดต่อกันได้ ผลลัพธ์การจับคู่จะไม่ถูกส่งกลับเป็นระยะเวลาหนึ่งเพื่อวัตถุประสงค์ในการจัดการระบบ