# 流程调用sig签名

# 步骤

第一步:对基于公共参数键名称部分使用ASCII排序。排序后,将键名对应的键值按顺序加入队列,假设队列名为array1。此时,队列中的值为排序后键值对应的实际值。

第二步:排序后对键值做URLENCODE,针对第一步队列中的值使用**+**链接。操作方式为: str1= implode("+", array1)。(js中implode替换为join)

编码补充: 为了了保持编码⼀一致性,腾讯后台侧使⽤用了了RFC 3986编码 规范,故在遇到空格字符时,该规范也会将单个空格变 成%20。而老一些的http encode使⽤用 RFC 1866规范,导致空格字符被编码为+号。

第三步:str1添加从腾讯游戏来联分配的key(每个平台有独立的key,如果遗忘可以联系腾讯游戏来联同学)。str1= str1+"+"+{key}。(注意是+号字符串)

第四步:计算签名。echo strtolower(md5(str1)),并转换成小写。

# 示例代码,流程调用时的sig签名计算:

def get_sig_info(act_id, game_id, user_id, seckey, sigkey, liveplat_id):
    """
    计算请求签名
    :param act_id: 活动id
    :param game_id: 游戏id
    :param user_id: 平台用户id
    :param seckey: 加密密钥,由livelink分配
    :param sigkey: 签名密钥,由livelink分配
    :param liveplat_id: 平台id,由livelink分配
    :param nonce: 6位,一次性数字,必须使用数字与字母组成
    :return:最终query string
    """
    sign_info = {
        "actId": act_id,
        "livePlatId": liveplat_id,
        "gameId": game_id,
        "v": 2.0,  # 协议版本号,固定2.0
        "t": int(time.time()),  # 时间戳,单位秒
        "nonce": ''.join(random.choice(string.ascii_lowercase) for _ in range(6)),
        "code": _get_code(user_id, seckey),
    }
    # 按升序排序
    sorted_string = _sorted_string(sign_info)
    _show_output(sorted_string, '计算签名')

    # 计算签名
    sig = _get_md5(sorted_string, sigkey)
    _show_output(sig, '最终签名')

    # 最终query string
    params = urllib.parse.urlencode(sign_info, quote_via=urllib.parse.quote) + "&sig=" + sig
    return params

def _get_md5(stored_string, sigkey):
    """
    计算md5
    :param stored_string: 排序后的query string
    :param sigkey: 签名密钥,由livelink分配
    :return:
    """
    origin_str = (stored_string + '+' + sigkey).encode(encoding='utf-8')
    return hashlib.new('md5', origin_str).hexdigest()

def _get_code(user_id, seckey):
    """
    用户userid加密,当前clientIP已支持ipv6
    :param user_id: 平台用户id
    :param seckey: 加密密钥,由livelink分配
    :return:
    """
    login_info = {'userid': user_id, 'isAnchor': 0, 'clientIP': "2001:0db8:86a3:08d3:1319:8a2e:0370:7344"}
    json_str = json.dumps(login_info)
    # AES加密
    ecb_data = _encrypt(json_str, seckey)
    # _show_output(ecb_data, 'code加密完成')
    return str(ecb_data, 'utf-8')
    
def _sorted_string(target_dict):
    """
    根据key升序排序后生成query string
    :param target_dict: 待排序字典
    :return: 排序后的query string
    """
    sorted_vk = []
    for i in sorted(target_dict.keys()):
        k = i
        v = urllib.parse.quote(str(target_dict[k]), safe="")
        sorted_vk.append(v)
    sorted_string = '+'.join(sorted_vk)
    return sorted_string
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
lastUpdate: 11/12/2024, 4:00:16 PM