栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java实现腾讯云人脸核身pc端和移动端(浏览器)H5接入

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java实现腾讯云人脸核身pc端和移动端(浏览器)H5接入

PC端H5接入
  1. 获取AccessToken
    作 用: 后续获取签名和接口调用都会用到。
    注意事项: Access Token 必须缓存在磁盘,并定时刷新,且不能并发刷新,建议每20分钟请求新的 Access Token,获取之后立即使用最新的 Access Token。旧的只有一分钟的并存期。
  2. 获取SignTicket
    作 用: 制作签名用到,签名用在后面接口中
    注意事项: 和AccessToken一样
  3. 根据SignTicket生成签名(用于geth5faceid接口)
  4. 调用geth5faceid接口
  5. 获取NonceTicket
  6. 获取H5人脸认证签名
  7. 获取“启动H5人脸合身”链接
    注意事项: 随机数和上面生成签名的随机数保持一致
  • 代码是按照上面7个步骤排列来处理的
  • 代码中用到的HttpClient请求请参考另外一篇文章:http://t.csdn.cn/gQNP9
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.example.facedetection.faceVerify.entity.AccessTokenEntity;
import com.example.facedetection.faceVerify.entity.FaceidRsultEntity;
import com.example.facedetection.faceVerify.entity.SiginTicketEntity;
import com.google.common.base.Charsets;
import com.google.common.hash.Hashing;
import java.io.UnsupportedEncodingException;
import java.util.*;

public class FaceVerifyPcUtil {
    private static String access_token_url = "https://miniprogram-kyc.tencentcloudapi.com/api/oauth2/access_token";
    private static String api_ticket_url = "https://miniprogram-kyc.tencentcloudapi.com/api/oauth2/api_ticket";
    private static String geth5faceid_url = "https://miniprogram-kyc.tencentcloudapi.com/api/server/h5/geth5faceid";
    public static String accessToken = "WAA0f-dGGlQHTVClazkxtmW6FX_nRhpUB01QpWs5MbZluhUFn7WNPkTDcYYesaX-iJtc09MkkN152qd9It4AsQ8Mwg";
    public static String signTicket = "bqpmxJrLtmJYk8BRN9RXhQPeaeWygLEf8QwpPHugBhBURaaLvBYAbXwJXU5NICK7";
    public static void main(String[] args) throws UnsupportedEncodingException {
        // 1.获取AccessToken
        AccessTokenEntity accessTokenEntity = getAccessToken();
        accessToken = accessTokenEntity.getAccessToken();
        System.out.println("====accessToken:"+accessToken);
        // 2.获取签名
        SiginTicketEntity siginTicketEntity = FaceVerifyPcUtil.getSignTicket(FaceVerifyPcUtil.accessToken);
        signTicket = siginTicketEntity.getTickets().get(0).getValue();
        System.out.println("====signTicket:"+signTicket);
    }

    
    public static AccessTokenEntity getAccessToken(){
        // 请求链接
        String accessTokenUrl = access_token_url
                +"?app_id=" + FaceConfig.APP_ID
                +"&secret=" + FaceConfig.SECRET
                +"&grant_type=" + FaceConfig.GRANT_TYPE
                +"&version=" + FaceConfig.VERSION;
        String accessTokenObj = HttpClientUtil.doGet(accessTokenUrl, "utf-8");

        AccessTokenEntity accessToken = JSON.parseObject(accessTokenObj, AccessTokenEntity.class);
        return accessToken;
    }
    
    public static SiginTicketEntity getSignTicket(String accessToken){
        // 请求链接
        String accessTokenUrl = api_ticket_url
                        +"?app_id=" + FaceConfig.APP_ID
                        +"&access_token=" + accessToken
                        +"&type=" + FaceConfig.TYPE_SIGN
                        +"&version=" + FaceConfig.VERSION;
        String signTicketObj = HttpClientUtil.doGet(accessTokenUrl, "utf-8");
        SiginTicketEntity siginTicketEntity = JSON.parseObject(signTicketObj, SiginTicketEntity.class);
        return siginTicketEntity;
    }

