簽名生成規則
更新時間:2022-09-02 18:08:07
取得 userId、appId、appSecret 關鍵資訊,詳見取得開發金鑰,
appSecret 金鑰用於生成簽名,作為通訊資料安全的關鍵資訊,嚴禁儲存在用戶端直接使用,所有 API 都必須透過客戶自己的伺服器中轉呼叫 POLYV 伺服器取得回應資料
簽名生成規則
sign 的生成規則如下:
- 將全部請求參數(參數值非空的參數)按 key(參數名)字典順序(ASCII 值大小)升序排列
- 將參數連接參數名與參數值拼成 key1value1key2value2...keyNvalueN
- 將拼接字串首尾加上 appSecret
- 對拼接字串採用 UTF-8 編碼計算 MD5,將 MD5 結果轉為大寫字母,作為 sign
註:
- appSecret 只是拼在字串首尾,並不參與 key 的排序
- appSecret 只是計算簽名時需要,在發送請求時不需要帶 appSecret
- 字串拼接時需要將參數值為 null 的參數剔除
- 簽名字元集必須為 UTF-8,若不指定,可能採用平台預設字元集,導致錯誤
範例
- 查詢頻道連麥使用量介面需要以下參數:
channelIds:2477096,2272655
startDay:2022-05-20
endDay:2022-06-18
appId:g4rqgmmjuo
timestamp:1660270926732
page:null
size:null
- 以上非空參數按參數名字典排序後的順序為:
appId:g4rqgmmjuo
channelIds:2477096,2272655
endDay:2022-06-18
startDay:2022-05-20
timestamp:1660270926732
- 按以上順序拼接字串為:
appIdg4rqgmmjuochannelIds2477096,2272655endDay2022-06-18startDay2022-05-20timestamp1660270926732
- 首尾拼上 appSecret 後的字串為:(此處範例中 appSecret:fsq2k5weced1h8vui657xtdva66whf0g 為虛擬值)
fsq2k5weced1h8vui657xtdva66whf0gappIdg4rqgmmjuochannelIds2477096,2272655endDay2022-06-18startDay2022-05-20timestamp1660270926732fsq2k5weced1h8vui657xtdva66whf0g
- 最後對字串計算 MD5 並轉換為大寫得到 sign 值為:
0D2BDA2FD04D93A2B8832B91FD973C4D
註:如果按照此方式計算出來簽名呼叫介面無法通過簽名校驗,請將上面第四步的字串、第五步的 MD5 後的 sign 值和請求的介面地址,透過右下角線上客服提供給客服排查,我們將快速解決您的問題。
其他
SHA256 簽名演算法(可選)
本平台也支援 SHA256 簽名演算法計算簽名,具體加密計算方法如下:
- 指定請求參數 signatureMethod=SHA256,如無此參數預設使用 MD5 簽名
- 將請求參數(參數值非空的參數)按 key(參數名)字典順序(ASCII 值大小)升序排列
- 將參數連接參數名與參數值拼成 key1value1key2value2...keyNvalueN
- 將拼接字串首尾加上 appSecret
- 對拼接字串採用 UTF-8 編碼計算 SHA256,將 SHA256 結果轉為大寫字母,作為 sign
請求一次性校驗參數(可選)
使用參數 signatureNonce=唯一隨機數,用於防止網路重放攻擊,例如:signatureNonce=584F3849-E5A0-4B59-98A5-2F373EFD0559
快速接入基礎程式碼請下載相關依賴原始碼, 點擊下載原始碼,下載後加入到自己的原始碼工程中即可。測試案例中的 HttpUtil.java 和 LiveSignUtil.java 都包含在下載檔案中。
強烈建議您使用直播 Java SDK完成 API 的功能對接,直播 Java SDK 對 API 呼叫邏輯、例外處理、資料簽名、HTTP 請求執行緒池進行了統一封裝和最佳化。
package net.polyv.common;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.polyv.util.LiveSignUtil;
/**
* @author: thomas
**/
public class LiveSignTest {
private static final Logger log = LoggerFactory.getLogger(LiveSignTest.class);
@Test
public void buildSign() throws UnsupportedEncodingException, NoSuchAlgorithmException {
String appId = "XXXXXXXX";
String userId = "XXXXXXXX";
String appSecret = "XXXXXXXXXXXXXXXXXXXXXXXX";
long timestamp = System.currentTimeMillis();
Map<String, String> paramMap = new HashMap<String, String>();
// 公共参数
paramMap.put("appId", appId);
paramMap.put("timestamp", Long.toString(timestamp));
// 业务参数
paramMap.put("channelId", "2149813");
// 一次性签名(可选参数)
// paramMap.put("signatureNonce", UUID.randomUUID().toString());
// MD5签名(默认)
String sign = LiveSignUtil.getSign(paramMap, appSecret);
// SHA256签名
// paramMap.put("signatureMethod", "SHA256");
// String sign = LiveSignUtil.getSHA256Sign(paramMap, appSecret);
log.debug("生成签名:{}", sign);
}
}
