import json
from Crypto.Cipher import AES
import base64
import requests
import hashlib
import time
import os
import binascii
URL = "https://wlc.nppa.gov.cn/test/authentication/check" #接口调用地址(实名认证)
KEY = "d10d8642c66c1c785aa32b194aba2afa" #访问密钥
APPID = "9177929f5010481b858f661a409fd764" #接口调用唯一凭证 由系统发放
BIZID = "1101999999" #业务权限标识 与游戏备案识别码一致
#测试用例
TEST_PARAMS = {"ai":"100000000000000001",
"name":"某一一",
"idNum":"110000190101010001"}
class AES_GCM(object):
def __init__(self, key):
self.key = key #秘钥
self.MODE = AES.MODE_GCM
self.iv = os.urandom(12)
def aes_encrypt(self, params):
aes = AES.new(binascii.unhexlify(self.key), self.MODE, self.iv)
params, tag=aes.encrypt_and_digest(json.dumps(params).encode("utf-8"))
base64_data= self.iv + params + tag
encrypted_text = str(base64.b64encode(base64_data), encoding='utf-8')
return encrypted_text
def aes_decrypt(self, encrypted_text):
encrypted_text = base64.b64decode(encrypted_text)
cipher = AES.new(binascii.unhexlify(self.key), self.MODE, encrypted_text[:12])
cc = cipher.decrypt_and_verify(encrypted_text[12:-16], encrypted_text[-16:])
return json.loads(cc)
def hash256(pre_hash_text):
hs256 = hashlib.sha256()
hs256.update(pre_hash_text.encode())
return hs256.hexdigest()
def sorted_params(params, param_="%s%s", none_keys = []):
return "".join([
param_ % i for i in
sorted(params.items(), key=lambda d:d[0]) if i[0] not in none_keys
])
def main():
aesobject = AES_GCM(KEY)
_time = str(int(time.time() * 1000))
#############上报用户行为(上线 下线),直接替换TEST_PARAMS 接口调用地址 http:// api2.wlc.nppa.gov.cn/behavior/collection/loginout 实名认证接结果查询接口http:// api2.wlc.nppa.gov.cn/idcard/authentication/query
#no:[条目编码]在批量模式中标识一条行为数据,取值范围 1-128
#si:[游戏内部会话标识]一个会话标识只能对应唯一的实名用户,一个实名用户可以拥有多个会话标识;同一用户单次游戏会话中,上下线动作必须使用同一会话标识上报备注:
# 会话标识仅标识一次用户会话,生命周期仅为一次上线和与之匹配的一次下线,不会对生命周期之外的任何业务有任何影响
#bt:[用户行为类型]游戏用户行为类型0:下线,1:上线
#ot:[行为发生时间]行为发生时间戳,单位秒
#ct:[上报类型]用户行为数据上报类型,0:已认证通过用户,2:游客用户
#di:[设备标识]游客模式设备标识,由游戏运营单位生成,游客用户下必填
#pi:[用户唯一标识]已通过实名认证用户的唯一标识,已认证通过用户必填 由38位的字符串构成,其中包括用户出生日期和用户编码两部分。用户出生日期以26进制(10个数字+英文字母表前16个字母)的方式编码,位于用户唯一标识前6位;用户编码由网络游戏防沉迷实名认证系统生成,位于用户唯一标识的后32位。
# 例如:用户唯一标识 1hpfml09b57f3f8185f8cb5094ea3f26278efb 用户生日部分是1hpfml 用户编码部分是09b57f3f8185f8cb5094ea3f26278efb
player_data = {'collections':[{"no":1,"si":"w7ligxjw355ftctm94yqt9dcew4zd723","bt":0,"ot":_time,"ct":0,"di":"uyiv6clpf7cu296pd4ppv11le820dhkw","pi":"1fffbjzos82bs9cnyj1dna7d6d29zg4esnh99u"}]}
##############
aes_gcm = aesobject.aes_encrypt(TEST_PARAMS)
body_data='{"data":"%s"}' % aes_gcm ## 国家游戏防沉迷的api试了不能进行json.dumps()
## 加入请求头报文
headers = {"Content-Type":"application/json; charset=utf-8","appId":APPID,"bizId":BIZID,"timestamps":_time}
## 对请求头报文排序并排除 不必要的字段进行字符串拼接
params_str = sorted_params(headers, none_keys=["Content-Type"])
headers["sign"] = hash256("".join([KEY, params_str, body_data]))
# print(aesobject.aes_decrypt(aes_gcm)) ## 解码
response = requests.post(URL, headers=headers, data= body_data)
print(response.json())
if __name__ == '__main__':
main()
附录: 响应参数
字段 类型 名称 字段说明
errcode Int 状态码 状态码
errmsg String 状态描述 状态描述
data Object 响应对象 响应结果
data.result Object 响应结果对象 响应结果内容
data.result.status Int 实名认证结果 认证结果 0:认证成功 1:认证中 2:认证失败
data.result.pi String 用户唯一标识 已通过实名认证用户的唯一标识
接口返回状态码
状态码 状态描述 状态说明
0 OK 请求成功
1001 SYS ERROR 系统错误
1002 SYS REQ RESOURCE NOT EXIST 接口请求的资源不存在
1003 SYS REQ METHOD ERROR 接口请求方式错误
1004 SYS REQ HEADER MISS ERROR 接口请求核心参数缺失
1005 SYS REQ IP ERROR 接口请求IP地址非法
1006 SYS REQ BUSY ERROR 接口请求超出流量限制
1007 SYS REQ EXPIRE ERROR 接口请求过期
1008 SYS REQ PARTNER ERROR 接口请求方身份非法
1009 SYS REQ PARTNER AUTH DISABLE 接口请求方权限未启用
1010 SYS REQ AUTH ERROR 接口请求方无该接口权限
1011 SYS REQ PARTNER AUTH ERROR 接口请求方身份核验错误
1012 SYS REQ PARAM CHECK ERROR 接口请求报文核验失败
实名认证业务异常
2001 BUS AUTH IDNUM ILLEGAL 身份证号格式校验失败
2002 BUS AUTH RESOURCE LIMIT 实名认证条目已达上限
2003 BUS AUTH CODE NO AUTH RECODE 无该编码提交的实名认证记录
2004 BUS AUTH CODE ALREADY IN USE 编码已经被占用
游戏用户行为数据上报业务异常
3001 BUS COLL PARTIAL ERROR 行为数据部分上报失败
3002 BUS COLL BEHAVIOR NULL ERROR 行为数据为空
3003 BUS COLL OVER LIMIT COUNT 行为数据超出条目数量限制
3004 BUS COLL NO INVALID 行为数据编码错误
3005 BUS COLL BEHAVIOR TIME ERROR 行为发生时间错误
3006 BUS COLL PLAYER MODE INVALID 用户类型无效
3007 BUS COLL BEHAVIOR MODE INVALID 行为类型无效
3008 BUS COLL PLAYERID MISS 缺失PI(用户唯一标识)值
3009 BUS COLL DEVICEID MISS 缺失DI(设备标识)值 3
010 BUS COLL PLAYERID INVALID PI (用户唯一标识)值无效