    // 3. 生成签名(用于geth5faceid接口)
    public static String getSignTicketSign(String orderNo, String userId, String userName, String idCard, String signTicket){
        // 获取SIGN ticket
        List list = new ArrayList<>();
        // wbappid
        list.add(FaceConfig.APP_ID);
        // orderNo
        list.add(orderNo);
        // name
        list.add(userName);
        // idNo
        list.add(idCard);
        // userId
        list.add(userId);
        // version
        list.add("1.0.0");
        // 生成签名
        String sign = sign(list, signTicket);
        System.out.println("=======sign:"+sign);
        return sign;
    }

    // 4. 调用geth5faceid接口
    //    API ticket 的 NONCE 类型,其有效期为120秒,且一次性有效,即每次启动 SDK 刷脸都要重新请求 NONCE ticket。
    public static FaceidRsultEntity getH5faceid(String name, String idCard, String userId, String orderNo, String sign){
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("webankAppId", FaceConfig.APP_ID);
        jsonObject.put("name", name);
        jsonObject.put("orderNo", orderNo);
        jsonObject.put("idNo", idCard);
        jsonObject.put("userId", userId);
        jsonObject.put("version", FaceConfig.VERSION);
        jsonObject.put("sign", sign);
        System.out.println(jsonObject.toString());
        String h5faceidResult = HttpClientUtil.doPost(geth5faceid_url+"?orderNo="+orderNo, jsonObject);
        FaceidRsultEntity faceidRsultEntity = JSON.parseObject(h5faceidResult, FaceidRsultEntity.class);
        return faceidRsultEntity;
    }

    // 5. 获取NONCE ticket
    public static SiginTicketEntity getNonceTicket(String accessToken, String userId){
        // 请求链接
        String accessTokenUrl = api_ticket_url
                +"?app_id=" + FaceConfig.APP_ID
                +"&access_token=" + accessToken
                +"&type=" + FaceConfig.TYPE_NONCE
                +"&version=" + FaceConfig.VERSION
                +"&user_id=" + userId;
        String signTicketObj = HttpClientUtil.doGet(accessTokenUrl, "utf-8");
        SiginTicketEntity siginTicketEntity = JSON.parseObject(signTicketObj, SiginTicketEntity.class);
        return siginTicketEntity;
    }
    // 6. 获取H5人脸认证签名
    public static String getNonceTicketSgin(String orderNo, String userId, String h5faceId, String nonceTicket, String nonce){
        // 获取SIGN ticket
        List list = new ArrayList<>();
        // wbappid
        list.add(FaceConfig.APP_ID);
        // version
        list.add(FaceConfig.VERSION);
        // orderNo
        list.add(orderNo);
        // userId
        list.add(userId);
        // h5faceId
        list.add(h5faceId);
        // nonce 随机数:32位随机串(字母+数字组成的随机数)

        list.add(nonce);
        // 生成签名
        String sign = sign(list, nonceTicket);
        System.out.println(sign);
        return sign;
    }
    // 7. 获取“启动H5人脸合身”链接
    public static String getH5Login(String optimalDomain, String userId, String orderNo, String h5faceId, String url, String signNonce, String nonce) {
        String h5Url = "https://"+optimalDomain+"/api/pc/login"
                + "?webankAppId=" + FaceConfig.APP_ID
                + "&version=" + FaceConfig.VERSION
                + "&nonce="+nonce
                + "&orderNo=" + orderNo
                + "&h5faceId=" + h5faceId
                + "&url=" + url
                + "&userId=" + userId
                + "&sign=" + signNonce;
        System.out.println("=========h5Url:"+h5Url);
        return h5Url;
    }
    // 签名公共方法
    protected static String sign(List values, String ticket) { //values传ticket外的其他参数
        if (values == null) {
            throw new NullPointerException("values is null");
        }
        values.removeAll(Collections.singleton(null));// remove null
        values.add(ticket);
        java.util.Collections.sort(values);

        StringBuilder sb = new StringBuilder();
        for (String s : values) {
            sb.append(s);
        }
        return Hashing.sha1().hashString(sb, Charsets.UTF_8).toString().toUpperCase();
    }
    // 获取任意长度随机字符串
    public static String randomAlphanumeric(){
        String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        Random random = new Random();
        //指定字符串长度,拼接字符并toString
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 32; i++) {
            //获取指定长度的字符串中任意一个字符的索引值
            int number = random.nextInt(str.length());
            //根据索引值获取对应的字符
            char charAt = str.charAt(number);
            sb.append(charAt);
        }
        System.out.println("===========32位字符串:"+sb.toString());
        return sb.toString();
    }
}
移动端H5接入
  • 基本和Pc端步骤一样,只是个别调用接口名称和参数及返回值名称做了改变。
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.example.facedetection.faceVerify.entity.FaceidRsultEntity;
import java.util.ArrayList;
import java.util.List;


