日期 | 版本 | 修订内容摘要 |
---|
2023-08-18 | v2.0.0 | 更新接口文档 |
一、 银行卡二要素标准版
1.协议说明
2.请求参数
请求参数 Body 以 multipart/form-data 方式提交
- 响应内容
响应 body 数据为 JSON 格式
字段名 | 类型 | 说明 |
---|
chargeStatus | int | 1:收费;0:不收费 |
code | String | 响应 code 码。200000:成功,其他失败。 |
message | String | 响应 code 码解释 |
data | Object | |
orderNo | String | 业务唯一流水号。例:628291418130630 |
handleTime | String | 查询时间 例:2018-04-09 15:05:01 |
remark | String | 备注,例:一致 |
result | String | 返回结果: 01-认证一致(收费) 02-认证不一致(收费) 03-认证不确定(不收费) 04-认证失败(不收费) |
bankName | String | 银行卡所属银行。样例:招商银行 |
cardType | String | 银行卡类型 样例:金穗借记卡 |
cardCategory | String | 银行卡类别 样例:借记卡 |
4.响应返回实体 DEMO
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "011669167345100317",
"handleTime": "2022-11-23 09:35:45",
"result": "01",
"remark": "认证一致",
"bankName": "上海银行",
"cardType": "首发纪念版IC卡",
"cardCategory": "借记卡"
},
"code": "200000"
}
5.失败返回实体
{
"chargeStatus": 0,
"message": "姓名格式错误",
"code": "400001"
}
二、 银行卡三要素标准版
1.协议说明
2.请求参数
请求参数 Body 以 multipart/form-data 方式提交。
3.响应内容
响应 body 数据为 JSON 格式。
字段名 | 类型 | 说明 |
---|
chargeStatus | int | 1:收费;0:不收费 |
code | String | 响应 code 码。200000:成功,其他失败。 |
message | String | 响应 code 码解释 |
data | Object | |
orderNo | String | 业务唯一流水号。例:628291418130630 |
handleTime | String | 查询时间 例:2018-04-09 15:05:01 |
remark | String | 备注,例:一致 |
result | String | 返回结果: 01-认证一致(收费) 02-认证不一致(收费) 03-认证不确定(不收费) 04-认证失败(不收费) |
bankName | String | 银行卡所属银行。样例:招商银行 |
cardType | String | 银行卡类型 样例:金穗借记卡 |
cardCategory | String | 银行卡类别 样例:借记卡 |
innerresult | String | result具体解释: 0101-认证一致;0201-不一致,认证未通过;0301-认证不确定;0401-认证失败 |
4.响应返回实体 DEMO
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "011669168041100319",
"handleTime": "2022-11-23 09:47:21",
"result": "01",
"remark": "认证一致",
"bankName": "上海银行",
"cardType": "首发纪念版IC卡",
"cardCategory": "借记卡",
"innerresult": "0101"
},
"code": "200000"
}
5.失败返回实体
{
"chargeStatus": 0,
"message": "姓名格式错误",
"code": "400001"
}
三、 银行卡三要素详细版
1.协议说明
2.请求参数
请求参数 Body 以 multipart/form-data 方式提交。
3.响应内容
响应 body 数据为 JSON 格式。
字段名 | 类型 | 说明 |
---|
chargeStatus | int | 1:收费;0:不收费 |
code | String | 响应 code 码。200000:成功,其他失败。 |
message | String | 响应 code 码解释 |
data | Object | |
orderNo | String | 业务唯一流水号。例:628291418130630 |
handleTime | String | 查询时间 例:2018-04-09 15:05:01 |
remark | String | 备注,例:一致 |
result | String | 返回结果:返回 01(认证一致),02,05,06,07 时收费,其他不收费 |
bankName | String | 银行卡所属银行。样例:招商银行 |
cardType | String | 银行卡类型 样例:金穗借记卡 |
cardCategory | String | 银行卡类别 样例:借记卡 |
4.响应返回实体 DEMO
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "011669168074100320",
"handleTime": "2022-11-23 09:47:54",
"result": "01",
"remark": "认证信息匹配",
"bankName": "上海银行",
"cardType": "首发纪念版IC卡",
"cardCategory": "借记卡"
},
"code": "200000"
}
5.失败返回实体
{
"chargeStatus": 0,
"message": "姓名格式错误",
"code": "400001"
}
四、 银行卡三要素精准版(非身份证版)
1.协议说明
2.请求参数
请求参数 Body 以 multipart/form-data 方式提交。
3.响应内容
响应 body 数据为 JSON 格式。
字段名 | 类型 | 说明 |
---|
chargeStatus | int | 1:收费;0:不收费 |
code | String | 响应 code 码。200000:成功,其他失败。 |
message | String | 响应 code 码解释 |
data | Object | |
orderNo | String | 业务唯一流水号。例:628291418130630 |
handleTime | String | 查询时间 例:2018-04-09 15:05:01 |
remark | String | 备注,例:一致 |
result | String | 返回结果: 01-认证一致(收费) 02-认证不一致(收费) 03-认证不确定(不收费) 04-认证失败(不收费) |
bankName | String | 银行卡所属银行。样例:招商银行 |
cardType | String | 银行卡类型 样例:金穗借记卡 |
cardCategory | String | 银行卡类别 样例:借记卡 |
4.响应返回实体 DEMO
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "011733987920100027",
"handleTime": "2024-12-12 15:18:40",
"result": "01",
"remark": "验证通过",
"bankName": "中国农业银行",
"cardType": "金穗通宝卡(银联卡)",
"cardCategory": "借记卡"
},
"code": "200000"
}
5.失败返回实体
{
"chargeStatus":0,
"message":"失败",
"data": null,
"code":"500"
}
五、 银行卡四要素标准版
1.协议说明
2.请求参数
请求参数 Body 以 multipart/form-data 方式提交。
3.响应内容
响应 body 数据为 JSON 格式。
字段名 | 类型 | 说明 |
---|
code | String | 响应 code 码。200000:成功,其他失败。 |
message | String | 响应 code 码解释 |
chargeStatus | String | 是否收费,枚举值:1 :收费 0:不收费 |
data | Object | |
data>>orderNo | String | 业务唯一流水号 |
data>>handleTime | String | 查询时间。样例:2018-04-09 15:05:01 |
data>>result | String | 认证结果。01:一致 02:不一致 03:认证不确定 04:认证失败。01、02 收费 |
data>>bankName | String | 银行卡所属银行。样例:招商银行 |
data>>cardType | String | 银行卡类型 样例:金穗借记卡 |
data>>cardCategory | String | 银行卡类别 样例:借记卡 |
data>>remark | String | 备注。样例:信息认证未通过(验证不一致) |
data>>innerresult | String | result具体解释: 0101-认证一致;0201-不一致,认证未通过;0301-认证不确定;0401-认证失败 0301-认证不确定;0401-认证失败 |
4.成功返回实体 DEMO
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "011670055041630705",
"handleTime": "2022-12-03 16:10:42",
"result": "01",
"remark": "认证一致",
"bankName": "中国银行",
"cardType": "借记IC个人普卡",
"cardCategory": "借记卡",
"innerresult": "0101"
},
"code": "200000"
}
5.失败返回实体 DEMO
{
"chargeStatus": 0,
"message": "姓名格式错误",
"code": "400001"
}
六、 银行卡四要素详细版
1.协议说明
2.请求参数
请求参数 Body 以 multipart/form-data 方式提交。
3.响应内容
响应 body 数据为 JSON 格式。
字段名 | 类型 | 说明 |
---|
code | String | 响应 code 码。200000:成功,其他失败。 |
message | String | 响应 code 码解释 |
chargeStatus | String | 是否收费,枚举值:1 :收费 0:不收费 |
data | Object | |
orderNo | String | 业务唯一流水号 |
handleTime | String | 查询时间。样例:2018-04-09 15:05:01 |
result | String | 认证结果代码。01:认证一致 02:认证不一致 03:认证不确定 04:认证失败 05:手机号码不匹配 06:身份证号码不匹配 07:姓名不匹配 01, 02, 05, 06, 07 的代码收费,其他不收费 |
bankName | String | 银行卡所属银行。样例:招商银行 |
cardType | String | 银行卡类型 样例:金穗借记卡 |
cardCategory | String | 银行卡类别 样例:借记卡 |
remark | String | 备注。样例:信息认证未通过(验证不一致) |
4.成功返回实体 DEMO
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "011670055041630705",
"handleTime": "2022-12-03 16:10:42",
"result": "01",
"remark": "认证一致",
"bankName": "中国银行",
"cardType": "借记IC个人普卡",
"cardCategory": "借记卡"
},
"code": "200000"
}
5.失败返回实体 DEMO
{
"chargeStatus": 0,
"message": "姓名格式错误",
"code": "400001"
}
七、 银行卡四要素精准版(非身份证)
1.协议说明
2.请求参数
请求参数 Body 以 multipart/form-data 方式提交。
参数名 | 类型 | 是否必须 | 说明 |
---|
appId | String | 是 | 请在https://www.chuanglan.com/ 登录后获取 |
appKey | String | 是 | 请在https://www.chuanglan.com/ 登录后获取 |
name | String | 是 | 姓名 |
idNum | String | 是 | 证件号,限单个 |
cardNo | String | 是 | 银行卡号,限单个 |
mobile | String | 是 | 银行预留手机号码,限单个,仅支持国内号码,11 位 |
idType | String | 否 | 证件类型(02军官证、03护照、05土兵证、06内地居民来往港澳通行证、07台湾同胞来往内地通行证、10警官证、15港澳居民来往内地通行证(回乡证)) |
3.响应内容
响应 body 数据为 JSON 格式。
字段名 | 类型 | 说明 |
---|
code | String | 响应 code 码。200000:成功,其他失败。 |
message | String | 响应 code 码解释 |
chargeStatus | String | 是否收费,枚举值:1 :收费 0:不收费 |
data | Object | |
orderNo | String | 业务唯一流水号 |
handleTime | String | 查询时间。样例:2018-04-09 15:05:01 |
result | String | 认证结果。01:一致 02:不一致 03:认证不确定 04:认证失败。01、02收费 |
bankName | String | 银行卡所属银行。样例:招商银行 |
cardType | String | 银行卡类型 样例:金穗借记卡 |
cardCategory | String | 银行卡类别 样例:借记卡 |
remark | String | 备注。样例:信息认证未通过(验证不一致) |
4.成功返回实体 DEMO
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "011670055041630705",
"handleTime": "2022-12-03 16:10:42",
"result": "01",
"remark": "认证一致",
"bankName": "中国银行",
"cardType": "借记IC个人普卡",
"cardCategory": "借记卡"
},
"code": "200000"
}
5.失败返回实体 DEMO
{
code: "500000",
success: false,
message: "系统异常",
chargeStatus: 0
}
八、 银行卡四要素简版加密
1.协议说明
2.请求参数
请求参数 Body 以 multipart/form-data 方式提交。
参数名 | 类型 | 是否必须 | 说明 |
---|
appId | String | 是 | 请在https://www.chuanglan.com/ 登录后获取 |
param | String | 是 | 加密之后的参数。将参数按照如下格式拼接,name=张三&idnum=123456789012345678&cardnum=6225123456780000&mobilenum=18600000000;然后使用 AppKey MD5 之后的前 16 位做密钥,后 16 位做向量,进行 AES/CBC/PKCS5Padding 模式加密 |
3.响应内容
响应 body 数据为 JSON 格式。
字段名 | 类型 | 说明 |
---|
code | String | 响应 code 码。200000:成功,其他失败。 |
message | String | 响应 code 码解释 |
chargeStatus | String | 是否收费,枚举值:1 :收费 0:不收费 |
data | Object | |
orderNo | String | 业务唯一流水号 |
handleTime | String | 查询时间。样例:2018-04-09 15:05:01 |
result | String | 认证结果。01:一致 02:不一致 03:认证不确定 04:认证失败。01、02 收费 |
bankName | String | 银行卡所属银行。样例:招商银行 |
cardType | String | 银行卡类型 样例:金穗借记卡 |
cardCategory | String | 银行卡类别 样例:借记卡 |
remark | String | 备注。样例:信息认证未通过(验证不一致) |
4.成功返回实体 DEMO
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "021670056350630361",
"handleTime": "2022-12-03 16:32:30",
"result": "01",
"remark": "认证一致",
"bankName": "中国银行",
"cardType": "借记IC个人普卡",
"cardCategory": "借记卡"
},
"code": "200000"
}
5.失败返回实体 DEMO
{
"message":"数据解密异常"
"code":"500002"
}
九、 银行卡三要素多证件版
1.协议说明
2.请求参数
请求参数 Body 以 multipart/form-data 方式提交。
3.响应内容
响应 body 数据为 JSON 格式。
字段名 | 类型 | 说明 |
---|
chargeStatus | int | 1:收费;0:不收费 |
code | String | 响应 code 码。200000:成功,其他失败。 |
message | String | 响应 code 码解释 |
data | Object | |
orderNo | String | 业务唯一流水号。例:628291418130630 |
handleTime | String | 查询时间 例:2018-04-09 15:05:01 |
remark | String | 备注,例:一致 |
result | String | 返回结果: 01-认证一致(收费) 02-认证不一致(收费) 03-认证不确定(不收费) 04-认证失败(不收费) |
bankName | String | 银行卡所属银行。样例:招商银行 |
cardType | String | 银行卡类型 样例:金穗借记卡 |
cardCategory | String | 银行卡类别 样例:借记卡 |
4.响应返回实体 DEMO
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "011669168041100319",
"handleTime": "2022-11-23 09:47:21",
"result": "01",
"remark": "认证一致",
"bankName": "上海银行",
"cardType": "首发纪念版IC卡",
"cardCategory": "借记卡"
},
"code": "200000"
}
5.失败返回实体
{
"chargeStatus": 0,
"message": "姓名格式错误",
"code": "400001"
}
十、 银行卡四要素多证件版
1.协议说明
2.请求参数
请求参数 Body 以 multipart/form-data 方式提交。
参数名 | 类型 | 是否必须 | 说明 |
---|
appId | String | 是 | 请在https://www.chuanglan.com/ 登录后获取 |
appKey | String | 是 | 请在https://www.chuanglan.com/ 登录后获取 |
name | String | 是 | 姓名 |
idNum | String | 是 | 身份证号码,限单个 |
cardNo | String | 是 | 银行卡号,限单个 |
mobile | String | 是 | 银行预留手机号码,限单个,仅支持国内号码,11 位 |
idType | String | 否 | 证件类型(默认身份证) 02:军官证 03:护照 05:士兵证 06:内地居民来往港澳通行证 07:台湾同胞来往内地通行证 09:外国人永久居住证 10:警官证 15:港澳居民来往内地通行证(回乡证) 18:台湾居民居住证 19:港澳居民居住证 20:外国护照 |
3.响应内容
响应 body 数据为 JSON 格式。
字段名 | 类型 | 说明 |
---|
code | String | 响应 code 码。200000:成功,其他失败。 |
message | String | 响应 code 码解释 |
chargeStatus | String | 是否收费,枚举值:1 :收费 0:不收费 |
data | Object | |
orderNo | String | 业务唯一流水号 |
handleTime | String | 查询时间。样例:2018-04-09 15:05:01 |
result | String | 认证结果。01:一致 02:不一致 03:认证不确定 04:认证失败。01、02 收费 |
bankName | String | 银行卡所属银行。样例:招商银行 |
cardType | String | 银行卡类型 样例:金穗借记卡 |
cardCategory | String | 银行卡类别 样例:借记卡 |
remark | String | 备注。样例:信息认证未通过(验证不一致) |
4.成功返回实体 DEMO
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "011670055041630705",
"handleTime": "2022-12-03 16:10:42",
"result": "01",
"remark": "认证一致",
"bankName": "中国银行",
"cardType": "借记IC个人普卡",
"cardCategory": "借记卡"
},
"code": "200000"
}
5.失败返回实体 DEMO
{
"chargeStatus": 0,
"message": "姓名格式错误",
"code": "400001"
}
十一、 银行卡五要素标准版
1.协议说明
2.请求参数
请求参数 Body 以 multipart/form-data 方式提交。
3.响应内容
响应 body 数据为 JSON 格式。
字段名 | 类型 | 说明 |
---|
code | String | 响应 code 码。200000:成功,其他失败。 |
message | String | 响应 code 码解释 |
chargeStatus | String | 是否收费,枚举值:1 :收费 0:不收费 |
data | Object | |
orderNo | String | 业务唯一流水号 |
handleTime | String | 查询时间。样例:2018-04-09 15:05:01 |
result | String | 认证结果。 01:认证信息匹配 02:认证信息不匹配 03:无法验证 04:认证失败。01、02、03收费 |
bankName | String | 银行卡所属银行。样例:招商银行 |
cardType | String | 银行卡类型 样例:金穗借记卡 |
cardCategory | String | 银行卡类别 样例:借记卡 |
remark | String | 备注。样例:信息认证未通过(验证不一致) |
bankAccountType | String | 卡类型:0:暂不支持银行 1:疑似 I 类 2:II 类 3:III 类 4:Ⅱ类或Ⅲ类 5:贷记卡 7:未知类型 |
4.成功返回实体 DEMO
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "011717495039100001",
"handleTime": "2024-06-04 17:57:19",
"result": "01",
"remark": "认证信息匹配",
"bankName": "上海银行",
"cardType": "首发纪念版IC卡",
"cardCategory": "借记卡",
"bankAccountType": "1"
},
"code": "200000"
}
5.失败返回实体 DEMO
{
code: "500000",
success: false,
message: "系统异常",
chargeStatus: 0
}
附录:银行卡四要素简版加密参数生成代码示例
MD5加密工具类
public class MD5Utils {
// 全局数组
private final static String[] strDigits = { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f","g","h","j","?","~" };
private static MD5Utils mD5Util;
public static MD5Utils getInstance() {
if (mD5Util == null) {
synchronized (MD5Utils.class) {
if (mD5Util == null) {
mD5Util = new MD5Utils();
}
}
}
return mD5Util;
}
// 返回形式为数字跟字符串
private String byteToArrayString(byte bByte) {
int iRet = bByte;
// System.out.println("iRet="+iRet);
if (iRet < 0) {
iRet += 256;
}
int iD1 = iRet / 16;
int iD2 = iRet % 16;
return strDigits[iD1] + strDigits[iD2];
}
// 转换字节数组为16进制字串
private String byteToString(byte[] bByte) {
StringBuffer sBuffer = new StringBuffer();
for (int i = 0; i < bByte.length; i++) {
sBuffer.append(byteToArrayString(bByte[i]));
}
return sBuffer.toString();
}
public String getMD5Code(String strObj) {
String resultString = null;
try {
resultString = new String(strObj);
MessageDigest md = MessageDigest.getInstance("MD5");
// md.digest() 该函数返回值为存放哈希值结果的byte数组
resultString = byteToString(md.digest(strObj.getBytes()));
} catch (NoSuchAlgorithmException ex) {
ex.printStackTrace();
}
return resultString;
}
public static void main(String[] args) {
// e10adc3949ba59abbe56e057f20f883e
System.out.println(MD5Utils.getInstance().getMD5Code("1542971941chuanglan_data_key_test"));
}
}
AES加解密工具类
package com.chuanglan;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.ByteArrayOutputStream;
public class AESUtils {
private static final String charset = "utf-8";
public static String EncryptCbcIv(String sSrc, String sKey, String ivStr) throws Exception {
try {
if (sSrc == null || sSrc.length() == 0 || sSrc.trim().length() == 0) {
return null;
}
if (sKey == null) {
throw new Exception("encrypt key is null");
}
if (sKey.length() != 16) {
throw new Exception("encrypt key length error");
}
if (ivStr.length() != 16) {
throw new Exception(" iv encrypt key length error");
}
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec skeySpec = new SecretKeySpec(sKey.getBytes(charset), "AES");
IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes(charset));//new IvParameterSpec(getIV());
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypt = cipher.doFinal(sSrc.getBytes("utf-8"));
return AesBase64.encode(encrypt);
} catch (Exception ex) {
throw new Exception("decrypt errot", ex);
}
}
public static String DecryptCbcIv(String sSrc, String sKey, String ivStr) throws Exception {
try {
if (sSrc == null || sSrc.length() == 0 || sSrc.trim().length() == 0) {
return null;
}
if (sKey == null) {
throw new Exception("decrypt key is null");
}
if (sKey.length() != 16) {
throw new Exception("decrypt key length error");
}
if (ivStr.length() != 16) {
throw new Exception(" iv decrypt key length error");
}
byte[] Decrypt = AesBase64.decode(sSrc);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec skeySpec = new SecretKeySpec(sKey.getBytes(charset), "AES");
IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes(charset));//new IvParameterSpec(getIV());
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);//使用解密模式初始化 密
byte[] decrypt = cipher.doFinal(Decrypt);
return new String(decrypt, charset);
} catch (Exception ex) {
throw new Exception("decrypt errot", ex);
}
}
public static class AesBase64 {
private static char[] base64EncodeChars = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b',
'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};
private static byte[] base64DecodeChars = new byte[]{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1};
private AesBase64() {
}
public static String encode(byte[] data) {
StringBuffer sb = new StringBuffer();
int len = data.length;
int i = 0;
int b1, b2, b3;
while (i < len) {
b1 = data[i++] & 0xff;
if (i == len) {
sb.append(base64EncodeChars[b1 >>> 2]);
sb.append(base64EncodeChars[(b1 & 0x3) << 4]);
sb.append("==");
break;
}
b2 = data[i++] & 0xff;
if (i == len) {
sb.append(base64EncodeChars[b1 >>> 2]);
sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);
sb.append(base64EncodeChars[(b2 & 0x0f) << 2]);
sb.append("=");
break;
}
b3 = data[i++] & 0xff;
sb.append(base64EncodeChars[b1 >>> 2]);
sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);
sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]);
sb.append(base64EncodeChars[b3 & 0x3f]);
}
return sb.toString();
}
public static byte[] decode(String str) {
byte[] data = str.getBytes();
int len = data.length;
ByteArrayOutputStream buf = new ByteArrayOutputStream(len);
int i = 0;
int b1, b2, b3, b4;
while (i < len) {
/* b1 */
do {
b1 = base64DecodeChars[data[i++]];
} while (i < len && b1 == -1);
if (b1 == -1) {
break;
}
/* b2 */
do {
b2 = base64DecodeChars[data[i++]];
} while (i < len && b2 == -1);
if (b2 == -1) {
break;
}
buf.write((int) ((b1 << 2) | ((b2 & 0x30) >>> 4)));
/* b3 */
do {
b3 = data[i++];
if (b3 == 61) {
return buf.toByteArray();
}
b3 = base64DecodeChars[b3];
} while (i < len && b3 == -1);
if (b3 == -1) {
break;
}
buf.write((int) (((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2)));
/* b4 */
do {
b4 = data[i++];
if (b4 == 61) {
return buf.toByteArray();
}
b4 = base64DecodeChars[b4];
} while (i < len && b4 == -1);
if (b4 == -1) {
break;
}
buf.write((int) (((b3 & 0x03) << 6) | b4));
}
return buf.toByteArray();
}
}
}
参数生成测试类
public class BankFourSecretTest {
public static void main(String[] args) throws Exception {
String name = "小明";
String idnum = "362528xxxxxxxx0035";
String cardnum = "620522xxxxxxxxxx";
String mobilenum = "1376764xxxx";
String appKey = "MDdyKxxx";
String splicingParam = "name=" + name + "&idnum=" + idnum + "&cardnum=" + cardnum + "&mobilenum=" + mobilenum;
String md5Code = MD5Utils.getInstance().getMD5Code(appKey);
String sKey = md5Code.substring(0, 16);
String ivStr = md5Code.substring(16, 32);
String param = AESUtils.EncryptCbcIv(splicingParam, sKey, ivStr);
System.out.println(param);
}
}
code码解释
没有更多了