소스 검색

支付宝人脸识别

ggp 2 년 전
부모
커밋
1db5773149

+ 101 - 54
src/main/java/org/springblade/modules/api/controller/Api05Controller.java

@@ -17,7 +17,6 @@
 package org.springblade.modules.api.controller;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.alipay.api.AlipayApiException;
@@ -36,17 +35,17 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.log.annotation.ApiLog;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.core.tool.utils.WebUtil;
-import org.springblade.modules.api.request.ConsignPayRequest;
-import org.springblade.modules.api.request.OrderCommonSaveRequest;
-import org.springblade.modules.api.request.OrderConsignRandomRequest;
-import org.springblade.modules.api.request.OrderTakeRequest;
+import org.springblade.modules.api.request.*;
 import org.springblade.modules.api.response.ConsignResponse;
+import org.springblade.modules.api.service.AliFaceService;
+import org.springblade.modules.api.service.IAliService;
 import org.springblade.modules.api.service.ITradeService;
 import org.springblade.modules.auth.utils.TokenUtil;
 import org.springblade.modules.finance.entity.Order;
@@ -76,7 +75,10 @@ import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
 import javax.validation.Valid;
 import java.math.BigDecimal;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -110,6 +112,14 @@ public class Api05Controller extends BladeController {
 	@Resource
 	private IUserService userService;
 
+	@Autowired
+	private AliFaceService aliFaceService;
+
+
+	@Autowired
+	private IAliService aliService;
+
+
 	//抢购
 	private static final String TRADE_URL = "/api/v1/aliPay/sdk/trade_notify_url";
 	@Autowired
@@ -124,13 +134,13 @@ public class Api05Controller extends BladeController {
 	public R orderCommonSave(@Valid @RequestBody OrderCommonSaveRequest request) {
 		//租户号
 		String tenantId = WebUtil.getRequest().getHeader(TokenUtil.TENANT_HEADER_KEY);
-		if(StringUtil.isEmpty(request.getDistributeMode())){
+		if (StringUtil.isEmpty(request.getDistributeMode())) {
 			request.setDistributeMode(2); //物流配送
 		}
-		if(StringUtil.isEmpty(request.getUserId())){
+		if (StringUtil.isEmpty(request.getUserId())) {
 			return R.fail("请求参数错误!");
 		}
-		if(request.getGoodsList() == null || request.getGoodsList().size() == 0){
+		if (request.getGoodsList() == null || request.getGoodsList().size() == 0) {
 			return R.fail("请选择购买的商品!");
 		}
 		return R.data(orderService.commonOrderInsert(request, tenantId));
@@ -143,28 +153,28 @@ public class Api05Controller extends BladeController {
 	public R consignRandom(@RequestBody OrderConsignRandomRequest request) {
 		String tenantId = WebUtil.getRequest().getHeader(TokenUtil.TENANT_HEADER_KEY);
 		UserApp userApp = new UserApp();
-		UserApp query = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId,request.getUserId()));
-		if (query == null){
+		UserApp query = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId, request.getUserId()));
+		if (query == null) {
 			return R.fail("该用户不存在");
 		}
-		if (query.getState() != 1){
+		if (query.getState() != 1) {
 			return R.fail("登录账号已冻结");
 		}
-		if (query.getCreditScore() < 100){
+		if (query.getCreditScore() < 100) {
 			return R.fail("您的信誉分不够");
 		}
 		if (StringUtil.isEmpty(query.getAlipayUserId())) {
 			return R.fail("请绑定支付宝打款账号");
 		}
-		if (query.getTicket() < 100){
+		if (query.getTicket() < 100) {
 			throw new ServiceException("您的绿色积分达不到要求!");
 		}
 		//判断用户授权
 		ConsignResponse response = orderService.consignGrant(query, request.getConsignConfigId(), request.getOrderNo());
-		if (response.getStatus() == 2){
+		if (response.getStatus() == 2) {
 			//已授权则生成订单
 			String outTradeNo = orderService.consignOrderInsert(request, query, tenantId);
-			if (!StringUtil.isEmpty(outTradeNo)){
+			if (!StringUtil.isEmpty(outTradeNo)) {
 				//通过订单号获取授权信息
 				OrderGrant orderGrant = orderGrantService.getOne(Wrappers.<OrderGrant>lambdaQuery().eq(OrderGrant::getOrderNo, request.getOrderNo()));
 				//重新查询返回是否授权
@@ -172,7 +182,7 @@ public class Api05Controller extends BladeController {
 				//返回订单号
 				response.setOutTradeNo(outTradeNo);
 				//获取当前订单信息
-				OrderConsign orderConsign = orderConsignService.getOne(Wrappers.lambdaQuery(OrderConsign.class).eq(OrderConsign::getOutTradeNo,outTradeNo));
+				OrderConsign orderConsign = orderConsignService.getOne(Wrappers.lambdaQuery(OrderConsign.class).eq(OrderConsign::getOutTradeNo, outTradeNo));
 
 				//查询寄售商品
 				Consign consign = consignService.getById(orderConsign.getConsignId());
@@ -181,10 +191,10 @@ public class Api05Controller extends BladeController {
 
 				//统一收单
 				boolean flg = orderConsign(outTradeNo, request.getOrderNo(), collectionPrice.doubleValue());
-				if (flg){//是否发起统一收单
+				if (flg) {//是否发起统一收单
 					//修改授权状态
 					flg = orderGrantService.thaw(orderGrant);//flg = true
-					if (!flg){
+					if (!flg) {
 						log.info("授权授权信息修改失败");
 						throw new ServiceException("亲!请重新抢单");
 					}
@@ -200,19 +210,19 @@ public class Api05Controller extends BladeController {
 
 	@PostMapping("checkConsignPay")
 	@ApiOperation(value = "确认付款id")
-	public R checkConsignPay(@RequestBody ConsignPayRequest payRequest){
-		if(ObjectUtil.isNull(payRequest)){
+	public R checkConsignPay(@RequestBody ConsignPayRequest payRequest) {
+		if (ObjectUtil.isNull(payRequest)) {
 			return R.fail("参数传递为null");
 		}
-		if(payRequest.getConsignId().size() < 1){
+		if (payRequest.getConsignId().size() < 1) {
 			return R.fail("请选择打款订单");
 		}
-		if(0 == payRequest.getPayType()){//等于0时进行打款操作
+		if (0 == payRequest.getPayType()) {//等于0时进行打款操作
 			List<Consign> consigns = consignService.listByIds(payRequest.getConsignId());
 			for (Consign consign : consigns) {
-				if(consign.getConsignState() == 2 && consign.getConsignFor() == 2){
-					UserApp userApp = userAppMapper.selectOne(Wrappers.lambdaQuery(UserApp.class).eq(UserApp::getUserId,consign.getConsignUserId()));
-					iTradeService.transfer(userApp, consign.getConsignPrice().toString(), consign.getConsignConfigId(),consign);
+				if (consign.getConsignState() == 2 && consign.getConsignFor() == 2) {
+					UserApp userApp = userAppMapper.selectOne(Wrappers.lambdaQuery(UserApp.class).eq(UserApp::getUserId, consign.getConsignUserId()));
+					iTradeService.transfer(userApp, consign.getConsignPrice().toString(), consign.getConsignConfigId(), consign);
 				}
 			}
 			return R.success("确认付款成功");
@@ -222,14 +232,13 @@ public class Api05Controller extends BladeController {
 	}
 
 	/**
-	 *
 	 * @return
 	 */
 	@PostMapping("getConsignListByConfigId")
 	@ApiOperation(value = "查询场次付款记录")
-	public R<List<Consign>> getConsignListByConfigId(@ApiParam(value = "批次ID", required = true) @RequestParam Long consignConfigId){
+	public R<List<Consign>> getConsignListByConfigId(@ApiParam(value = "批次ID", required = true) @RequestParam Long consignConfigId) {
 		LambdaQueryWrapper<Consign> query = Wrappers.lambdaQuery(Consign.class);
-		query.eq(Consign::getConsignConfigId,consignConfigId);
+		query.eq(Consign::getConsignConfigId, consignConfigId);
 		query.eq(Consign::getConsignState, 2);
 		query.eq(Consign::getNowStock, 0);
 		query.eq(Consign::getConsignFor, 2);
@@ -237,7 +246,7 @@ public class Api05Controller extends BladeController {
 		List<Consign> list = consignService.list(query);
 		//获取用户id
 		List<Long> collect = list.stream().map(Consign::getConsignUserId).collect(Collectors.toList());
-		if(ObjectUtil.isEmpty(list)){
+		if (ObjectUtil.isEmpty(list)) {
 			return R.data(list);
 		}
 		List<User> users = userService.listByIds(collect);
@@ -253,12 +262,11 @@ public class Api05Controller extends BladeController {
 	}
 
 	/**
-	 *
 	 * @return
 	 */
 	@PostMapping("getConsignALLList")
 	@ApiOperation(value = "查询付款授权场次")
-	public R<List<ConsignListVO>> getConsignALLList(){
+	public R<List<ConsignListVO>> getConsignALLList() {
 		//查询已授权表记录
 		LambdaQueryWrapper<PlatformAuthorization> query = Wrappers.lambdaQuery(PlatformAuthorization.class);
 		query.eq(PlatformAuthorization::getState, 1);
@@ -272,7 +280,7 @@ public class Api05Controller extends BladeController {
 		for (Map.Entry<Long, List<Consign>> entry : collect1.entrySet()) {
 			consignListVO = new ConsignListVO();
 			Integer num = entry.getValue().size();
-			if(num > 0){
+			if (num > 0) {
 				consignListVO.setConsignConfigId(entry.getKey());
 				consignListVO.setOrderNum(num);
 				consignListVO.setOrderPrice(new BigDecimal(entry.getValue().get(0).getConsignPrice()).setScale(2, BigDecimal.ROUND_DOWN));
@@ -286,12 +294,11 @@ public class Api05Controller extends BladeController {
 
 
 	/**
-	 *
 	 * @return
 	 */
 	@PostMapping("getConsignList")
 	@ApiOperation(value = "查询付款授权场次")
-	public R<List<ConsignListVO>> getConsignList(){
+	public R<List<ConsignListVO>> getConsignList() {
 		//查询已授权表记录
 		LambdaQueryWrapper<PlatformAuthorization> query = Wrappers.lambdaQuery(PlatformAuthorization.class);
 		query.eq(PlatformAuthorization::getState, 1);
@@ -308,17 +315,17 @@ public class Api05Controller extends BladeController {
 			List<PlatformAuthorization> platformAuthorizations1 = collect.get(entry.getKey());
 			consignListVO = new ConsignListVO();
 			Integer num = entry.getValue().size();
-			if(ObjectUtil.isNotNull(platformAuthorizations1)){
+			if (ObjectUtil.isNotNull(platformAuthorizations1)) {
 				for (PlatformAuthorization platformAuthorization : platformAuthorizations1) {
 					//判断授权数量是否大于待付款数量
-					if(num > platformAuthorization.getTotalNum()){
+					if (num > platformAuthorization.getTotalNum()) {
 						num = num - platformAuthorization.getTotalNum();
-					}else{
+					} else {
 						num = 0;
 					}
 				}
 			}
-			if(num > 0){
+			if (num > 0) {
 				consignListVO.setConsignConfigId(entry.getKey());
 				consignListVO.setOrderNum(num);
 				consignListVO.setOrderPrice(new BigDecimal(entry.getValue().get(0).getConsignPrice()).setScale(2, BigDecimal.ROUND_DOWN));
@@ -337,8 +344,8 @@ public class Api05Controller extends BladeController {
 		Order order = new Order();
 		order.setUserId(userId);
 		order.setOrderType(1);//普通订单
-		if(!StringUtil.isEmpty(payFlag)){
-			if(payFlag != 0){
+		if (!StringUtil.isEmpty(payFlag)) {
+			if (payFlag != 0) {
 				order.setPayFlag(payFlag); //订单状态
 			}
 		}
@@ -355,11 +362,11 @@ public class Api05Controller extends BladeController {
 										  Query query) {
 		Consign consign = new Consign();
 		consign.setConsignUserId(userId);
-		if(status == 1){
+		if (status == 1) {
 			consign.setConsignState(1); //寄售中
-		}else if(status == 2){
+		} else if (status == 2) {
 			consign.setConsignState(2); //待收款
-		}else if(status == 3){
+		} else if (status == 3) {
 			consign.setConsignState(3); //已收款
 		}//查询全部
 		IPage<Consign> pages = consignService.page(Condition.getPage(query),
@@ -389,21 +396,60 @@ public class Api05Controller extends BladeController {
 	@ApiOperation(value = "确认收货", notes = "待收货变为已完成")
 	public R orderConfirm(@ApiParam(value = "订单ID", required = true) @RequestParam Long orderId,
 						  @ApiParam(value = "用户id", required = true) @RequestParam(required = false) Long userId) {
-		return R.status(orderService.orderEnd(orderId,userId));
+		return R.status(orderService.orderEnd(orderId, userId));
+	}
+
+	@ApiLog("获取人脸认证Url")
+	@PostMapping("/getAuthenticationUrl")
+	@ApiOperation(value = "设置用户信息", notes = "设置用户信息")
+	@ApiOperationSupport(order = 97)
+	public R getAuthenticationUrl(@Valid @RequestBody AliUserAuthRequst requst) {
+		String url = aliFaceService.startCertify(requst.getRealName(), requst.getIdNum());
+		return R.data(url);
 	}
 
+	@ApiLog("获取人脸认证结果")
+	@GetMapping("/getAuthenticationResult")
+	@ApiOperation(value = "获取人脸认证结果")
+	@ApiOperationSupport(order = 97)
+	public R getAuthenticationResult() {
+		Boolean b = aliFaceService.queryCertifyResult();
+		return R.data(b);
+	}
+
+	@ApiLog("实名认证信息对比1、录入用户实名信息")
+	@PostMapping("/getVerifyid")
+	@ApiOperation(value = "实名认证信息")
+	@ApiOperationSupport(order = 97)
+	public R getVerifyid(@Valid @RequestBody AliUserAuthRequst requst) throws AlipayApiException {
+		R r = aliService.getVerifyid(requst.getRealName(), requst.getIdNum(), requst.getMobil());
+		return r;
+	}
+
+	@ApiLog("实名认证信息对比2、实名信息校验")
+	@GetMapping("/realNameCheck")
+	@ApiOperation(value = "实名认证信息")
+	@ApiOperationSupport(order = 97)
+	public R realNameCheck(@ApiParam(value = "verifyid", required = true) @RequestParam String verifyid,
+						   @ApiParam(value = "授权码", required = true) @RequestParam String authCode) throws AlipayApiException {
+		R r = aliService.realNameCheck(verifyid, authCode);
+		return r;
+	}
+
+
 	/**
 	 * 预支付统一收单
+	 *
 	 * @param outTradeNo 订单号
-	 * @param orderNo 授权
-	 * @param price 打款金额
+	 * @param orderNo    授权
+	 * @param price      打款金额
 	 * @return R
 	 */
 	public boolean orderConsign(String outTradeNo, String orderNo, Double price) {
 		//查询抢购订单数据
 		Order order = orderService.getOne(Wrappers.<Order>lambdaQuery().eq(Order::getOutTradeNo, outTradeNo));
 
-		if (ObjectUtil.isNull(order)){
+		if (ObjectUtil.isNull(order)) {
 			return false;
 		}
 		//通过授权号查询用户授权信息
@@ -422,10 +468,10 @@ public class Api05Controller extends BladeController {
 		data.put("product_code", "PRE_AUTH_ONLINE");
 		data.put("auth_no", orderGrant.getAuthNo());
 		data.put("body", orderGrant.getAuthNo());
-		if (nowNum == 1){//判断剩余授权数量是否为1
+		if (nowNum == 1) {//判断剩余授权数量是否为1
 			//授权数量为1是进行解冻
 			data.put("auth_confirm_mode", "COMPLETE"); //解冻
-		}else{
+		} else {
 			//授权数量不为1时,交易继续,只进行收单操作
 			data.put("auth_confirm_mode", "NOT_COMPLETE");//不解冻
 		}
@@ -443,18 +489,18 @@ public class Api05Controller extends BladeController {
 			update.setId(order.getId());
 			update.setGrantNo(orderGrant.getAuthNo());
 			boolean flg = orderService.updateById(update);
-			if (!flg){
+			if (!flg) {
 				log.info("订单绑定失败 + update.toString()");
 			}
 			//普通模式 使用 execute
 			//证书使用 使用 certificateExecute
 			AlipayTradePayResponse response = client.certificateExecute(request);
-			if (response.isSuccess()){
+			if (response.isSuccess()) {
 				orderService.payConsignSuccess(order);
 				return true;
-			}else{
+			} else {
 				orderGrantService.remove(Wrappers.<OrderGrant>lambdaQuery()
-					.eq(OrderGrant::getId,orderGrant.getId())
+					.eq(OrderGrant::getId, orderGrant.getId())
 					.eq(OrderGrant::getStatus, 0));
 				log.info("订单绑定失败 + 删除预授权数据");
 			}
@@ -464,4 +510,5 @@ public class Api05Controller extends BladeController {
 		return false;
 	}
 
+
 }

+ 20 - 0
src/main/java/org/springblade/modules/api/request/AliUserAuthRequst.java

@@ -0,0 +1,20 @@
+package org.springblade.modules.api.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "支付宝用户认证请求实体", description = "请求实体类")
+public class AliUserAuthRequst implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "真实用户名", required = true)
+	private String realName;
+	@ApiModelProperty(value = "身份证号", required = true)
+	private String idNum;
+	@ApiModelProperty(value = "手机号")
+	private String mobil;
+}

+ 7 - 0
src/main/java/org/springblade/modules/api/service/AliFaceService.java

@@ -0,0 +1,7 @@
+package org.springblade.modules.api.service;
+
+public interface AliFaceService {
+	String startCertify(String realName, String idNum);
+
+	boolean queryCertifyResult();
+}

+ 10 - 0
src/main/java/org/springblade/modules/api/service/IAliService.java

@@ -0,0 +1,10 @@
+package org.springblade.modules.api.service;
+
+import com.alipay.api.AlipayApiException;
+import org.springblade.core.tool.api.R;
+
+public interface IAliService {
+	public R getVerifyid(String realName, String idNum, String mobile) throws AlipayApiException;
+
+	R realNameCheck(String verifyid, String authCode) throws AlipayApiException;
+}

+ 186 - 0
src/main/java/org/springblade/modules/api/service/impl/AliFaceServiceImpl.java

@@ -0,0 +1,186 @@
+package org.springblade.modules.api.service.impl;
+
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.request.AlipayUserCertifyOpenCertifyRequest;
+import com.alipay.api.request.AlipayUserCertifyOpenInitializeRequest;
+import com.alipay.api.request.AlipayUserCertifyOpenQueryRequest;
+import com.alipay.api.response.AlipayUserCertifyOpenCertifyResponse;
+import com.alipay.api.response.AlipayUserCertifyOpenInitializeResponse;
+import com.alipay.api.response.AlipayUserCertifyOpenQueryResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springblade.core.redis.cache.BladeRedis;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.modules.api.service.AliFaceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+public class AliFaceServiceImpl implements AliFaceService {
+	private static final Logger log = LoggerFactory.getLogger(AliFaceService.class);
+	@Autowired
+	private AlipayClient alipayClient;
+
+	@Autowired
+	private BladeRedis bladeRedis;
+
+
+	/**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()) {
+				log.info("[身份验证]初始化身份认证成功:{}", realName);
+				//接口调用成功,从返回对象中获取certify_id
+				String certifyId = response.getCertifyId();
+				// 生成的certifyId 是查询认证结果的凭证,需要保存下来,我这是保存到数据库中,也可保存到redis
+			//	userMapper.insertCertifyId(idNum, certifyId);
+				return certifyId;
+			} else {
+				log.info("[身份验证]初始化身份认证失败:{}", realName);
+				return null;
+			}
+		} catch (Exception e) {
+			log.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);
+		HashMap<String, Object> map = new HashMap<>();
+		map.put("certify_id", certifyId);
+		map.put("realName", realName);
+		map.put("idNum", idNum);
+		bladeRedis.setEx("ali_faceInfo:"+ AuthUtil.getUser().getUserId(),map,5*60L);
+		request.setBizContent(bizContentObj.toString());
+
+		//生成请求链接,这里一定要使用GET模式
+		try {
+			AlipayUserCertifyOpenCertifyResponse response = alipayClient.pageExecute(request, "GET");
+			if (response.isSuccess()) {
+				log.info("[身份验证]开始认证服务调用成功:{}", realName);
+				return response.getBody();
+			} else {
+				log.info("[身份验证]开始认证服务调用失败:{}", realName);
+				return null;
+			}
+		} catch (AlipayApiException e) {
+			log.error("[身份验证]开始认证服务调用失败:{}", realName, e);
+			return null;
+		}
+	}
+
+
+	/**3.查询认证结果
+	 * 查询身份认证结果
+	 *
+	 * @param certifyId 需要你在你的业务中获取之前保存下来的 certify_id
+	 * @return
+	 */
+	public boolean queryCertifyResult() {
+		String certifyId="";
+		//获取当前登录用户的certify_id
+		Object o = bladeRedis.get("ali_faceInfo:"+ AuthUtil.getUser().getUserId());
+		if (ObjectUtil.isEmpty(o)){
+			log.info("[身份验证]认证失败:{}", "当前登录用户certifyId为空");
+			return false;
+		}
+		Map<String,Object> map = (Map) o;
+		certifyId=map.get("certify_id").toString();
+		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()) {
+				log.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");
+					log.info(body); // 你可以打印看一下 json 结构
+					//这里需要注意认证通过的条件 官方文档显示 passed 是个数组,但是它只是一个 String
+					if (StrUtil.equals(queryResponse.getString("code"), "10000") && StrUtil.equals(queryResponse.getString("passed"), "T")) {
+						log.info("[身份验证]认证通过:{}", certifyId);
+						return true;
+					} else {
+						log.info("[身份验证]认证失败:{}", certifyId);
+						return false;
+					}
+				}
+			} else {
+				log.info("[身份验证]认证查询服务调用失败:{}", certifyId);
+			}
+		} catch (AlipayApiException e) {
+			log.error("[身份验证]开始认证服务调用失败:{}", certifyId, e);
+		}
+		return false;
+	}
+
+}

+ 94 - 0
src/main/java/org/springblade/modules/api/service/impl/IAliServiceImpl.java

@@ -0,0 +1,94 @@
+package org.springblade.modules.api.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.request.AlipaySystemOauthTokenRequest;
+import com.alipay.api.request.AlipayUserCertdocCertverifyConsultRequest;
+import com.alipay.api.request.AlipayUserCertdocCertverifyPreconsultRequest;
+import com.alipay.api.response.AlipaySystemOauthTokenResponse;
+import com.alipay.api.response.AlipayUserCertdocCertverifyConsultResponse;
+import com.alipay.api.response.AlipayUserCertdocCertverifyPreconsultResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springblade.common.utils.StringUtils;
+import org.springblade.core.tool.api.R;
+import org.springblade.modules.api.service.IAliService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class IAliServiceImpl implements IAliService {
+
+	private static final Logger log = LoggerFactory.getLogger(IAliService.class);
+	@Autowired
+	private AlipayClient alipayClient;
+
+	@Override
+	public R getVerifyid(String realName, String idNum, String mobile) throws AlipayApiException {
+		AlipayUserCertdocCertverifyPreconsultRequest request = new AlipayUserCertdocCertverifyPreconsultRequest();
+		//构造身份信息json对象  JSONObject 阿里的fastjson
+		JSONObject identityObj = new JSONObject();
+		//真实姓名,必填
+		identityObj.put("user_name", realName);
+		//证件类型,必填
+		identityObj.put("cert_type", "IDENTITY_CARD");
+		//证件号码,必填
+		identityObj.put("cert_no", idNum);
+		//手机号
+		identityObj.put("mobile", mobile);
+		request.setBizContent(identityObj.toString());
+		AlipayUserCertdocCertverifyPreconsultResponse response = alipayClient.execute(request);
+		if (response.isSuccess()) {
+			return R.data(response.getVerifyId());
+		} else {
+			return R.fail(response.getSubMsg());
+		}
+	}
+
+	@Override
+	public R realNameCheck(String verifyid, String authCode) throws AlipayApiException {
+		String accessToken = this.getAccessTokenByAuthCode(authCode);
+		if (StringUtils.isBlank(accessToken)) {
+			return R.fail("获取令牌失败");
+		}
+		AlipayUserCertdocCertverifyConsultRequest request = new AlipayUserCertdocCertverifyConsultRequest();
+		JSONObject jsonObject = new JSONObject();
+		jsonObject.put("verify_id",verifyid);
+		request.setBizContent(jsonObject.toString());
+		AlipayUserCertdocCertverifyConsultResponse response = alipayClient.execute(request,accessToken);
+		if(response.isSuccess()){
+			String passed = response.getPassed();
+			if ("T".equalsIgnoreCase(passed)){
+				return R.success("验证成功");
+			}else {
+				log.info("支付宝真实信息验证失败参数:{}",response.getFailParams());
+				log.info("支付宝真实信息验证失败原因:{}",response.getFailReason());
+				return R.fail(response.getFailReason());
+			}
+		} else {
+			return R.fail("支付宝真实信息验证失败");
+		}
+	}
+
+	//根据authCode授权码获取accessToken令牌
+	public String getAccessTokenByAuthCode(String authCode) {
+		AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
+		request.setCode(authCode);
+		request.setGrantType("authorization_code");
+		try {
+			AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
+			if (response.isSuccess()) {
+				String accessToken = response.getAccessToken();
+				return accessToken;
+			} else {
+				throw new AlipayApiException(response.getSubMsg());
+			}
+		} catch (AlipayApiException e) {
+			//处理异常
+			e.printStackTrace();
+			log.info("获取令牌失败:{}",e.getMessage());
+		}
+		return null;
+	}
+}