調(diào)用三方服務(wù)為什么要使用 Webhook?
今天來(lái)聊聊 Webhook。
Webhook 是 "用戶定義的 HTTP 回調(diào)"。它們通常有以下幾個(gè)特點(diǎn):
- 由事件觸發(fā),例如支付完成事件。
- 回調(diào)地址由用戶配置。
下圖顯示了輪詢方式和 webhook 方式的比較。
圖片
假設(shè)我們運(yùn)營(yíng)一個(gè)電子商務(wù)網(wǎng)站。用戶通過(guò) API 網(wǎng)關(guān)向訂單服務(wù)發(fā)送訂單,訂單服務(wù)轉(zhuǎn)到支付服務(wù)進(jìn)行支付。然后,支付服務(wù)與外部支付服務(wù)提供商(PSP)進(jìn)行對(duì)話以完成真正的支付交易。
我們有兩種方法可以處理與外部 PSP 的通信。
短輪詢
向 PSP 發(fā)送支付請(qǐng)求后,支付服務(wù)會(huì)不斷向 PSP 詢問(wèn)支付狀態(tài)。經(jīng)過(guò)幾輪后,PSP 最終返回付款狀態(tài)。
短輪詢有兩個(gè)缺點(diǎn):
- 持續(xù)輪詢狀態(tài)需要支付服務(wù)的資源。
- 外部服務(wù)直接與支付服務(wù)通信,可能造成安全漏洞。
Webhook
我們可以向外部服務(wù)注冊(cè)一個(gè) Webhook。當(dāng)有關(guān)于請(qǐng)求的最新狀態(tài)更新時(shí),請(qǐng)回調(diào)某個(gè) URL。當(dāng) PSP 完成處理后,它會(huì)調(diào)用 HTTP 請(qǐng)求來(lái)更新付款狀態(tài)。
這樣,編程模式就改變了,支付服務(wù)就不再需要浪費(fèi)資源來(lái)輪詢支付狀態(tài)了。
如果 PSP 從未回調(diào)怎么辦?我們可以設(shè)置一個(gè) housekeeping 任務(wù),每小時(shí)檢查一次付款狀態(tài)。
Webhook 通常被稱為反向 API 或推送 API,因?yàn)榉?wù)器會(huì)向客戶端發(fā)送 HTTP 請(qǐng)求。
使用 Webhook 時(shí),我們需要注意以下三點(diǎn):
- 我們需要設(shè)計(jì)一個(gè)適當(dāng)?shù)?API 供外部服務(wù)調(diào)用。
- 出于安全考慮,我們需要在 API 網(wǎng)關(guān)中設(shè)置適當(dāng)?shù)囊?guī)則,比如白名單設(shè)置,限流等。
- 我們需要在外部服務(wù)中注冊(cè)正確的 URL。