支付宝刷脸支付对接流程
因?yàn)楝F(xiàn)在的支付基本都使用支付寶微信了,刷臉也應(yīng)用的越來(lái)越多,所以需要寫(xiě)一個(gè)對(duì)接支付寶刷臉支付的接口
支付寶刷臉主要提供了兩種不同的接口,一個(gè)是生活類的刷臉接口,一個(gè)是支付類的刷臉接口
生活類的刷臉接口主要是配合一個(gè)查詢的接口使用的,用戶刷臉查詢用戶的基本信息,姓名、身份證號(hào)、手機(jī)號(hào)之類的;
支付類的刷臉接口則是用戶刷臉直接授權(quán)支付進(jìn)行扣費(fèi)的接口;兩個(gè)接口雖然后面的目的不太相同,但是開(kāi)始的準(zhǔn)備和所需的參數(shù)基本類似
一、刷臉支付的基本流程
1、首先要獲取商戶信息
商戶必須是開(kāi)通了刷臉支付權(quán)限的商戶,在這一步的時(shí)候商戶是需要進(jìn)行第三方應(yīng)用授權(quán)的,拿著服務(wù)商的appid,拼接一個(gè)URL,喚起授權(quán)頁(yè),商戶的賬號(hào)登錄點(diǎn)擊授權(quán)獲取一個(gè)app_auth_code,之后使用app_auth_code換取app_auth_token,code的有效期是有時(shí)間限制的,token是一直不變的,后續(xù)的業(yè)務(wù)要進(jìn)行,商戶必須有token,拼接URL的代碼如下:
?public void oauthToHis() {
?
? ? ? ? String alipayRedirectOauthUri ="restapi/smilePay/getAuthCode";
? ? ? ? String alipayOauthurl = AlipayConfig.ALIPAY_OAUTHURL;//第三應(yīng)用授權(quán)地址
? ? ? ? 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("編碼錯(cuò)誤");
? ? ? ? }
? ? ? ? System.out.println(oauthToHis);
?
? ? }
商戶授權(quán)后支付寶會(huì)帶著code返回URL里面的回調(diào)地址,這時(shí)候用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后,商戶信息的準(zhǔn)備就結(jié)束了,開(kāi)始調(diào)用
2、商戶app會(huì)拿著商戶信息去預(yù)熱
一般只會(huì)預(yù)熱一次,預(yù)熱后獲取設(shè)備信息,拿到這些信息后組裝參數(shù)傳給服務(wù)端,服務(wù)端用這些參數(shù)去支付寶初始化,代碼如下;
public static ZolozAuthenticationCustomerSmileliveInitializeResponse smileInitialize(PayAccountInfoDO payAccountInfoDO,
? ? ? ? ? ? SmileInitializePara smileInitializePara) throws AlipayApiException ,UnsupportedEncodingException {
? ? ? ? //創(chuàng)建API對(duì)應(yīng)的request類
? ? ? ? ZolozAuthenticationCustomerSmileliveInitializeRequest request
? ? ? ? ? ? ? ? = new ZolozAuthenticationCustomerSmileliveInitializeRequest();
?
? ? ? ? // zolozGetMetaInfo接口返回的metainfo對(duì)象中加入業(yè)務(wù)參數(shù)
? ? ? ? String strZimmetainfo = smileInitializePara.getMetaInfo();
? ? ? ? strZimmetainfo = URLDecoder.decode(strZimmetainfo, "utf-8");
?
? ? ? ? JSONObject zimmetainfo = JSON.parseObject(strZimmetainfo); //客戶端zolozGetMetaInfo接口返回的metainfo對(duì)象
? ? ? ? JSONObject extInfo = new JSONObject();
?
? ? ? ? /* start: 如果是1:1刷臉認(rèn)證(姓名+身份證號(hào)),*/
? ? ? ? if (SmileInitializeBizTypeEnums.CERTNO_CERTNAME.getCode() == smileInitializePara.getBizType()) {
? ? ? ? ? ? extInfo.put("certNo", smileInitializePara.getCertNo()); //必填,當(dāng)前被認(rèn)證用戶的身份證號(hào)
? ? ? ? ? ? extInfo.put("certName", smileInitializePara.getCertName());//必填,當(dāng)前被認(rèn)證用戶的姓名(保持和身份證一致)
? ? ? ? ? ? extInfo.put("certType", "IDCARD"); //寫(xiě)為IDCARD,表明身份證
? ? ? ? ? ? extInfo.put("bizType", "1"); //固定寫(xiě)為1,表明1:1身份核驗(yàn)場(chǎng)景
? ? ? ? }
? ? ? ? /* end: -------------------------------------------- */
?
? ? ? ? /* start: 如果是1:1刷臉認(rèn)證(手機(jī)號(hào)),什么都不傳 */
? ? ? ? extInfo.put("bizType", "4"); //固定寫(xiě)為4,表明1:1刷臉核身(手機(jī)號(hào))場(chǎng)景
? ? ? ? /* end: -------------------------------------- */
? ? ? ? zimmetainfo.put("extInfo", extInfo);
? ? ? ? //設(shè)置業(yè)務(wù)參數(shù)
? ? ? ? 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());
?
? ? ? ? //通過(guò)alipayClient調(diào)用API,獲得對(duì)應(yīng)的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進(jìn)行支付
初始化成功后會(huì)獲取到一個(gè)刷臉標(biāo)識(shí)的id和刷臉標(biāo)識(shí)的協(xié)議,即zimId和zimInitClientData,把這兩個(gè)參數(shù)返回給客戶端,拿到兩個(gè)參數(shù)后的商戶app會(huì)自動(dòng)喚起人臉識(shí)別,返回一個(gè)ftoken傳給服務(wù)端,服務(wù)端拿到ftoken直接調(diào)用支付寶的條碼支付接口,把ftoken的值傳給auth_code再寫(xiě)死一個(gè)scene為security_code就可以了
/**
? ? ?* 支付寶刷臉支付收單接口,和條碼支付類似 ?刷臉支付默認(rèn)為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,構(gòu)建請(qǐng)求模型
? ? ? ? AlipayTradePayRequest request = new AlipayTradePayRequest();
? ? ? ? request.setBizContent(sb.toString());
? ? ? ? AlipayTradePayResponse response = null;
?
? ? ? ? try {
? ? ? ? ? ? // 使用SDK,調(diào)用交易下單接口
? ? ? ? ? ? response = alipayClient.execute(request,null,payAccountInfoDO.getAppAuthToken());
?
? ? ? ? } catch (AlipayApiException e) {
? ? ? ? ? ? log.error("logId:{}, 刷臉支付收單接口 異常,excepiton:", e);
? ? ? ? ? ? throw e;
? ? ? ? }
? ? ? ? return response;
? ? }
刷臉支付到這里基本就結(jié)束了。
二、生活類刷臉接口
因?yàn)楸仨氁虘羰跈?quán)碼,還需要用戶授權(quán),因?yàn)橐樵冇脩舻幕拘畔?#xff0c;需要先組裝授權(quán)的URL給商戶和用戶,獲取授權(quán)碼后初始化之類的,回調(diào)地址要配置在商戶的平臺(tái),支付寶會(huì)返回授權(quán)訪問(wèn)令牌,獲取后再查詢商戶信息。
生活類刷臉獲取用戶信息的第一步和第二步與支付類相似,都是獲取商戶的token然后進(jìn)行初始化喚起人臉識(shí)別,但是支付的喚起人臉識(shí)別后直接調(diào)用支付接口,查詢信息的則需要先進(jìn)行用戶授權(quán)
3、喚起授權(quán)頁(yè)用戶進(jìn)行授權(quán)
?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、獲取授權(quán)訪問(wèn)令牌
?拼接授權(quán)連接獲取到用戶授權(quán),支付寶會(huì)返回一個(gè)auth_code,然后調(diào)用支付寶alipay.system.oauth.token接口,返回access_token ?授權(quán)訪問(wèn)令牌,代碼如下 :
?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時(shí),代表用code換取;值為refresh_token時(shí),代表用refresh_token換取
? ? ? ? request.setCode(code);
? ? ? ? AlipaySystemOauthTokenResponse response = null;
? ? ? ? try {
? ? ? ? ? ? //這里第三方應(yīng)用時(shí),也不能傳入 appAuthToken
? ? ? ? ? ? response = alipayClient.execute(request);
? ? ? ? } catch (AlipayApiException e) {
? ? ? ? ? ? ?log.error("logId:{},換取授權(quán)訪問(wèn)令牌 異常,excepiton:", logId, e);
? ? ? ? ? ? throw e;
? ? ? ? }
?
? ? ? ? return response;
? ? }
獲取到用戶的授權(quán)訪問(wèn)令牌
5、查詢用戶信息
獲取到授權(quán)訪問(wèn)令牌查詢用戶的基本信息,代碼如下:
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:{},根據(jù)accessType獲取用戶信息 異常,excepiton:",logId, e);
? ? ? ? }
? ? ? ? log.info("logId:{},根據(jù)accessType獲取用戶信息結(jié)果:{}",logId, JSONObject.toJSONString(response));
? ? ? ? return response;
? ? }
到此生活類刷臉就結(jié)束了
————————————————
版權(quán)聲明:本文為CSDN博主「鬼槎」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/guiqiaoai/article/details/84283406
總結(jié)
以上是生活随笔為你收集整理的支付宝刷脸支付对接流程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 证考网好不好?用这些人背后的心酸史告诉你
- 下一篇: 从登录页到个人中心页的大致流程