iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0

銜接上一篇,接著我們要計算Sign,以下為計算圖
https://ithelp.ithome.com.tw/upload/images/20210911/20118647MknVDnv9WD.png

5.4.4. 安全簽章計算(Sigh)
在產出安全簽章前必須要先取得 Nonce、Hash ID、訊息內文,才可計算出安全簽章,
產生前請注意以下事項:
1. 先移除所有空值的參數,參數值前後不可有空白。
2. 將剩餘所有參數值依照「參數名稱」由小至大排序(不分大小寫即 A小於B and a小於B),
組成如 param1=value1&param2=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的部份,基礎流程就快要跑完了,
那麼我們一樣明天見拉!


上一篇
Day04 永豐金API 基礎流程 -- HashID
下一篇
Day06 永豐金API 基礎流程 -- 訊息內文
系列文
掌握訂單與線上金流的剪不斷理還亂30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言