space ocr
文章文件
developer

如何利用 OCR API 與 Webhook 打造應付帳款自動化管道

了解如何建立一個可靠的應付帳款自動化管道。使用非同步 OCR API 上傳發票,並透過安全的 Webhook 接收結構化資料。

7 分鐘閱讀· 2026-06-29

處理發票是應付帳款作業中的典型瓶頸。人工輸入資料不僅耗時,還容易出錯。即使導入了 OCR API,若採用輪詢(polling)方式來檢查任務是否完成,效率依然不彰。這種做法會增加系統的複雜度、延遲和不必要的網路流量。一個真正自動化的應付帳款流程,不該是反覆詢問「好了沒?」的等待,而應該是事件驅動(event-driven)的,在資料準備好的那一刻立即回應。

一張正在通過應付帳款自動化流程的發票
發票輸入,結構化資料與 Webhook 輸出。

這正是 space-ocr 非同步處理的核心理念。您不必在發出請求後,還得佔用連線空等回應。您可以一次上傳整批發票,然後立即回頭處理其他工作。API 會回傳一組任務識別碼,確認檔案已收到。接著,我們的引擎會處理每一張圖片。當一張發票成功讀取後,系統會直接向您應用程式的端點發送通知。這個通知是透過 Webhook——一個簡單、可靠的 HTTP POST 請求——來完成,請求中就包含了結構化的資料。

整個流程非常直接:您只需發起一次 POST /upload 呼叫,附上您的發票圖片。API 會立即回傳一個包含待處理任務的陣列。稍後,您的伺服器會透過 Webhook 收到一個 ocr.completed 事件。該事件的酬載(payload)包含完整的擷取結果,從供應商名稱(如「弥生サンブル」)到每一筆品項及其在頁面上的對應座標,無一不包。為了確保可靠性,每次上傳都可以在請求標頭中加入 Idempotency-Key。若您因網路問題需要重試請求,發送相同的金鑰能保證您不會重複建立處理任務。

webhook-receiver.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
const express = require('express');
const crypto = require('crypto');

// Middleware to get the raw body for signature verification
const rawBodySaver = (req, res, buf, encoding) => {
  if (buf && buf.length) {
    req.rawBody = buf.toString(encoding || 'utf8');
  }
};

const app = express({ verify: rawBodySaver });
const webhookSecret = process.env.SPACE_OCR_WEBHOOK_SECRET;

app.post('/webhook', (req, res) => {
  const signature = req.get('X-Spaceocr-Signature');
  if (!signature) {
    return res.status(400).send('Missing signature');
  }

  const hmac = crypto.createHmac('sha256', webhookSecret);
  const digest = Buffer.from(hmac.update(req.rawBody).digest('hex'), 'hex');
  const receivedSignature = Buffer.from(signature, 'hex');

  if (!crypto.timingSafeEqual(digest, receivedSignature)) {
    return res.status(400).send('Invalid signature');
  }

  // Signature is valid, now process the event
  const event = JSON.parse(req.rawBody);

  switch (event.event) {
    case 'ocr.completed':
      const { result } = event.data;
      console.log(`OCR successful for ${result.name}:`, result.values);
      // TODO: Add structured data to your accounting system
      break;
    case 'ocr.failed':
      const { error } = event.data;
      console.error(`OCR failed for ${event.data.name}:`, error.message);
      break;
    case 'webhook.test':
      console.log('Webhook test successful!');
      break;
    default:
      console.log(`Unhandled event type: ${event.event}`);
  }

  res.status(200).send({ received: true });
});

app.listen(3000, () => console.log('Webhook receiver listening on port 3000'));
✓ Verified

space-ocr 是如何在頁面上定位資料的?底層的語言模型會回傳擷取出的文字,並附上其可能位置的 token 提示。接著,我們的引擎會執行一個關鍵的驗證步驟:將擷取出的值,逐一字元地與頁面上實際偵測到的 OCR 符號進行比對。這個過程會產生一個介于 0.0 到 1.0 之間的 match_ratio 分數。分數若達到 0.85 或更高,即表示為高信度的匹配。最終的座標會以 0-1000 的標準化邊界框(bounding box)形式回傳,與原始圖片的像素尺寸無關。

我們認為,建立這類自動化流程的門檻不應過高。透過 API 處理的每張圖片,費用固定為 $0.05。每個帳戶每月還享有 100 次的免費掃描額度。更重要的是,如果 OCR 任務因圖片無法辨識而失敗,您完全不需付費。費用只與成功的資料擷取掛鉤,讓您能以低風險的方式開始自動化您的應付帳款作業。

  1. 公開一個公共端點
    您的伺服器需要一個公開的網址。在本地開發時,可以使用 ngrok 這類服務將您的本機伺服器暴露到網際網路上。
  2. 註冊您的 Webhook 網址
    在 space-ocr 的儀表板設定中,新增您的公開端點網址。請安全地複製產生的 Webhook 密鑰。
  3. 實作簽章驗證
    使用我們提供的程式碼範例,對每個傳入的請求驗證其 `X-Spaceocr-Signature` 標頭,以確保請求的真實性。
  4. 處理「ocr.completed」事件
    當一個有效的事件送達時,解析 `data.result` 物件,並將結構化的發票資料傳遞給您的會計系統或資料庫。
  5. 非同步上傳發票
    向 `POST /upload` 發起一個包含您檔案的請求。API 會立即回傳任務詳情,而不會等待 OCR 完成。
  6. 確認事件並進行監控
    您的端點應快速回傳一個 2xx 狀態碼以確認收到事件。您可以在儀表板中監控傳送日誌,以了解是否有任何問題。
如果我的 Webhook 端點服務中斷了怎麼辦?
space-ocr 會在長達 6 小時內,以指數退避(exponential backoff)演算法自動重試傳送。當我們收到 5xx 伺服器錯誤、408、429 或請求逾時,就會觸發重試。傳送日誌會保留 30 天。
如何驗證 Webhook 請求確實來自 space-ocr?
每個 Webhook 請求的標頭中都包含一個 `X-Spaceocr-Signature`。它是一個 HMAC-SHA256 簽章,使用您獨有的密鑰對請求內文(request body)進行簽署。您必須在您的伺服器上驗證此簽章。
我可以在一次 API 呼叫中上傳多張發票嗎?
可以,`POST /upload` 端點接受 multipart/form-data 格式,您可以在單一請求中包含多個 `files` 欄位。API 會回傳一個任務陣列,每個檔案對應一個任務。
OCR 任務失敗會收費嗎?
不會。如果 OCR 任務失敗,我們會觸發一個 `ocr.failed` 事件,並自動退還該次掃描的費用。您只需為成功的擷取付費。
輪詢(Polling)和使用 Webhook 有什麼不同?
輪詢需要您反覆呼叫 `GET /jobs/{jobId}` 來檢查任務是否完成。Webhook 則是事件驅動的;我們的伺服器會在結果準備好的那一刻,立即將其推送到您的端點,這種方式效率更高,也能提供即時更新。
如何從我的應用程式安全地重試上傳?
`/upload` 端點支援 `Idempotency-Key` 標頭。如果您在 24 小時內發送相同的金鑰,您會收到原始的快取回應,而不會建立重複的任務,藉此避免重複處理。

開始自動化您的應付帳款流程

立即取得您的 API 金鑰,每月享 100 次免費掃描,開始打造您的自動化方案。

相關文章