在 Facebook驗證檔案中
請注意,我們使用有效負載的轉義 unicode 版本生成簽名,帶有小寫十六進制數字。如果您只是針對解碼的位元組進行計算,您最終會得到不同的簽名。例如,字串 ??? 應轉義為 \u00e4\u00f6\u00e5。
我正在嘗試為我擁有的驗證進行單元測驗,但我似乎無法生成簽名,因為我無法逃避有效負載。我試過了
mb_convert_encoding($payload, 'unicode')
但這會像 Facebook 那樣對所有有效負載進行編碼,而不僅僅是所需的字串。
我的完整代碼:
// on the unittest
$content = file_get_contents(__DIR__.'/../Responses/whatsapp_webhook.json');
// trim whitespace at the end of the file
$content = trim($content);
$secret = config('externals.meta.config.app_secret');
$signature = hash_hmac(
'sha256',
mb_convert_encoding($content, 'unicode'),
$secret
);
$response = $this->postJson(
route('whatsapp.webhook.message'),
json_decode($content, true),
[
'CONTENT_TYPE' => 'text/plain',
'X-Hub-Signature-256' => $signature,
]
);
$response->assertOk();
// on the request validation
/**
* @var string $signature
*/
$signature = $request->header('X-Hub-Signature-256');
if (!$signature) {
abort(Response::HTTP_FORBIDDEN);
}
$signature = Str::after($signature, '=');
$secret = config('externals.meta.config.app_secret');
/**
* @var string $content
*/
$content = $request->getContent();
$payloadSignature = hash_hmac(
'sha256',
$content,
$secret
);
if ($payloadSignature !== $signature) {
abort(Response::HTTP_FORBIDDEN);
}
uj5u.com熱心網友回復:
一方面,mb_convert_encoding($payload, 'unicode')將輸入轉換為 UTF-16BE,而不是 UTF-8。你會想要mb_convert_encoding($payload, 'UTF-8').
其二,mb_convert_encoding()在不指定源編碼的情況下使用會導致函式假定輸入使用的是系統的默認編碼,這經常是不正確的,并且會導致您的資料被破壞。你會想要mb_convert_encoding($payload, 'UTF-8', $source_encoding). [此外,您無法可靠地檢測字串編碼,您需要知道它是什么。]
第三,mb_convert_encoding()將所需的轉義序列應用于資料是完全錯誤的函式。[天哪,“php escape UTF-8”的谷歌結果太糟糕了]
不幸的是,PHP 沒有一個 UTF-8 轉義函式,它不會被烘焙到另一個函式中,但是在用戶空間中撰寫并不是非常困難。
function utf8_escape($input) {
$output = '';
for( $i=0,$l=mb_strlen($input); $i<$l; $i ) {
$cur = mb_substr($input, $i, 1);
if( strlen($cur) === 1 ) {
$output .= $cur;
} else {
$output .= sprintf('\\ux', mb_ord($cur));
}
}
return $output;
}
$in = "asdf ???";
var_dump(
utf8_escape($in),
);
輸出:
string(23) "asdf \u00e4\u00f6\u00e5"
uj5u.com熱心網友回復:
與其嘗試從已解碼的 JSON 中重新組裝有效負載,不如在收到資料時直接獲取資料。
Facebook 發送Content-Type: application/json,這意味著 PHP 不會以 $_POST 開頭,但您可以使用file_get_contents('php://input').
嘗試并基于此計算簽名,這應該可以作業,而無需處理任何編碼和轉義的麻煩。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/511478.html
上一篇:錯誤:E/AndroidRuntime:FATALEXCEPTION:main原因:必須在呼叫activateApp之前初始化Facebooksdk
