腾讯云人脸核身后端API——python

import json, random, requests, hashlib, traceback

# 配置
FACERECOGNITION_SETTING = {
    'access_token_usl': "https://miniprogram-kyc.tencentcloudapi.com/api/oauth2/access_token",
    'SIGN_ticket_usl': "https://miniprogram-kyc.tencentcloudapi.com/api/oauth2/api_ticket",
    'getfaceid': "https://miniprogram-kyc.tencentcloudapi.com/api/server/getfaceid?orderNo=",
    'NONCE_ticket_url': 'https://miniprogram-kyc.tencentcloudapi.com/api/oauth2/api_ticket',

    'app_id': "app_id",  # 腾讯云提供
    'secret': "secret",  # 腾讯云提供

    'version': '1.0.0',
}

r = redis链接


class FacerecognitionBase:
    """
    继承Facerecognition
    调用 self.get_data(self, serId, userName, idNo)
    return: {
            "faceId": faceId,
            "webankAppId": webankAppId,
            "orderNo": orderNo,
            "nonce": nonce,
            "sign": sign
        }
    """

    access_token_usl = FACERECOGNITION_SETTING['access_token_usl']
    SIGN_ticket_usl = FACERECOGNITION_SETTING['SIGN_ticket_usl']
    getfaceid = FACERECOGNITION_SETTING['getfaceid']
    NONCE_ticket_url = FACERECOGNITION_SETTING['NONCE_ticket_url']

    app_id = FACERECOGNITION_SETTING['app_id']
    secret = FACERECOGNITION_SETTING['secret']

    version = FACERECOGNITION_SETTING['version']

    # 获取access_token
    def __get_access_token(self):
        access_token = r.get('access_token')
        if not access_token:
            data = {
                "app_id": self.app_id,
                "secret": self.secret,
                "grant_type": 'client_credential',
                "version": self.version,
            }
            msg = requests.get(self.access_token_usl, data)
            msg = json.loads(msg.text)
            # msg = {
            #     "code": "0",
            #     "msg": "请求成功",  # 请求结果描述
            #     "transactionTime": "20151022043831",  # 调用接口的时间
            #     "access_token": "accessToken_string",  # access_token 的值
            #     "expire_time": "20151022043831",  # access_token 失效的绝对时间
            #     "expire_in": "7200"  # access_token 的最大生存时间
            # }
            if msg['code'] != '0':
                print("access_token:\n", '%s\n' % data, msg)
                raise Exception(msg['msg'])
            r.set('access_token', msg['access_token'])
            r.expire('access_token', int(msg['expire_in']) - 10)
            access_token = msg['access_token']
        return access_token

    # 获取SIGN_ticket
    def __get_SIGN_ticket(self):
        SIGN_ticket = r.get('SIGN_ticket')
        if not SIGN_ticket:
            access_token = self.__get_access_token()
            data = {
                "app_id": self.app_id,
                "access_token": access_token,
                "type": 'SIGN',
                "version": self.version,
            }
            msg = requests.get(self.SIGN_ticket_usl, data)
            msg = json.loads(msg.text)
            # msg = {
            #     "code": "0",
            #     "msg": "请求成功",  # 请求结果描述
            #     "transactionTime": "20151022044027",  # 调用接口的时间
            #     "tickets": [  # ticket 返回数组
            #         {
            #             "value": "ticket_string",  # ticket 的值
            #             "expire_in": "3600",  # ticket 失效的绝对时间
            #             "expire_time": "20151022044027"  # ticket 的最大生存时间
            #         }
            #     ]
            # }
            if msg['code'] != '0':
                print("SIGN_ticket:\n", '%s\n' % data, msg)
                raise Exception(msg['msg'])
            else:
                r.set('SIGN_ticket', msg['tickets'][0]['value'])
                r.expire('SIGN_ticket', int(msg['tickets'][0]['expire_in']) - 10)
                SIGN_ticket = msg['tickets'][0]['value']
        return SIGN_ticket

    # 生成随机数
    def get_nonce(self, num=32):
        return ''.join((str(random.choice([random.randint(0, 9), chr(random.randint(65, 90)),
                                           chr(random.randint(97, 122))])) for i in range(num)))

    # 生成签名
    def __get_sign(self, userId, ticket):
        l = [self.version, self.app_id, ticket, self.nonce, userId]
        l.sort()
        info = ''.join(l)
        s1 = hashlib.sha1()
        s1.update(info.encode("utf-8"))  # 转码(字节流)
        return s1.hexdigest()  # 将字节码转成16进制

    # 获取NONCE_ticket
    def __get_NONCE_ticket(self, user_id):
        data = {
            "app_id": self.app_id,
            "access_token": self.__get_access_token(),
            "type": 'NONCE',
            "version": self.version,
            "user_id": user_id,
        }
        msg = requests.get(self.NONCE_ticket_url, data)
        msg = json.loads(msg.text)
        if msg['code'] != "0":
            print("NONCE_ticket:\n", '%s\n' % data, msg)
            raise Exception(msg['msg'])
        return msg['tickets'][0]['value']

    # nonce加密签名
    def nonce_sign(self, userId):
        return self.__get_sign(userId, self.__get_NONCE_ticket(userId))

    # 获取faceId
    def get_faceId(self, userId, name, idNo):
        self.nonce = self.get_nonce()
        self.orderNo = self.get_nonce()
        self.sign = self.__get_sign(userId, self.__get_SIGN_ticket())
        data = {
            "webankAppId": self.app_id,  # wbappid
            "orderNo": self.orderNo,  # 订单号
            "name": name,  # 姓名
            "idNo": idNo,  # 证件号码
            "userId": userId,  # 用户 ID
            "version": self.version,
            "sign": self.sign,  # 签名:使用上面生成的签名
            "nonce": self.nonce,  # 随机数
        }
        url = self.getfaceid + self.orderNo
        msg = requests.post(url, json=data)
        msg = json.loads(msg.text)

        if msg.get('code') != "0":
            raise Exception('获取faceId错误\n%s' % msg['error'])
        return msg['result']['faceId']

	# 获取信息
    def get_data(self, serId, userName, idNo):
        userId = userId  # 用户Id,自己生成
        userName = userName  # 用户身份证名字
        idNo = idNo  # 用户身份证号

        try:
            msg = self.get_faceId(userId, userName, idNo)
        except Exception as e:
            return {'e': e.__str__(), "Exception": traceback.format_exc()}
        
        return {
            "faceId": msg,
            "webankAppId": self.app_id,
            "orderNo": self.orderNo,
            "nonce": self.nonce,
            "sign": self.nonce_sign(userId)
        }

posted @ 2021-10-13 16:50  最冷不过冬夜  阅读(482)  评论(0编辑  收藏  举报