Java支付寶身份驗證介面接入指南
最近公司專案有人臉身份核驗的需求,首先就想到了支付寶的身份驗證介面,于是就需要看支付寶的開放api檔案了,這里就有些坑了,然后就本次接入遇到的坑,做個整理,(基于web網頁)
一.檔案查找
我們要用的介面就圖中的三個:

但是不推薦看上圖中的api檔案,不知什么原因,這三個介面的傳參及回傳值有些混亂,導致無法順利接入,
推薦看這個地址的檔案:
https://docs.open.alipay.com/20181012100420932508
或者看我現在寫的這篇(根據上面的這個檔案整理的),
二.前期準備
首先確保你有一個企業支付寶賬號,身份驗證需要簽約商戶,要企業支付寶開發者才能呼叫,將你手中的企業支付寶入駐到支付寶開放平臺,
1.創建應用
要在您的應用中接入身份驗證能力,您需要登錄 開放平臺控制臺,在控制臺創建您的應用,應用審核通過后會生成應用唯一標識(APPID),并且可以申請開通開放產品使用權限,通過 APPID 您的應用才能呼叫開放產品的介面能力,需要詳細了解開放平臺創建應用步驟請參見 創建應用,
2.配置應用
添加能力
應用創建完成后,系統會自動跳轉到應用詳情頁面,開發者可以點擊 添加能力 選擇 身份驗證 來添加能力,

