整合加密支付 API 不論服務商為何都遵循可預期的形狀:你建立發票、轉址或嵌入結帳頁、隨付款進展收到非同步 Webhook、驗證它們,並與自己的紀錄對帳。困難之處不在順利路徑——而在邊界情況。
核心流程
多數閘道提供具相同生命週期的 REST API。你在伺服器端呼叫它(絕不要在瀏覽器暴露 API 金鑰),並把 Webhook——而非瀏覽器轉址——當作訂單是否付清的真相來源。
先設計你的訂單狀態機:待處理 → 少付/已付 → 已確認 → 完成,並為已過期與多付設明確分支。事先接好這些,能避免導致重複履約的糾結條件式。
- 以金額、幣別、訂單 ID 與 Webhook URL 建立發票。
- 顯示託管結帳頁,或自行渲染地址與金額。
- 為每次狀態變更接收 Webhook 並驗證其簽章。
- 在履約前確認付款已達所需確認數。
- 把 Webhook 與鏈上交易及你的訂單對帳。
建立發票
發票把一個特定金額綁到一個特定訂單一段有限時間。把你的訂單 ID 當作中繼資料送出,讓 Webhook 能無需猜測地對回,並儲存閘道回傳的發票 ID。
報價會過期——閘道會把匯率鎖定數分鐘。持久保存發票的到期時間與狀態,讓你的介面能顯示倒數,也讓遲到的付款被當作對帳案例處理,而非遺失的訂單。
Webhook 是真相來源
付款後的瀏覽器轉址是便利,而非保證——使用者可能關掉分頁。你的伺服器收到的 Webhook 才是你要據以行動的。驗證每一個 Webhook:在信任任何一個欄位之前,先檢查簽章(通常是用你的密鑰對原始內文做的 HMAC)。
讓 Webhook 處理具冪等性。閘道會重送,所以同一個「已付」事件可能到達兩次;以事件或發票 ID 作為你處理的鍵,讓重複送達成為無動作。快速回傳 2xx 並把緩慢的工作非同步處理,閘道才不會逾時而無謂地重送。
確認與最終性
一筆付款可能在最終前很久就被看到(在記憶池中或零確認)。依金額與鏈訂一個確認門檻,並只在達到後履約。對快速鏈上的小額穩定幣付款這很快;對大額則多等一些。
以信任閘道的「已確認」狀態、而非你自己的首次目擊來防範重組與雙花,並且除非你接受風險,否則不要在零確認付款上放行商品。
對帳與失敗情況
對帳是每日的工作,用來證明每筆「已付」訂單都對應一筆真實的鏈上交易,反之亦然。在每筆訂單上儲存交易雜湊、收到的金額與網路,讓落差成為一次查詢,而非一場調查。
為少付(買家送太少)、多付(退差額或折抵)、傳錯網路,以及過期後又付款的發票明確做規劃。在規模上這些並非罕見的邊界情況——它們是每週都有的事件,而能安靜處理它們的系統,才是真正的「可上線」。
常見問題
我該信任瀏覽器轉址還是 Webhook?
Webhook。轉址可能在使用者關掉分頁時遺失,也可能被偽造。在伺服器端驗證 Webhook 的簽章,並把它當作訂單已付清的權威訊號。
我如何避免同一個 Webhook 被處理兩次?
讓處理具冪等性。閘道會重送,所以以發票或事件 ID 作為你邏輯的鍵,讓重複成為無動作。絕不要因為同一個「已付」事件再次到達而把訂單履約兩次。
我該等幾次確認?
取決於金額與鏈。快速網路上的小額穩定幣付款幾乎可立即視為最終;大額則值得等更多確認。使用閘道的「已確認」狀態,而非你自己的首次目擊。
如果顧客少付或多付會怎樣?
兩者都要明確處理。閘道會標示少付,讓你可請求差額或退款;多付時你退還超額或予以折抵。事先把這些分支做好,正是示範與上線之間的差別。