圖 4-1: 各欄位資料範例
安全簽章的要件,我們已經拿到 Nonce 及 HashId 了,接下來還需要內文雜湊。我們來看看 API 文件對於取得內文雜湊的描述。
圖 4-2: 文件第 19 頁。
文件這一段的重點為,空值的參數(空白、空陣列)以及多節點參數(指的是值非為字串、數字,其值為還有下一層的陣列或物件)都必須移除,接著對欄位名稱進行排序。
真正要傳給豐支付 API 的訂單資料欄位,稱為訊息內文。
圖 4-3: 範例 - 建立訂單的資料結構。
訊息內文原始的資料如上圖,經過處理後如下圖。
圖 4-4: 範例 - 排序及去除空欄位及多節點欄位。
接著把過濾後的資料轉成網址型態的字串,但不要有 RFC1738 或 RFC3986 編碼。
圖 4-5: 範例 - PHP 函式參考。
PHP 的開發者可以使用 http_build_query
函式將陣列轉換為網址型態的字串,再使用 urldecode
還原為未編碼字串。
圖 4-6: 範例 - 內容雜湊後字串。
如此一來,就得到了訊息內文的雜湊了。
總結今天的文章,訊息內文雜湊流程可以簡化為下圖:
圖 4-7: 訊息內文雜湊流程。
在得到訊息內文雜湊的字串後,搭配前兩天拿到的 Nonce 及 HashId,要來計算出安全簽章 Sign 了。明天的文章,一樣會有詳細的圖文說明如何使用這三段字串資料去算出安全簽章 Sign,我們明天見囉 ^^
本文更新於筆者的 TerryL 部落格,Day 4 - 安全簽章: 訊息內文雜湊,有興趣可前往閱讀及討論。
第一次知道 http_build_query
跟 rawurldecode
函數,
真的很方便,不用自己拆跟組,感謝分享 :D
沒注意到 http_build_query 把空白字元轉成 +
號,所以改用 改用 urldecode
,晚點更新一下內文。
之前用 http_build_query 來組超方便,但不知道它會把組出來的結果 encode,卡了好久,後來還是手動一個一個處理,現在才知道有 urldecode 可以用XD,感謝大大分享!
https://www.php.net/http_build_query 預設是 PHP_QUERY_RFC1738,把空白轉成 +
號,如果是 PHP_QUERY_RFC3986 則轉成 %20
,才使用 rawurldecode 解。一般情況下用這個空白被轉成什麼比較沒那麼在意,只是在這種金流串接加密的情況下,一個字元不同,加密後的雜湊就不同,也才會遇到這種情況。