遊戲商開洗分 API 介面規格說明書
一、系統架構與介面職責
本規格適用於 PC-Based 聯網型遊戲機台。機台端分數由遊戲商伺服器全面掌控,WAW-USS 採集卡安裝於機台內部,擔任物理接點至數位網路之通訊中繼器。
遊戲運行於電腦主機,分數控制權與業務結算 100% 由遊戲商雲端伺服器決定。WAW-USS 採集卡為透明邊緣中繼 (Transparent Relay),只忠實通報按鍵觸發次數與時間戳,不在硬體端換算或介入遊戲業務邏輯;SignalHub 伺服器可依店主後台設定產生參考請求金額。
投幣脈衝由機板自體加減分並驅動機械表跳號,完全閉環於本機。此類機台不走 SignalHub 開洗分通道,本規格書所述之 Webhook 派送、points_per_pulse 與 actual_points 結算流程均不適用。
actual_points 作為實際開分或洗分結果。
UI3、UI4)記錄方波增量,供日結、對帳、防弊與審計使用。
| 系統節點 | 角色定位 | 主要職責說明 |
|---|---|---|
| 實體按鈕 / 採集卡 | 邊緣通訊中繼 (Relay) | 偵測現場服務員按鍵動作,將觸發次數與時間戳即時上報。 |
| SignalHub 平台 | 派送與重試中心 | 依後台設定之 Webhook URL 向遊戲商 POST 推送;最多三次派送於 0s、3s、6s 啟動,並支援異步狀態閉環。 |
| 遊戲商後端 (Game Server) | 業務與點數結算核心 | 接收開洗分通知,控制遊戲機台增減點數,並回傳實際處理點數 (actual_points)。 |
二、硬體實體介面規格:4組輸入 (4 In) 與 4組輸出 (4 Out)
WAW-USS 工規通訊卡配備 4 路光耦隔離數位輸入通道 (UI1~UI4) 與 4 路隔離控制輸出通道 (UO1~UO4)。各通道在開洗分與機台對接時之標準功能指派如下:
| 通道 | 方向 | 信號模式 | 預設功能指派 | 電氣特性與業務功能說明 |
|---|---|---|---|---|
| UI1 | Input | Counter (計數累加) | 服務員開分按鍵 |
【開分預設腳位】 光耦硬體 PCNT 計數,精準記錄連續按壓次數,連按 3 下即上報 delta_value: 3。通知遊戲商依比例開分,並於回調中接收實際配發點數 actual_points。
|
| UI2 | Input | Event (事件通知) | 服務員洗分按鍵 |
【洗分預設腳位】 具備短時間自動防抖去重機制,通知遊戲商清算洗分,並於回調接收 actual_points。
|
| UI3 | Input | Counter / Event | 入幣機械跳表 / 門警報 | 【選配】 若機台裝有實體電磁計數碼表,採集投幣物理跳表脈衝(防弊對帳);亦可接錢箱開門防盜開關。 |
| UI4 | Input | Counter / Event | 出幣機械跳表 / 備用 | 【選配】 採集實體退幣跳表脈衝累積值,作為日結與開洗分數據交叉稽核依據。 |
| UO1~UO4 | Output | 繼電器開關輸出 / 電磁閥控制 | 外接設備致能與控制 | 【4路隔離輸出】 可供遠端控制機台電磁鎖、投幣器致能開關(Enable/Inhibit)、警示蜂鳴器或警示燈號。 |
三、對接前置作業:設定 Webhook 接收端點 (URL)
在機台正式上線前,遊戲商技術人員需先在 SignalHub 平台完成接收端點設定,系統才能在現場按鈕被按下時,將開洗分訊號即時 POST 至遊戲商伺服器。
設定步驟 後台端點配置流程 (前往頂部導航「🔔 Webhooks」頁面)
-
提供接收端點 (Webhook URL):
遊戲商需備妥一組公開可存取的 HTTPS 端點(例如:https://api.yourgame.com/v1/waw/callback)。 -
填入 SignalHub 平台:
登入signal.tg25.win➔ 點選頂部「🔔 Webhooks」➔ 點擊「+ 新增 Webhook」➔ 將您的端點網址貼入「目標 URL」欄位。 -
設定簽名金鑰 (Secret Key,安全規範):
可自訂或由系統產生安全密鑰。啟用後,SignalHub 每次派送會在 HTTP Header 帶入安全防護與防重放標頭,遊戲商端點務必進行校驗:X-WAW-Signature:格式為sha256={hmac}(注意包含sha256=前綴),以整個 HTTP Request Raw Body 作為內容,使用 Secret Key 進行 HMAC-SHA256 計算所得之簽名。X-WAW-Timestamp:發送端 Unix 秒級時間戳(如1725945120)。接收端若發現與本地伺服器差距超過 300 秒(5 分鐘)應予作廢,防範中間人重放攻擊 (Replay Attack)。X-WAW-Delivery:唯一推送單號(如del_10284),與 Body 內之delivery_id一致,做為接收端冪等去重鍵 (Idempotency Key)。 -
發送測試信號驗證:
設定完成後,可在 Webhook 列表點擊「測試推送」,平台將立即向該 URL 發送一筆測試訊號,驗證雙方伺服器連線狀態;或直接使用 Mock 對接測試終端 檢視完整收發流程。
四、現場開洗分通道與業務邏輯
4.1 開分通道 (UI1:計數累加型)
服務員連續按壓開分鍵時(例如快速連按 3 次),採集卡 PCNT 硬體計數器將採集全部次數,並於資料包中帶出 "delta_value": 3。遊戲商接收後,依該機台預設之開分比例進行遠端配分(例:每次開分 100 點,3 次即派發 300 點)。配分完成後,遊戲商必須在 HTTP 回應(或 reply_url 回調)中回傳實際派發點數 actual_points(例如 300 點),以供 WAW 後台精準記錄現場營業入金與拆帳對帳。若未回傳實際點數,後台將無法計入營業額。
4.2 洗分通道 (UI2:事件通知型)
服務員按下洗分按鈕時觸發(短時間內重複按壓自動防抖去重,event_type: "event" 且 delta_value: 1)。遊戲商端點接獲通知後,自其資料庫清算該機台當前剩餘分數並執行歸零,隨後在回應中帶回實際扣除的點數 actual_points。若機台當前無分數(0 點),回傳 actual_points: 0 亦屬合法正常回應。
5. API Data Format and Communication Protocol
5.1 Delivery Payload (SignalHub to Game Vendor Webhook URL)
Method: POST / Content-Type: application/jsonPOST /api/v1/waw/callback HTTP/1.1
Host: api.yourgame.com
Content-Type: application/json
User-Agent: WAW-SignalHub/1.0
X-WAW-Event: signal.counter
X-WAW-Delivery: del_10284
X-WAW-Timestamp: 1725945120
X-WAW-Signature: sha256={hmac_sha256_signature}
sha256={hmac}. Calculate from raw request body.signal.counter (credit in) / signal.event (credit out).{
"event_id": "evt_982341",
"delivery_id": "del_10284",
"chip_id": "C8F09E010004",
"profile_id": 21,
"pin_code": "UI1",
"pin_label": "Credit In Request",
"event_type": "counter",
"raw_value": 1582,
"delta_value": 3,
"points_per_pulse": 100,
"amount": 300,
"reply_url": "https://signal.tg25.win/api/v9/signal-hub/callback-ack?delivery_id=del_10284&token={signed_callback_token}&expires=1725343200",
"event_at": "2026-09-10T14:32:00.123+08:00",
"timestamp": "2026-09-10T14:32:00.123+08:00"
}
- delivery_id: Unique transaction ID. It stays unchanged across up to three delivery attempts started at 0s, 3s, and 6s. Receiver must use it as an idempotency key.
- chip_id: Bound acquisition-card hardware ID. It is never a SignalHub profile ID or a generated value such as
CHIP-33. Configure the actual card ID from Machine Management. - reply_url: Dedicated asynchronous callback URL. Use it to submit final processing result when the synchronous response cannot finish in time.
- delta_value: Trigger count. UI1 credit-in may contain accumulated repeated presses; UI2 credit-out is normally fixed at 1.
- points_per_pulse: Machine back-office setting for points per pulse, such as 100. SignalHub uses it with the pin
pulse_ratioto calculate the server-side reference amount; this is not a hardware conversion. - amount: Reference requested points calculated by SignalHub server from
delta_value × pulse_ratio × points_per_pulse. Final credit-in or credit-out amount must follow vendor-returnedactual_points. - UI2 credit-out note: Credit-out uses
event_type: "event"anddelta_value: 1. If the machine balance is insufficient, vendor-returnedactual_points: 0is a valid response.
5.2 Settlement Result Return Format (Game Vendor to SignalHub)
The receiver may implement either mode according to its own architecture:
{
"status": "ack",
"delivery_id": "del_10284",
"action": "credited",
"actual_points": 300,
"message": "Credited 300 points"
}
Return this JSON body directly in the same HTTP connection within 3 seconds.
{
"delivery_id": "del_10284",
"status": "success",
"action": "cleared",
"actual_points": 1580,
"message": "Cleared 1580 points"
}
After background settlement completes, POST this payload to the reply_url included in the request payload.
5.3 Local USB Serial Output Format (Direct Connection to On-Site Cashier PC)
Baud Rate: 115200 / 8-N-1 / Single-line JSON ending with \nThe on-site cashier PC can read serial data directly. chip_id is the bound acquisition-card hardware ID; it must not be substituted with a profile ID or generated simulator ID. Each record ends with the standard newline character \n, has latency under 1ms, and does not depend on external internet connectivity.
5.4 Vendor-Initiated Notification: Player Exit / Points Cleared to Zero (Session End)
Method: POST / Content-Type: application/jsonWhen machine points are consumed to zero (Game Over) or the player exits voluntarily, the game board or server should call SignalHub to record the current machine session-end state and play duration.
{
"chip_id": "C8F09E010004",
"machine_number": "M-01",
"event": "session_end",
"reason": "points_cleared_to_zero",
"last_played_duration_seconds": 1840,
"occurred_at": "2026-09-10T14:45:00+08:00"
}
X-WAW-Secret: {your_webhook_secret} for authentication.- chip_id (required): ESP32 acquisition-card chip identifier.
- machine_number (optional): on-site machine number, such as M-01.
- event (required): fixed value
session_end. - reason (optional): session-end reason, default
points_cleared_to_zero. - last_played_duration_seconds (optional): accumulated play duration in seconds for the current session.
- occurred_at (optional): ISO-8601 event timestamp.
六、現場爭議判定與審計依據
若現場發生加減分爭議,可依據 SignalHub 後台「派送記錄」之日誌狀態進行責任歸屬判定:
| 日誌記錄狀態 | 現象說明 | 責任判定與處理建議 |
|---|---|---|
| 查無記錄 (No Record) | 派送日誌無該時段之記錄。 | 現場硬體問題。實體按鈕接線未導通或光耦未觸發。 |
| 200 ACK (成功) | Webhook 已送出,遊戲商回簽 actual_points。 | 通訊正常。伺服器已處理,請檢查遊戲客戶端渲染顯示。 |
| 5xx / Expired (逾時失敗) | 三次派送(0s、3s、6s)均未收到有效回應。 | 服務端或網路問題。遊戲商端點異常或外網連線中斷。第三次派送失敗後標記為 Expired,並觸發系統告警。 |
七、Owner 與 SignalHub 分工表
「機台主(Owner)」與「SignalHub」為兩個獨立系統、各有明確界線。機台主在 iot.tg25.win 完成營運設定,SignalHub 僅負責信號採集與派送;兩者共用同一組平台帳號,但職責不重疊。
| 分工項目 | Owner(iot.tg25.win · 機台主/營運) | SignalHub(signal.tg25.win · 信號中心) |
|---|---|---|
| 核心定位 | 營運、帳務與分潤中樞 | 硬體信號採集與 Webhook 派送中樞 |
| 帳號與權限 | 開立/刪除機台主與技術工程師帳號;設定角色與到期日 | 沿用同一帳號登入;技術工程師可操作所屬機台主名下設備,但看不到營收 |
| 機台/場地 | 場地建檔、機台歸屬、機台主與裝配商關係 | 呈現已歸屬之設備清單(pc_game 類別) |
| 分潤與計價 | 負責:一分多少錢、分潤協議、銀行與訂閱 | 不涉及:不處理金流、分潤與訂閱計費 |
| 硬體設定 | 不處理 GPIO 細節 | 負責:GPIO 腳位映射、Webhook 端點、Callback、模擬器 |
| 資料所有權 | 營運資料(營收、分潤、訂閱)之主體 | 信號事件與派送日誌;寫入時 owner_id 一律落在機台主 |