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 (用戶唯一標識)值無效