支付宝刷脸支付对接流程

因为现在的支付基本都使用支付宝微信了,刷脸也应用的越来越多,所以需要写一个对接支付宝刷脸支付的接口

支付宝刷脸主要提供了两种不同的接口,一个是生活类的刷脸接口,一个是支付类的刷脸接口

生活类的刷脸接口主要是配合一个查询的接口使用的,用户刷脸查询用户的基本信息,姓名、身份证号、手机号之类的;

支付类的刷脸接口则是用户刷脸直接授权支付进行扣费的接口;两个接口虽然后面的目的不太相同,但是开始的准备和所需的参数基本类似

一、刷脸支付的基本流程
1、首先要获取商户信息
商户必须是开通了刷脸支付权限的商户,在这一步的时候商户是需要进行第三方应用授权的,拿着服务商的appid,拼接一个URL,唤起授权页,商户的账号登录点击授权获取一个app_auth_code,之后使用app_auth_code换取app_auth_token,code的有效期是有时间限制的,token是一直不变的,后续的业务要进行,商户必须有token,拼接URL的代码如下:

 public void oauthToHis() {
 
        String alipayRedirectOauthUri ="restapi/smilePay/getAuthCode";
        String alipayOauthurl = AlipayConfig.ALIPAY_OAUTHURL;//第三应用授权地址
        String oauthToHis = "";
        try {
            oauthToHis = alipayOauthurl + "?" +
                    "app_id=" + URLEncoder.encode("APPID", "utf-8") +
                    "&redirect_uri=" + URLEncoder.encode(alipayRedirectOauthUri, "utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            System.out.println("编码错误");
        }
        System.out.println(oauthToHis);
 
    }
商户授权后支付宝会带着code返回URL里面的回调地址,这时候用code换取token,代码如下:

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2");
AlipayOpenAuthTokenAppRequest request = new AlipayOpenAuthTokenAppRequest();
request.setBizContent("{" +
"    \"grant_type\":\"authorization_code\"," +
"    \"code\":\"1cc19911172e4f8aaa509c8fb5d12F56\"" +
"  }");
AlipayOpenAuthTokenAppResponse response = alipayClient.execute(request);
获取到token后,商户信息的准备就结束了,开始调用

2、商户app会拿着商户信息去预热
一般只会预热一次,预热后获取设备信息,拿到这些信息后组装参数传给服务端,服务端用这些参数去支付宝初始化,代码如下;

public static ZolozAuthenticationCustomerSmileliveInitializeResponse smileInitialize(PayAccountInfoDO payAccountInfoDO,
            SmileInitializePara smileInitializePara) throws AlipayApiException ,UnsupportedEncodingException {
        //创建API对应的request类
        ZolozAuthenticationCustomerSmileliveInitializeRequest request
                = new ZolozAuthenticationCustomerSmileliveInitializeRequest();
 
        // zolozGetMetaInfo接口返回的metainfo对象中加入业务参数
        String strZimmetainfo = smileInitializePara.getMetaInfo();
        strZimmetainfo = URLDecoder.decode(strZimmetainfo, "utf-8");
 
        JSONObject zimmetainfo = JSON.parseObject(strZimmetainfo); //客户端zolozGetMetaInfo接口返回的metainfo对象
        JSONObject extInfo = new JSONObject();
 
        /* start: 如果是1:1刷脸认证(姓名+身份证号),*/
        if (SmileInitializeBizTypeEnums.CERTNO_CERTNAME.getCode() == smileInitializePara.getBizType()) {
            extInfo.put("certNo", smileInitializePara.getCertNo()); //必填,当前被认证用户的身份证号
            extInfo.put("certName", smileInitializePara.getCertName());//必填,当前被认证用户的姓名(保持和身份证一致)
            extInfo.put("certType", "IDCARD"); //写为IDCARD,表明身份证
            extInfo.put("bizType", "1"); //固定写为1,表明1:1身份核验场景
        }
        /* end: -------------------------------------------- */
 
        /* start: 如果是1:1刷脸认证(手机号),什么都不传 */
        extInfo.put("bizType", "4"); //固定写为4,表明1:1刷脸核身(手机号)场景
        /* end: -------------------------------------- */
        zimmetainfo.put("extInfo", extInfo);
        //设置业务参数
        JSONObject biz = new JSONObject();
        try {
//            biz.put("zimmetainfo", URLEncoder.encode(zimmetainfo.toJSONString(), "utf-8"));
            biz.put("zimmetainfo",  zimmetainfo );
        } catch (Exception e) {
            e.printStackTrace();
        }
        request.setBizContent(biz.toJSONString());
 
        //通过alipayClient调用API,获得对应的response类
        AlipayClient alipayClient = AlipayAPIClientFactory.getAlipayClientOnOpenAPIGateWay(payAccountInfoDO);
        ZolozAuthenticationCustomerSmileliveInitializeResponse response = null;
        try {
            response = alipayClient.execute(request,null,payAccountInfoDO.getAppAuthToken());
        } catch (AlipayApiException e) {
            log.error("logId:{}, 刷脸支付初始化接口 异常,excepiton:", e);
            throw e;
        }
        return response;
    }
3、获取ftoken进行支付
初始化成功后会获取到一个刷脸标识的id和刷脸标识的协议,即zimId和zimInitClientData,把这两个参数返回给客户端,拿到两个参数后的商户app会自动唤起人脸识别,返回一个ftoken传给服务端,服务端拿到ftoken直接调用支付宝的条码支付接口,把ftoken的值传给auth_code再写死一个scene为security_code就可以了

/**
     * 支付宝刷脸支付收单接口,和条码支付类似  刷脸支付默认为security_code
     *
     * @param logId
     * @param payAccountInfoDO
     * @param out_trade_no
     * @param auth_code
     * @param total_amount
     * @param subject
     * @return
     * @throws AlipayApiException
     */
    public static AlipayTradePayResponse smilePay(String logId, PayAccountInfoDO payAccountInfoDO, String out_trade_no,
                                                  String ftoken, String total_amount, String subject) throws AlipayApiException {
 
        StringBuilder sb = new StringBuilder();
        sb.append("{\"out_trade_no\":\"" + out_trade_no + "\",");
        sb.append("\"scene\":\"security_code\",");
        sb.append("\"auth_code\":\"" + ftoken + "\",");
        sb.append("\"total_amount\":\"" + total_amount + "\",");
        sb.append("\"subject\":\"" + subject + "\",");
        sb.append("\"timeout_express\":\"10m\"}");
 
        AlipayClient alipayClient = AlipayAPIClientFactory.getAlipayClientOnOpenAPIGateWay(payAccountInfoDO);
 
        // 使用SDK,构建请求模型
        AlipayTradePayRequest request = new AlipayTradePayRequest();
        request.setBizContent(sb.toString());
        AlipayTradePayResponse response = null;
 
        try {
            // 使用SDK,调用交易下单接口
            response = alipayClient.execute(request,null,payAccountInfoDO.getAppAuthToken());
 
        } catch (AlipayApiException e) {
            log.error("logId:{}, 刷脸支付收单接口 异常,excepiton:", e);
            throw e;
        }
        return response;
    }
刷脸支付到这里基本就结束了。

二、生活类刷脸接口
因为必须要商户授权码,还需要用户授权,因为要查询用户的基本信息,需要先组装授权的URL给商户和用户,获取授权码后初始化之类的,回调地址要配置在商户的平台,支付宝会返回授权访问令牌,获取后再查询商户信息。

生活类刷脸获取用户信息的第一步和第二步与支付类相似,都是获取商户的token然后进行初始化唤起人脸识别,但是支付的唤起人脸识别后直接调用支付接口,查询信息的则需要先进行用户授权

3、唤起授权页用户进行授权
 empowerURL = alipayAuthurl + "?" +
                    "auth_type=" + URLEncoder.encode("FACE_REC_OAUTH", "utf-8") +
                    "&ftoken=" + URLEncoder.encode(smileInitializePara.getFtoken(), "utf-8") +
                    "&scope=" + URLEncoder.encode("auth_user", "utf-8") +
                    "&app_id=" + URLEncoder.encode(accountByMchId.getAppId(), "utf-8") +
                    "&state=" + URLEncoder.encode(state, "utf-8")  +
                    "&redirect_uri=" + URLEncoder.encode(redirectUri, "utf-8")
            ;
 4、获取授权访问令牌
 拼接授权连接获取到用户授权,支付宝会返回一个auth_code,然后调用支付宝alipay.system.oauth.token接口,返回access_token  授权访问令牌,代码如下 :

 public static AlipaySystemOauthTokenResponse oauthToken(String logId, PayAccountDO payAccountDO, String code) throws AlipayApiException {
        AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
        AlipayClient alipayClient = AlipayAPIClientFactory.getAlipayClientOnOpenAPISmile(payAccountDO);
 
        request.setGrantType("authorization_code"); //值为authorization_code时,代表用code换取;值为refresh_token时,代表用refresh_token换取
        request.setCode(code);
        AlipaySystemOauthTokenResponse response = null;
        try {
            //这里第三方应用时,也不能传入 appAuthToken
            response = alipayClient.execute(request);
        } catch (AlipayApiException e) {
             log.error("logId:{},换取授权访问令牌 异常,excepiton:", logId, e);
            throw e;
        }
 
        return response;
    }
获取到用户的授权访问令牌

5、查询用户信息
获取到授权访问令牌查询用户的基本信息,代码如下:

public static AlipayUserInfoShareResponse infoShare(String logId, PayAccountDO payAccountDO, String accessToken) {
        AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest();
        AlipayClient alipayClient = AlipayAPIClientFactory.getAlipayClientOnOpenAPISmile(payAccountDO);
        AlipayUserInfoShareResponse response = null;
        try {
            response = alipayClient.execute(request, accessToken);
        } catch (AlipayApiException e) {
            e.printStackTrace();
            log.error("logId:{},根据accessType获取用户信息 异常,excepiton:",logId, e);
        }
        log.info("logId:{},根据accessType获取用户信息结果:{}",logId, JSONObject.toJSONString(response));
        return response;
    }
到此生活类刷脸就结束了
————————————————
版权声明:本文为优快云博主「鬼槎」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/guiqiaoai/article/details/84283406

<think>好的,用户想了解如何实现刷脸支付功能。首先,我需要整理刷脸支付的基本流程和技术要点。根据提供的引用内容,支付宝有相关的接口文档,比如引用5提到的接入指南,应该是一个重要的参考。 接下来,技术方案部分需要涵盖硬件和软件两个方面。硬件方面,摄像头需要满足一定要求,比如高分辨率、活体检测等,这可能涉及到引用3中提到的阿里云人脸识别的红框检测,确保能够准确捕捉人脸。软件部分,人脸识别算法是关键,引用4中的faceCheck函数示例展示了如何进行人脸比对,这可能需要调用类似阿里云或支付宝的API。 然后,支付接口的对接也很重要。引用5提供了支付宝的文档链接,需要指导用户如何集成SDK,处理支付请求和回调。同时,安全性必须强调,比如数据加密和活体检测,引用1提到非接触和安全性优势,这里可以引用说明。 用户可能还需要考虑不同平台的兼容性,比如uniapp小程序或移动端H5,引用3提到全平台兼容,这可能对开发者有帮助。最后,生成相关问题时要覆盖技术实现、安全优化、用户体验和应用场景,这样用户能全面了解。</think>### 如何实现刷脸支付功能 #### 1. 技术方案概述 刷脸支付的核心是**人脸识别技术**与**支付接口**的集成,主要分为以下步骤: 1. **人脸采集与活体检测**:通过摄像头捕捉用户面部信息,并验证是否为真实活体(如眨眼、张嘴等动作检测)[^3][^4]。 2. **人脸特征提取与比对**:将采集到的人脸数据转换为特征向量,与系统注册的模板进行相似度计算(例如相似度阈值≥0.95)。 3. **支付授权与交易处理**:确认身份后调用支付接口(如支付宝、微信支付)完成扣款[^5]。 --- #### 2. 具体实现步骤 ##### 2.1 硬件及环境准备 - **摄像头设备**:需支持高分辨率(如1080P以上)和近红外活体检测[^3]。 - **开发环境**:全平台兼容框架(如uniapp)或原生开发(Android/iOS)[^3]。 ##### 2.2 人脸识别功能开发 - **调用人脸识别API**(以阿里云为例): ```python # 初始化人脸识别SDK def face_init(): # 加载模型和配置,返回句柄 pass # 检测并提取人脸特征 def face_detect(handle, image): # 返回人脸坐标及特征向量 pass ``` - **活体检测**:通过动作指令或多光谱验证(如3D结构光)[^3]。 ##### 2.3 支付接口对接支付宝为例,需完成以下步骤: 1. **注册开发者账号**并申请刷脸支付权限[^5]。 2. **集成SDK**: ```java // 支付宝SDK初始化 AlipayClient client = new DefaultAlipayClient( "https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", "UTF-8", ALIPAY_PUBLIC_KEY, "RSA2" ); ``` 3. **发起支付请求**: ```python # 调用刷脸支付接口 def face_payment(user_id, amount): # 生成支付订单并绑定人脸token # 返回支付结果 ``` ##### 2.4 安全性设计 - **数据加密**:人脸特征和支付信息使用HTTPS传输,敏感数据本地加密[^5]。 - **防攻击策略**:防止照片/视频回放攻击,结合活体检测和随机动作验证[^4]。 --- #### 3. 示例代码(简化版) ```python # 人脸识别+支付逻辑整合 def face_payment_flow(): handle = face_init() # 初始化人脸识别 image = capture_image() # 从摄像头获取图像 faces = face_detect(handle, image) if faces and liveness_check(faces[0]): user_id = match_user(faces[0].features) # 特征比对 result = alipay_face_pay(user_id, amount=100.0) return "支付成功" if result else "支付失败" else: return "人脸验证失败" ``` ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值