public class FaceVerifyModUtils {
    private static String ADVFACE_URL = "https://miniprogram-kyc.tencentcloudapi.com/api/server/getAdvFaceId";
    // 1. 获取Sign ticket--与pc端共用,此处略
    
    public static String getSignTicketSign(String userId, String signTicket, String nonce){
        // 获取SIGN ticket
        List list = new ArrayList<>();
        // wbappid
        list.add(FaceConfig.APP_ID);
        // userId
        list.add(userId);
        // version
        list.add("1.0.0");
        // 32位随机数
        list.add(nonce);
        // 生成签名
        String sign = FaceVerifyPcUtil.sign(list, signTicket);
        System.out.println("=======sign:"+sign);
        return sign;
    }

    
    public static FaceidRsultEntity getAdvFaceId(String orderNo, String name, String idCard, String userId, String ticketSign, String nonce){
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("appId", FaceConfig.APP_ID);
        jsonObject.put("orderNo", orderNo);
        jsonObject.put("name", name);
        jsonObject.put("idNo", idCard);
        jsonObject.put("userId", userId);
        jsonObject.put("version", FaceConfig.VERSION);
        jsonObject.put("sign", ticketSign);
        jsonObject.put("nonce", nonce);
        // post请求
        String h5faceidResult = HttpClientUtil.doPost(ADVFACE_URL+"?orderNo="+orderNo, jsonObject);
        FaceidRsultEntity faceidRsultEntity = JSON.parseObject(h5faceidResult, FaceidRsultEntity.class);
        return faceidRsultEntity;
    }
    // 4. 获取NonceTicket-使用pc端的,此处略
    // 5. 生成Nonce签名
    public static String getNonceTicketSign(String orderNo, String userId, String faceId, String noceTicketSign, String nonce){
        // 获取SIGN ticket
        List list = new ArrayList<>();
        // wbappid
        list.add(FaceConfig.APP_ID);
        // orderNo
        list.add(orderNo);
        // userId
        list.add(userId);
        // faceId
        list.add(faceId);
        // version
        list.add("1.0.0");
        // 32位随机数
        list.add(nonce);
        // 生成签名
        String sign = FaceVerifyPcUtil.sign(list, noceTicketSign);
        System.out.println("=======sign:"+sign);
        return sign;
    }

    
    public static String getLoginUrl(String optimalDomain, String nonce, String orderNo, String faceId,
                                     String url, String resultType, String userId, String noceSign, String from,
                                     String redirectType){
        StringBuilder sb = new StringBuilder("https://");
        sb.append(optimalDomain).append("/api/web/login");
        sb.append("?webankAppId=").append(FaceConfig.APP_ID);
        sb.append("&version=").append(FaceConfig.VERSION);
        sb.append("&nonce=").append(nonce);
        sb.append("&orderNo=").append(orderNo);
        sb.append("&faceId=").append(faceId);
        sb.append("&url=").append(url);
        sb.append("&resultType=").append(resultType);
        sb.append("&userId=").append(userId);
        sb.append("&sign=").append(noceSign);
        sb.append("&from=").append(from);
        sb.append("&redirectType=").append(redirectType);
        System.out.println("=========h5Url:"+ sb);
        return sb.toString();
    }
}

付完整demo,开箱即用:https://download.csdn.net/download/just_you_java/86092683

参考文档:

  1. 腾讯云-PC 端 H5 接入
  2. 腾讯云-移动 H5 人脸核身介绍
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1013922.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号