对接百度API的银行卡四要素校验

72 篇文章 1 订阅

正文

因为百度提供的API文档比较难懂,搞了一天才弄好, 所以记录一下正确的demo。要使用百度API,要先开通服务获取到 appkey和secretKey

代码

@PostMapping("/validate-bank-auth")
	@ApiOperationSupport(order = 18)
	@ApiOperation(value = "校验银行卡四要素", notes = "校验银行卡四要素")
	public R validateBankAuth(String mobile,String name,String idCardNo,String bankCardNo) {
		BankCardAuthModel bankCardModel = baiduAiTemplate.validateBankAuth( mobile, name, idCardNo, bankCardNo);
		log.info("validateBankAuth==={}", JsonUtil.toJson(bankCardModel));
		String code = bankCardModel.getCode();
		if("01".equals(code)){
			return R.success(bankCardModel.getMessage());
		}else {
			return R.fail("银行卡四要素验证不通过!");
		}
	}
@SneakyThrows
	public BankCardAuthModel validateBankAuth(String mobile,String name,String idNum,String cardNo) {
		BankCardAuthModel bankCardAuthModel = new BankCardAuthModel();
		String result = "";
		try {
			result = bankAuth( mobile, name, idNum, cardNo);
			com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(result);

			String code = jsonObject.getString("code");
			bankCardAuthModel.setCode(code);
			com.alibaba.fastjson.JSONObject data = jsonObject.getJSONObject("data");
			if(ObjectUtil.isNotEmpty(data)){
				String message = data.getJSONObject("responseParams").getString("message");
				bankCardAuthModel.setMessage(message);
			}
		} catch (Exception e) {
			log.error("获取身份证信息失败:" + result, e);
		}
		return bankCardAuthModel;
	}
private String bankAuth(String mobile,String name,String idNum,String cardNo) {
		String result = "";
		String localUrl = "http://ai-ccomm.baidu.com/pnvs/api/invoke/ydxsbankcardauth4";
		String secretKey = "替换成自己的secretKey ";
		String appKey = "替换成自己的appKey";

		// appKey
		Long timestamp = System.currentTimeMillis() / 1000;
		Map<String, Object> paramMap = new HashMap<>(4);

		paramMap.put("mobile", mobile);
		paramMap.put("name", name);
		paramMap.put("idNum", idNum);
		paramMap.put("cardNo", cardNo);

		String json = JsonUtil.toJson(paramMap);

		String parameters = "{\"parameters\":" + json + "}";

		String encrypt = AesEncryptUtil.encrypt(json, secretKey);

		StringBuilder assemble = AssembleUtil.assembleParameters(new HashMap<>(10));

		assemble.append("cardNo=").append(cardNo)
			.append("&idNum=").append(idNum)
			.append("&mobile=").append(mobile)
			.append("&name=").append(name)
			.append("&").append(timestamp)
			.append("&").append(secretKey);
		String signature = MD5Util.md5Encode(assemble.toString());


		Map<String, String> header = new HashMap(3);
		header.put("appkey", appKey);
		header.put("timestamp", timestamp + "");
		header.put("signature", signature);
		result = OkHttpUtil.postJson(localUrl, header, parameters);
		System.out.println(result);
		return result;
	}

工具类和model

@Data
public class BankCardAuthModel {

	/**
	 * 01
	 */
	private String code;
	/**
	 * 896487b984e14a9382b384a5d37f7fa5
	 */
	private String id;
	/**
	 * 业务成功
	 */
	private String statusType;
	/**
	 * 验证成功,一致
	 */
	private String message;

}
import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class AesEncryptUtil {

	public static String encrypt(String content, String encryptKey) {
		String key = encryptKey;
		if (encryptKey.length() > 64) {
			key = encryptKey.substring(0, 32);
		}
		try {
			Cipher cipher = Cipher.getInstance("AES");
			cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes("utf-8"), "AES"));
			byte[] b = cipher.doFinal(content.getBytes("utf-8"));
			return Base64.encodeBase64String(b);
		} catch (Exception e) {
//			log.info("AesEncryptUtil encrypt catch e: {}", e);
			e.printStackTrace();
			return null;
		}

	}

}
import java.util.Comparator;
import java.util.Map;

/**
 * 银行卡四要素详版接口 : assemble方法
 */
public class AssembleUtil {

	public static <T> StringBuilder assembleParameters(Map<String, T> paramMap) {
		StringBuilder result = new StringBuilder();
		if (paramMap == null || paramMap.isEmpty()) {
			return result;
		}

		paramMap.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getKey)).forEach(entry ->
			result.append(entry.getKey()).append("=").append(entry.getValue()).append("&"));
		return result;
	}

}

import org.apache.commons.lang3.StringUtils;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Util {

	public static String md5Encode(String plainText) {
		byte[] secretBytes;
		try {
			secretBytes = MessageDigest.getInstance("md5").digest(plainText
				.getBytes());
		} catch (NoSuchAlgorithmException e) {
			throw new RuntimeException("无此md5算法");
		}
		String md5code = (new BigInteger(1, secretBytes)).toString(16);
		return StringUtils.leftPad(md5code, 32, "0");
	}

}
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;

import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * Http请求工具类
 *
 * @author Admin
 */
@Slf4j
public class OkHttpUtil {

	public static MediaType JSON = MediaType.parse("application/json; charset=utf-8");
	public static MediaType XML = MediaType.parse("application/xml; charset=utf-8");

