保利威文档中心

幫助中心

簽名生成規則

更新時間:2022-09-02 18:08:07

取得 userId、appId、appSecret 關鍵資訊,詳見取得開發金鑰appSecret 金鑰用於生成簽名,作為通訊資料安全的關鍵資訊,嚴禁儲存在用戶端直接使用,所有 API 都必須透過客戶自己的伺服器中轉呼叫 POLYV 伺服器取得回應資料

簽名生成規則

sign 的生成規則如下:

  1. 全部請求參數(參數值非空的參數)按 key(參數名)字典順序(ASCII 值大小)升序排列
  2. 將參數連接參數名與參數值拼成 key1value1key2value2...keyNvalueN
  3. 將拼接字串首尾加上 appSecret
  4. 對拼接字串採用 UTF-8 編碼計算 MD5,將 MD5 結果轉為大寫字母,作為 sign

註:

  • appSecret 只是拼在字串首尾,並不參與 key 的排序
  • appSecret 只是計算簽名時需要,在發送請求時不需要帶 appSecret
  • 字串拼接時需要將參數值為 null 的參數剔除
  • 簽名字元集必須為 UTF-8,若不指定,可能採用平台預設字元集,導致錯誤

範例

  1. 查詢頻道連麥使用量介面需要以下參數:
channelIds:2477096,2272655
startDay:2022-05-20
endDay:2022-06-18
appId:g4rqgmmjuo
timestamp:1660270926732
page:null
size:null
  1. 以上非空參數按參數名字典排序後的順序為:
appId:g4rqgmmjuo
channelIds:2477096,2272655
endDay:2022-06-18
startDay:2022-05-20
timestamp:1660270926732
  1. 按以上順序拼接字串為:
appIdg4rqgmmjuochannelIds2477096,2272655endDay2022-06-18startDay2022-05-20timestamp1660270926732
  1. 首尾拼上 appSecret 後的字串為:(此處範例中 appSecret:fsq2k5weced1h8vui657xtdva66whf0g 為虛擬值)

fsq2k5weced1h8vui657xtdva66whf0gappIdg4rqgmmjuochannelIds2477096,2272655endDay2022-06-18startDay2022-05-20timestamp1660270926732fsq2k5weced1h8vui657xtdva66whf0g
  1. 最後對字串計算 MD5 並轉換為大寫得到 sign 值為:
0D2BDA2FD04D93A2B8832B91FD973C4D

註:如果按照此方式計算出來簽名呼叫介面無法通過簽名校驗,請將上面第四步的字串、第五步的 MD5 後的 sign 值和請求的介面地址,透過右下角線上客服提供給客服排查,我們將快速解決您的問題。


其他

SHA256 簽名演算法(可選)

本平台也支援 SHA256 簽名演算法計算簽名,具體加密計算方法如下:

  1. 指定請求參數 signatureMethod=SHA256,如無此參數預設使用 MD5 簽名
  2. 將請求參數(參數值非空的參數)按 key(參數名)字典順序(ASCII 值大小)升序排列
  3. 將參數連接參數名與參數值拼成 key1value1key2value2...keyNvalueN
  4. 將拼接字串首尾加上 appSecret
  5. 對拼接字串採用 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);
        
    }
    
}
联系客服,在线咨询