正文
因为百度提供的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>
吐槽
百度的这个文档,一言难尽啊