跳到主要內容
聯絡我們

TICKET · 一次性憑證核銷引擎

掃一次就好。第二次掃,系統會告訴你已經用過了。

到場驗證、課程扣點、票券兌換、集點入帳——同一套核銷引擎,五個場域的變體。
沒有 AI 判讀,也不需要。憑證是你發的,我們驗的是數學。

  • PRD 20 模組 · 40 FR 零未實作
  • 40 支資料庫 migration
  • 3 個獨立專案各自驗證過

已完成開發與客戶驗收 · 內測準備中

本頁所有能力皆有可指認的程式碼路徑,見頁尾技術證據表。

同一張票根,五種撕法

下面五張卡的欄位完全一樣:誰掃、掃什麼、驗什麼、失敗時螢幕上寫什麼、月底對帳看哪一欄。
我們刻意不讓任何一張看起來比較厲害——你要比較的是「哪一張長得像我的現場」。

✅ 已有實作對應
AMAX 的既有專案裡有這個場景的可指認程式碼
◻ 同引擎適用場景 · 尚無案例
引擎支援,但 AMAX 還沒做過這個場域的案子
憑證型態基準

活動報到

✅ 已有實作對應
誰掃
現場工作人員用手機掃,或參加者自助掃固定式讀碼機
掃什麼
報名成功時寄出的一次性報到碼(QR 內容是 token 原字串,不是網址)
驗什麼
這個碼存在嗎 → 屬於這場活動嗎 → 已經報到過了嗎 → 是不是已取消的報名
失敗畫面
整張卡轉灰並蓋上「已使用」章,下方一行紅字:已於 08/12 09:41 由 王小姐 完成報到
對帳看什麼
報到率、逐時報到分佈、未報到名單、第三方報名平台匯回的名單與本系統的差集

第三方報名名單(CSV)可匯回主系統做差集對帳,避免「平台說 300 人、現場只掃到 240 人」無解。

憑證型態+時間

健身房課程

✅ 已有實作對應
誰掃
櫃檯人員掃會員手機出示的課程票券;或會員掃教室門口的當日碼
掃什麼
課程票券碼(含簽章),或場館每日更新的當日碼
驗什麼
簽章對不對 → 是這堂課嗎 → 在可核銷時間內嗎 → 這張票已經扣過了嗎
失敗畫面
這張票券屬於 19:00 的課程,現在是 20:35,已超過可核銷時間(不寫「錯誤」兩字,寫發生了什麼)
對帳看什麼
逐堂出席、逐會員剩餘堂數、教練鐘點結算、當日碼被誰在幾點掃過

票券簽章刻意不綁使用者——只簽票券碼與活動 id,所以票可以轉讓給朋友,而簽章仍然驗得過。驗證用時序安全比較(timing-safe compare),零第三方依賴。

憑證型態+地點

餐券兌換

✅ 已有實作對應
誰掃
店員掃顧客在通訊軟體內領到的券
掃什麼
領券時綁定的一次性券碼
驗什麼
這張券領過了嗎 → 是這家分店可用的嗎 → 在有效期內嗎 → 已經核銷過了嗎
失敗畫面
這張券已於 07/29 18:22 在 中山店 核銷——講清楚被誰用掉、在哪裡用掉
對帳看什麼
發券數 / 領券數 / 核銷數三段漏斗、逐分店核銷、券成本歸戶

防重複領有兩道——資料庫層的複合唯一鍵(使用者 × 券 × 通訊軟體帳號),加上前端裝置指紋。兩道都過不了才算領到。

以下為同引擎適用場景 · 尚無 AMAX 案例
憑證型態+多入口 × 多場次

展覽入場

◻ 同引擎適用場景 · 尚無案例
誰掃
入口人員掃參觀者的電子票;分場次的講座另掃一次
掃什麼
一次性入場票;分場次票券為獨立憑證,不共用同一個碼
驗什麼
票種對不對 → 這個入口可以進嗎 → 今天這一場嗎 → 已入場了嗎
失敗畫面
這張是 A 館單日票,此入口為 B 館
對帳看什麼
逐入口人流、逐場次入座、票種售出與實際入場的差額

AMAX 尚未交付過展覽案。這張卡描述的是引擎既有能力(多入口、多場次、逐憑證)在此場域的套用方式,不是既有案例。

憑證型態+循環憑證

宿舍門禁

◻ 同引擎適用場景 · 尚無案例
誰掃
住宿者掃門口讀碼機;訪客持一次性訪客碼
掃什麼
住宿者的循環憑證(每日更新),或訪客的一次性通行碼
驗什麼
憑證是今天的嗎 → 這個人這棟樓可以進嗎 → 訪客碼用過了嗎 → 是否在門禁時段內
失敗畫面
訪客碼已於今日 14:07 使用過,請聯絡受訪人重新發送
對帳看什麼
逐人進出時間、訪客紀錄、異常時段進出清單

門禁涉及個資與人身安全,導入前需要一次法遵與硬體評估。同上,這是適用場景說明,不是既有案例。

五張卡不一樣的是欄位。一樣的是這一層。

上面五個場域,換掉的只有「驗什麼」的規則。核銷本身——那個決定「這張到底能不能用」的動作—— 五個場域跑的是同一段程式碼,而且它不在應用程式裡,在資料庫裡。

為什麼不能在應用層檢查完再更新

活動入口有兩個人在收票。同一張券被截圖轉傳,兩支手機在同一秒各掃了一次。

