小程序实名认证
- 用户在前端输入 姓名 , 身份证号码
- 前端 做 人脸比对
- 前端的比对结果请求自己的后端,获取userIdKey, 核验 输入的身份证号码是否匹配
通过姓名和身份证号获取UserIdKey
public String getUserIdKey(@NonNull String name, @NonNull String idCard) {
// 参考 https://developers.weixin.qq.com/community/business/doc/000442d352c1202bd498ecb105c00d
final String accessToken = talentMiniProgramService.getAccessToken();
String uri = miniprogramProperty.getNameIdCardUri() + "?" + "access_token=" + accessToken;
Map<String, String> params = new HashMap<>();
params.put("name", name);
params.put("id_card_number", idCard);
// params.put("out_seq_no", TsidCreator.getTsid().toString());
BodyInserter bodyInserter = BodyInserters.fromValue(params);
Mono<String> code2SessionResultMono = WebClient.create()
.post().uri(uri).body(bodyInserter).retrieve().bodyToMono(String.class);
String result = code2SessionResultMono.block();
TalentMiniProgramServiceImpl.CheckUserResult checkUserResult;
try {
checkUserResult = objectMapper.readValue(result, TalentMiniProgramServiceImpl.CheckUserResult.class);
} catch (JsonProcessingException e) {
log.error("小程序结果解析失败,result={}", result);
throw new ServiceException("小程序登录结果解析失败");
}
if (checkUserResult == null || checkUserResult.getErrcode() == null) {
log.error("调用userIdKey失败");
throw new ServiceException("调用userIdKey失败");
}
if (checkUserResult.getErrcode() != 0) {
log.error("获取微信平台userIdKey失败,code={}, errorMsg={}", checkUserResult.getErrcode(), checkUserResult.getErrmsg());
throw new ServiceException("获取微信平台userIdKey失败,errcode=" + checkUserResult.getErrcode());
}
return checkUserResult.getUser_id_key();
}
用户核身结果结果校验
@Override
public GetInfoResult getInfo(@NonNull String verifyResult, @NonNull String userIdKey) {
final String uri = "https://api.weixin.qq.com/cityservice/face/identify/getinfo?access_token=" + talentMiniProgramService.getAccessToken();
Map<String, String> params = new HashMap<>();
params.put("verify_result", verifyResult);
params.put("user_id_key", userIdKey);
BodyInserter bodyInserter = BodyInserters.fromValue(params);
Mono<String> code2SessionResultMono = WebClient.create()
.post().uri(uri).body(bodyInserter).retrieve().bodyToMono(String.class);
String result = code2SessionResultMono.block();
GetInfoResult infoResult;
try {
infoResult = objectMapper.readValue(result, GetInfoResult.class);
} catch (JsonProcessingException e) {
log.error("getInfo小程序结果解析失败,result={}", result);
throw new ServiceException("小程序登录结果解析失败");
}
if (infoResult.getErrcode() == null || infoResult.getErrcode() == null) {
log.error("调用getInfo失败");
throw new ServiceException("调用GetInfo失败");
}
if (infoResult.getErrcode() != 0 || infoResult.getErrcode() != 0) {
log.error("getInfo人脸核身失败,code={}, errorMsg={}", infoResult.getErrcode(), infoResult.getErrmsg());
throw new ServiceException("人脸核身失败errCode=" + infoResult.getErrcode());
}
log.info("getinfo结果,infoResult={}", infoResult);
return infoResult;
}