	/**
	 * GET
	 *
	 * @param url     请求的url
	 * @param queries 请求的参数,在浏览器?后面的数据,没有可以传null
	 * @return String
	 */
	public static String get(String url, Map<String, String> queries) {
		return get(url, null, queries);
	}

	/**
	 * GET
	 *
	 * @param url     请求的url
	 * @param header  请求头
	 * @param queries 请求的参数,在浏览器?后面的数据,没有可以传null
	 * @return String
	 */
	public static String get(String url, Map<String, String> header, Map<String, String> queries) {
		StringBuffer sb = new StringBuffer(url);
		if (queries != null && queries.keySet().size() > 0) {
			// 添加时间戳
			sb.append("?infox_times=").append(System.currentTimeMillis());
			queries.forEach((k, v) -> sb.append("&").append(k).append("=").append(v));
		}

		Request.Builder builder = new Request.Builder();

		if (header != null && header.keySet().size() > 0) {
			header.forEach(builder::addHeader);
		}

		Request request = builder.url(sb.toString()).build();
		return getBody(request);
	}

	/**
	 * POST
	 *
	 * @param url     请求的url
	 * @param header  请求头
	 * @param queries 请求的参数,在浏览器?后面的数据,没有可以传null
	 * @param params  post form 提交的参数
	 * @return String
	 */
	public static String post(String url, Map<String, String> header, Map<String, String> queries, Map<String, String> params) {
		StringBuffer sb = new StringBuffer(url);
		if (queries != null && queries.keySet().size() > 0) {
			// 添加时间戳
			sb.append("?infox_times=").append(System.currentTimeMillis());
			queries.forEach((k, v) -> sb.append("&").append(k).append("=").append(v));
		}

		FormBody.Builder formBuilder = new FormBody.Builder();
		//添加参数
		if (params != null && params.keySet().size() > 0) {
			params.forEach(formBuilder::add);
		}

		Request.Builder builder = new Request.Builder();

		if (header != null && header.keySet().size() > 0) {
			header.forEach(builder::addHeader);
		}

		Request request = builder.url(sb.toString()).post(formBuilder.build()).build();
		return getBody(request);
	}

	/**
	 * POST
	 *
	 * @param url    请求的url
	 * @param params post form 提交的参数
	 * @return String
	 */
	public static String post(String url, Map<String, String> params) {
		return post(url, null, params);
	}

	/**
	 * POST
	 *
	 * @param url    请求的url
	 * @param header 请求头
	 * @param params post form 提交的参数
	 * @return String
	 */
	public static String post(String url, Map<String, String> header, Map<String, String> params) {
		FormBody.Builder formBuilder = new FormBody.Builder().add("clientId", "infox");
		//添加参数
		if (params != null && params.keySet().size() > 0) {
			params.forEach(formBuilder::add);
		}

		Request.Builder builder = new Request.Builder();

		if (header != null && header.keySet().size() > 0) {
			header.forEach(builder::addHeader);
		}

		Request request = builder.url(url).post(formBuilder.build()).build();
		return getBody(request);
	}

	/**
	 * POST请求发送JSON数据
	 *
	 * @param url  请求的url
	 * @param json 请求的json串
	 * @return String
	 */
	public static String postJson(String url, String json) {
		return postJson(url, null, json);
	}

	/**
	 * POST请求发送JSON数据
	 *
	 * @param url    请求的url
	 * @param header 请求头
	 * @param json   请求的json串
	 * @return String
	 */
	public static String postJson(String url, Map<String, String> header, String json) {
		return postContent(url, header, json, JSON);
	}

	/**
	 * POST请求发送xml数据
	 *
	 * @param url 请求的url
	 * @param xml 请求的xml串
	 * @return String
	 */
	public static String postXml(String url, String xml) {
		return postXml(url, null, xml);
	}

	/**
	 * POST请求发送xml数据
	 *
	 * @param url    请求的url
	 * @param header 请求头
	 * @param xml    请求的xml串
	 * @return String
	 */
	public static String postXml(String url, Map<String, String> header, String xml) {
		return postContent(url, header, xml, XML);
	}

	/**
	 * 发送POST请求
	 *
	 * @param url       请求的url
	 * @param header    请求头
	 * @param content   请求内容
	 * @param mediaType 请求类型
	 * @return String
	 */
	public static String postContent(String url, Map<String, String> header, String content, MediaType mediaType) {
		RequestBody requestBody = RequestBody.create(mediaType, content);
		Request.Builder builder = new Request.Builder();

		if (header != null && header.keySet().size() > 0) {
			header.forEach(builder::addHeader);
		}
		Request request = builder.url(url).post(requestBody).build();
		return getBody(request);
	}

	/**
	 * 获取body
	 *
	 * @param request request
	 * @return String
	 */
	private static String getBody(Request request) {
		String responseBody = "";
		Response response = null;
		try {
			OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS) // 设置连接超时时间为 10 秒
				.readTimeout(10, TimeUnit.SECONDS) // 设置读取超时时间为 10 秒
				.build();

			response = okHttpClient.newCall(request).execute();
			return response.body().string();
		} catch (Exception e) {
			log.error("okhttp3 post error >> ex = {}", e.getMessage());
		} finally {
			if (response != null) {
				response.close();
			}
		}
		return responseBody;
	}

}

pom

<dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>3.11.0</version>
        </dependency>

吐槽

百度的这个文档,一言难尽啊

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值