# 流程调用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
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