銜接上一篇,接著我們要計算Sign,以下為計算圖
5.4.4. 安全簽章計算(Sigh)
在產出安全簽章前必須要先取得 Nonce、Hash ID、訊息內文,才可計算出安全簽章,
產生前請注意以下事項:
1. 先移除所有空值的參數,參數值前後不可有空白。
2. 將剩餘所有參數值依照「參數名稱」由小至大排序(不分大小寫即 A小於B and a小於B),
組成如 param1=value1¶m2=value2 的字串。
3. 如為多節點參數則不參與 sign 值演算。
4. 最後使用 SHA256 進行計算。
訊息內文也就是訂單資料,這個在建立訂單api服務的時候會詳細說明,
這邊先列個範例,先跑完基礎流程。
$data; //array api所需參數,每個api不同
$hashid; //上篇我們運算後的HashID
$nonce; //前幾天我們透過api取得的資料
//第一 移除 null
$data = array_filter((array) ($data));
//第二 對欄位升序排序
ksort($data);
//第三 組合api所需參數
$params = [];
foreach ($data as $key => $item){
if (is_array($item) == false){
$params[] = $key . '=' . $item;
}
}
$content = implode('&', $params);
//第四 組合參數
$content .= $hashid . $nonce;
//第五 加密
$result = strtoupper(hash('sha256', $content));
到這邊取得Sign就完成了,一步步照著文件處理,比起xor算是比較好理解了,
最後我們看一下範例提供的code
//取得 Sign 計算方法
function getSign($data, $nonce, $hashid){
$result = '';
$content = '';
//移除 null
$data = array_filter((array) ($data));
//對欄位升序排序
ksort($data);
//訊息排序組合
while ($fruit_name = current($data)) {
//僅抓取第一層變數作組合
if (is_array($data[key($data)]) == false){
$content .= key($data) . '=' . $data[key($data)] . '&';
}
next($data);
}
$content = substr($content , 0, strlen($content) -1);
//字串雜湊
$content .= $nonce . $hashid;
//SHA256
$result = SHA256($content);
return $result;
}
可以看出幾乎一樣,除了中間組合參數的寫法不同,這邊可以進行運算比對一下,
幾個重點注意,
排除空資料
組合api所需參數要按照英文字母順序
組合api所需參數排除多節點
加密後轉成大寫
最後看看我們自己寫的結果是否跟範例的相同,一樣就大功告成。
原本Sign跟HashID要寫在一起,寫著寫著發現某些計算的東西比較複雜,
而且照跑一次文件流程的話篇幅會比較長一些(其實是想水..),因此就分成兩篇拉,
接下來就剩Message的部份,基礎流程就快要跑完了,
那麼我們一樣明天見拉!