2016-07-31 137 views
1

我正在使用gocardless鉤子,並且我一直在使用沙盒環境驗證hmac簽名。gocardless PHP hmac簽名不匹配

所以我在沙箱中生成了webhook測試,它給了我發送的請求正文和標題。

因此,據我所知,我必須得到請求正文,並生成一個帶有密鑰的散列,並將其與webhook簽名頭部散列進行比較(聽起來並不複雜)。

所以我使用郵遞員在我的本地環境中重現它,附加相同的標題和相同的身體,但簽名永遠不會匹配。

這裏是我的嘗試:

$signature = hash_hmac('sha256',$request->getContent(), 'secret'); 

請注意,我用laravel框架,所以我的第一個想法是,也許框架內部操作的要求,所以我想這:

$request_data = file_get_contents('php://input'); 
$signature = hash_hmac('sha256',$request_data, 'secret'); 

但仍然不匹配,我注意到我的新線,也許這可能會修改結果,所以我清理它...

$request_data = str_replace(array('.', ' ', "\n", "\t", "\r"), '', $request_data); 

但仍然不匹配,而且我試圖在UTF8中投射主體數據,並使hmac返回raw並在base64中對其進行編碼......但沒有成功。

那麼在這裏會出現什麼問題呢?也許簽名不能在沙箱環境中工作?有沒有人處理過它?

提前致謝!

回答

2

最後我發現這個問題,在沙箱面板中無心的他們顯示請求未定義的,所以長度不同,只是縮小它,你就可以測試!現在簽名匹配!

+0

能否請你澄清你的unminified意思驗證網絡掛接簽名的例子嗎?也許一個例子可能會有用。 – guival

+0

我正在複製粘貼無紙化webhook發送對象郵遞員,並將其發送到我的端點模擬接收webhooks,在GC面板測試webhook響應顯示(爲更好的閱讀目的),並簽名不匹配,因爲長度將不同,他們發送縮小的請求意味着沒有空格! –

+1

明白了,謝謝。我以爲你的意思是還有換行符或這樣的事情。它有助於瞭解儘管應該沒有空白。 – guival

1

我們已經更新了我們的開發者文檔,你可以找到比在https://developer.gocardless.com/getting-started/api/staying-up-to-date-with-webhooks/?lang=php#building-a-webhook-handler

你想要做這樣的事情

<?php 
// We recommend storing your webhook endpoint secret in an environment variable 
// for security, but you could include it as a string directly in your code 
$token = getenv("GC_WEBHOOK_SECRET"); 

$raw_payload = file_get_contents('php://input'); 

$headers = getallheaders(); 
$provided_signature = $headers["Webhook-Signature"]; 

$calculated_signature = hash_hmac("sha256", $raw_payload, $token); 

if ($provided_signature == $calculated_signature) { 
    // Process the events 

    header("HTTP/1.1 200 OK"); 
} else { 
    header("HTTP/1.1 498 Invalid Token"); 
}