這里需要說明一下:身份驗證能力添加好了后,需要關聯,點擊商家中心,關聯你的應用,
配置密鑰
為了保證交易雙方(商戶和支付寶)的身份和資料安全,開發者在呼叫介面前,需要配置雙方密鑰,對交易資料進行雙方校驗,RSA 密鑰包含應用私鑰(APP_PRIVATE_KEY)、應用公鑰(APP_PUBLIC_KEY),生成密鑰后,開發者需要在開放平臺開發者中心進行密鑰配置,配置完成后可以獲取支付寶公鑰(ALIPAY_PUBLIC_KEY),配置的詳細步驟請參見 配置密鑰,您還可以通過觀看 快速簽名教程 學習密鑰的配置,
這里需要說明一下:使用支付寶開放平臺開發助手生成的是應用私鑰(APP_PRIVATE_KEY)、應用公鑰(APP_PUBLIC_KEY) 需要在你的應用控制臺進行密鑰配置,然后得到支付寶公鑰(ALIPAY_PUBLIC_KEY),后續接入引數要用到的就是應用私鑰(APP_PRIVATE_KEY)和支付寶公鑰(ALIPAY_PUBLIC_KEY)
上線應用并簽約
開發者在添加功能和配置密鑰后,即可將應用提交審核,預計會有一個作業日的審核時間,請耐心等待,詳細步驟可參考 上線應用,
應用上線完成后,要使用身份驗證能力,您還需要完成簽約能力才能生效,請點擊功能串列右側 簽約,提交相關資訊;完成簽約后,需要一個作業日左右的時間審核(審批結果會以短信和郵件形式告知),待審核完畢后,功能的狀態會變成 已生效,您的應用即可使用 身份驗證 能力,
說明:身份驗證暫不支持第三方 ISV 代簽約開通,
三.接入介面
1.引入sdk依賴
引入下面的依賴就可以了:
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.7.110.ALL</version>
</dependency>
2.在組態檔中配置屬性:
ali:
appId: 你的應用APPID
rsaPrivateKey: 你的應用私鑰(APP_PRIVATE_KEY)
alipayPublicKey: 你的支付寶公鑰(ALIPAY_PUBLIC_KEY)
charset: utf-8
format: json
signType: RSA2
gatewayUrl: https://openapi.alipay.com/gateway.do
3.讀取配置并加載AlipayClient
**
* 讀取組態檔阿里配置
* @Author zjl
* @Date 2020/9/15 9:15
*/
@Data
@ConfigurationProperties(prefix = "ali")
public class AliProperties {
public String appId;
// 商戶私鑰,您的PKCS8格式RSA2私鑰
public String rsaPrivateKey;
// 對應APPID下的支付寶公鑰
public String alipayPublicKey;
// 支付寶網關
public String gatewayUrl;
// 字符編碼格式
public String charset;
//格式
public String format;
// 簽名方式
public String signType;
}
/**
* 開啟支付寶客戶端
* @Author zjl
* @Date 2020/9/15 9:33
*/
@Configuration
@EnableConfigurationProperties(AliProperties.class)
public class AliCilent {
@Bean
public AlipayClient alipayClient(AliProperties pro) {
return new DefaultAlipayClient(pro.getGatewayUrl(), pro.getAppId(), pro.getRsaPrivateKey(),
pro.getFormat(), pro.getCharset(), pro.getAlipayPublicKey(), pro.getSignType()
);
}
}
4.身份認證:
@Autowired
private AlipayClient alipayClient;
1.初始化身份認證
/**
* 初始化身份認證
*
* @param realName 真實姓名
* @param idNum 身份證號碼
* @return
*/
public String authInitialize(String realName, String idNum) {
AlipayUserCertifyOpenInitializeRequest request = new AlipayUserCertifyOpenInitializeRequest();
//構造身份資訊json物件 JSONObject 阿里的fastjson
JSONObject identityObj = new JSONObject();
//身份型別,必填
identityObj.put("identity_type", "CERT_INFO");
//證件型別,必填
identityObj.put("cert_type", "IDENTITY_CARD");
//真實姓名,必填
identityObj.put("cert_name", realName);
//證件號碼,必填
identityObj.put("cert_no", idNum);
//構造商戶配置json物件
JSONObject merchantConfigObj = new JSONObject();
try {
//認證完成后手機支付寶的回傳頁面,我這里回傳首頁
String returnUrl = URLEncoder.encode("https://m.alipay.com/Gk8NF23", "UTF-8");
// 設定回呼地址,必填. 如果需要直接在支付寶APP里面打開回呼地址使用alipay協議,參考下面的案例:appId用固定值 20000067,url替換為urlEncode后的業務回跳地址
// alipays://platformapi/startapp?appId=20000067&url=https%3A%2F%2Fapp.cqkqinfo.com%2Fcertify%2FzmxyBackNew.do
merchantConfigObj.put("return_url", "alipays://platformapi/startapp?appId=20000067&url=" + returnUrl);
//構造身份認證初始化服務業務引數資料
JSONObject bizContentObj = new JSONObject();
//商戶請求的唯一標識,推薦為uuid,必填 IdUtil hutool工具
bizContentObj.put("outer_order_no", IdUtil.simpleUUID());
bizContentObj.put("biz_code", "FACE");
bizContentObj.put("identity_param", identityObj);
bizContentObj.put("merchant_config", merchantConfigObj);
request.setBizContent(bizContentObj.toString());
//發起請求
AlipayUserCertifyOpenInitializeResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
LOGGER.info("[身份驗證]初始化身份認證成功:{}", realName);
//介面呼叫成功,從回傳物件中獲取certify_id
String certifyId = response.getCertifyId();
// 生成的certifyId 是查詢認證結果的憑證,需要保存下來,我這是保存到資料庫中,也可保存到redis
userMapper.insertCertifyId(idNum, certifyId);
return certifyId;
} else {
LOGGER.info("[身份驗證]初始化身份認證失敗:{}", realName);
return null;
}
} catch (Exception e) {
LOGGER.error("[身份驗證]初始化身份認證失敗:{}", realName, e);
return null;
}
}
2.生成認證url
/**
* 開始認證服務呼叫
*
* @param realName 真實姓名
* @param idNum 身份證號碼
* @return url-支付寶認證鏈接
*/
public String startCertify(String realName, String idNum) {
String certifyId = authInitialize(realName, idNum);
if (StrUtil.isBlank(certifyId)) {
return null;
}
AlipayUserCertifyOpenCertifyRequest request = new AlipayUserCertifyOpenCertifyRequest();
//設定certifyId
JSONObject bizContentObj = new JSONObject();
bizContentObj.put("certify_id", certifyId);
request.setBizContent(bizContentObj.toString());
//生成請求鏈接,這里一定要使用GET模式
try {
AlipayUserCertifyOpenCertifyResponse response = alipayClient.pageExecute(request, "GET");
if (response.isSuccess()) {
LOGGER.info("[身份驗證]開始認證服務呼叫成功:{}", realName);
return response.getBody();
} else {
LOGGER.info("[身份驗證]開始認證服務呼叫失敗:{}", realName);
return null;
}
} catch (AlipayApiException e) {
LOGGER.error("[身份驗證]開始認證服務呼叫失敗:{}", realName, e);
return null;
}
}
3.查詢認證結果
/**
* 查詢身份認證結果
*
* @param certifyId 需要你在你的業務中獲取之前保存下來的 certify_id
* @return
*/
public boolean queryCertifyResult(String certifyId) {
AlipayUserCertifyOpenQueryRequest request = new AlipayUserCertifyOpenQueryRequest();
JSONObject bizContentObj = new JSONObject();
bizContentObj.put("certify_id", certifyId);
request.setBizContent(bizContentObj.toString());
try {
AlipayUserCertifyOpenQueryResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
LOGGER.info("[身份驗證]認證查詢服務呼叫成功:{}", certifyId);
// 回傳的是個json字串
String body = response.getBody();
if (StrUtil.isNotBlank(body)) {
JSONObject jsonObject = JSONObject.parseObject(body);
// 我們需要獲取 alipay_user_certify_open_query_response 下的值
JSONObject queryResponse = jsonObject.getJSONObject("alipay_user_certify_open_query_response");
LOGGER.info(body); // 你可以列印看一下 json 結構
//這里需要注意認證通過的條件 官方檔案顯示 passed 是個陣列,但是它只是一個 String
if (StrUtil.equals(queryResponse.getString("code"), "10000") && StrUtil.equals(queryResponse.getString("passed"), "T")) {
LOGGER.info("[身份驗證]認證通過:{}", certifyId);
return true;
} else {
LOGGER.info("[身份驗證]認證失敗:{}", certifyId);
return false;
}
}
} else {
LOGGER.info("[身份驗證]認證查詢服務呼叫失敗:{}", certifyId);
}
} catch (AlipayApiException e) {
LOGGER.error("[身份驗證]開始認證服務呼叫失敗:{}", certifyId, e);
}
return false;
}
這就是呼叫身份驗證的三步,
我的業務中是將生成認證url生成二維碼回傳給前端,用戶用手機支付寶app掃描二維碼,進行人臉身份驗證,驗證完成后用戶點擊完成,后臺進行認證結果查詢,這是業務邏輯,這部分的代碼就不貼了,可根據自己的業務進行調整,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/229793.html
標籤:其他
上一篇:VA虛擬平臺十大亮點
下一篇:設計模式之單例模式