如果核銷寫成「先查這張用過沒 → 沒有 → 那就標記成已使用並入帳」, 這兩支手機會在「查」的那一刻同時得到「還沒用過」,然後各自入帳一次。 這不是機率問題,是設計問題;活動當天人越多,它越會發生。

AMAX 的做法

  • 核銷 = 一個 Postgres RPC,單一交易內完成:鎖定 → 驗證 → 標記 → 入帳
  • 第二次呼叫不會失敗,也不會重複入帳,它會回一個明確的「已被核銷」狀態
  • 應用層與行動端只負責顯示結果,不參與判斷

示範 · 同一張票掃兩次

TK-8F2A-0C41

類型
課程票

  • QR 內容是 token 原字串,不是網址。

    這是踩過的坑:把整串網址包進 QR,掃出來的字串會與資料庫存的對不上, 而且失敗訊息會長得像「找不到這張券」,讓現場人員以為系統壞了。

  • 冪等不等於忽略。

    重複核銷回的是明確的狀態(何時、被誰、在哪裡核銷),不是安靜地成功、也不是丟一個 500。 現場人員需要的是「這張誰用掉了」,不是「錯誤代碼 409」。

  • QR 在伺服器端產製。

    憑證的產生與驗證都在你控制的那一側,前端只是顯示。

現場最常發生的兩件事,是「掃錯了」和「掃不到」。

  • 撤銷

    現場的樣子
    工作人員掃錯人、或顧客反悔不用了
    系統的動作
    撤銷簽到是一個獨立的正規操作,不是手改資料庫。撤銷後憑證回到可用狀態,並在紀錄上留下撤銷這件事
  • 補發

    現場的樣子
    手機沒電、票券信箱找不到、券被誤刪
    系統的動作
    補發是另一個獨立操作,舊憑證同時失效,避免兩張都能用

這兩件事有專屬的資料庫 migration,代表它們是被設計進來的功能, 不是「請工程師去後台改一下」。

一個核銷系統會不會出事,通常不是看它正常時多好用,是看它出錯時你有沒有正規的回頭路。

展場沒網路的時候。

目前的核銷需要連線。核銷的原子性由資料庫保證,這是它擋得住重複核銷的原因, 也是它現在無法離線的原因——離線裝置無法知道另一台裝置在同一秒做了什麼。

AMAX 尚未實作離線核銷。我們不會在這一頁上寫「支援離線」。

現場可行的三個做法(今天就能用)

  • 場域自備網路:多數展場提供工作人員專用 Wi-Fi;行動網路分享通常足以支撐核銷流量 (每次核銷的傳輸量極小)。

  • 降級為記錄模式:斷線時改為記錄掃到的憑證碼與時間,恢復連線後批次核銷。代價要講清楚:這段期間無法即時擋下重複使用,重複會在批次入帳時才被發現並標記。

  • 關鍵閘口不離線:付費入場、餐券兌換這類直接對應金額的閘口,建議一律維持連線; 人流計數這類事後可補的,才使用降級模式。

如果你的場域確定沒有網路,請在第一次通話時就說——這會直接影響方案,我們不會事後才告訴你。

月底那張表。

核銷系統真正被檢驗的時刻不是活動當天,是月底那個要簽名的人問「這個數字怎麼來的」。

欄位設計示意,數值為示例值,非實際客戶資料

憑證碼類型核銷時間核銷人場域狀態入帳備註
TK-8F2A-0C41課程票08/12 19:02櫃檯 A中山館已核銷+1 堂
TK-8F2A-0C41課程票08/12 19:02櫃檯 B中山館重複掃描0同一秒第二次掃描,未入帳
TK-33B9-71E0餐券08/12 12:41店員 C信義店已核銷−1 張
TK-33B9-71E0餐券08/13 12:05店員 D南港店已使用0已於 08/12 在信義店核銷
TK-5A17-9D22報到碼08/12 09:41工作人員 EA 館入口已撤銷009:43 由 主管 F 撤銷,原因:掃錯人
  • 每一列都能回答「誰、什麼時候、在哪裡、結果是什麼」——這四欄是不可省略的。
  • 重複掃描會留下紀錄,而不是被丟掉。你需要知道有人試過兩次,即使它沒有入帳。
  • 匯出格式為 CSV,可直接進試算表或既有 ERP 的匯入流程。

這幾種狀況,我們會建議你不要用這套。

你要的是人臉辨識或證件辨識入場
這套不做視覺辨識。憑證是你發的,我們驗的是憑證本身,不驗人
你的憑證是別人發的(第三方票務平台)
我們可以匯回名單做對帳,但無法即時核銷別人系統裡的票
你需要完全離線的核銷
區塊 5。目前不支援,不建議勉強導入
你要門禁硬體整合(電子鎖、閘門、旋轉閘)
引擎可以驗,但硬體那一段需要另外評估,不在這個 SKU 內
你只要一次性的單場活動,且人數在 100 人以內
老實說,一張列印的名單加一枝筆更划算。這套的價值在「反覆發生」

我們寧可在第一次通話就講清楚不適用,也不想在活動當天讓你發現。

把你的現場流程講一次給我們聽。

20 分鐘。你講一次現場怎麼跑——誰掃、掃什麼、出錯時現在怎麼處理、月底誰在對帳。 我們會直接告訴你這套適不適用,以及哪一段要客製。

目前狀態:已完成開發與客戶驗收,內測準備中。本頁不宣稱已上線服務中。