日期 | 版本 | 修订内容摘要 |
---|
2023-08-18 | v2.0.0 | 更新接口文档 |
一、运营商二要素
- 协议说明
- 请求参数
请求参数 Body 以 multipart/form-data 方式提交
- 响应内容
响应 body 数据为 JSON 格式
字段名 | 类型 | 说明 |
---|
chargeStatus | Integer | 是否收费,1 :收费 0:不收费 |
message | String | 响应 code 码解释 |
data | Object | 返回对象 |
orderNo | String | 业务唯一流水号。例:628291418130630 |
handleTime | String | 查询时间 例:2018-04-09 15:05:01 |
result | String | 认证结果,01-一致,02-不一致,03-不确定,04-失败 |
remark | String | 备注 ,例:认证一致 |
type | String | 运营商类型,1-移动 2-联通 3-电信 |
code | String | 响应 code 码。200000:成功,其他失败。见附录响应 code 码 |
- 成功返回结果(示例):
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "011649859552865265",
"handleTime": "2022-04-13 22:19:12",
"result": "01",
"remark": "认证一致",
"type": "1"
},
"code": "200000"
}
- 失败返回结果(示例):
{
"code": "500000",
"success": false,
"message": "系统异常",
"chargeStatus": 0
}
二、运营商二要素统一版(支持明文/MD5)
- 协议说明
- 请求参数
请求参数 Body 以 multipart/form-data 方式提交
- 响应内容
响应 body 数据为 JSON 格式
字段名 | 类型 | 说明 |
---|
chargeStatus | Integer | 是否收费,1 :收费 0:不收费 |
message | String | 响应 code 码解释 |
data | Object | 返回对象 |
orderNo | String | 业务唯一流水号。例:628291418130630 |
handleTime | String | 查询时间 例:2018-04-09 15:05:01 |
result | String | 认证结果,01-一致,02-不一致,03-不确定,04-失败 |
remark | String | 备注 ,例:认证一致 |
type | String | 运营商类型,1-移动 2-联通 3-电信 4-广电 |
code | String | 响应 code 码。200000:成功,其他失败。见附录响应 code 码 |
- 成功返回结果(示例):
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "011669615589498628",
"handleTime": "2022-11-28 14:06:29",
"result": "01",
"remark": "认证一致",
"type": "1"
},
"code": "200000"
}
- 失败返回结果(示例):
{
"chargeStatus": 0,
"message": "系统错误",
"data": {
"orderNo": "021669615432466365",
"handleTime": "2022-11-28 14:03:52",
"result": "04",
"remark": "认证失败"
},
"code": "500000"
}
三、运营商三要素
- 协议说明
- 请求参数说明
请求参数 Body 以 multipart/form-data 方式提交
- 响应参数说明
响应 body 数据为 JSON 格式
字段名 | 类型 | 说明 |
---|
chargeStatus | Integer | 是否收费,1 :收费 0:不收费 |
message | String | 响应 code 码解释 |
data | Object | 返回对象 |
orderNo | String | 业务唯一流水号。例:628291418130630 |
handleTime | String | 查询时间 例:2018-04-09 15:05:01 |
result | String | 认证结果,01-一致,02-不一致,03-不确定,04-失败 |
remark | String | 备注 ,例:认证一致 |
type | String | 运营商类型,1-移动 2-联通 3-电信 4-广电 |
gender | String | 性别:1:男、2:女 |
age | String | 年龄 |
code | String | 响应 code 码。200000:成功,其他失败。见附录响应 code 码 |
- 成功返回结果(示例):
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "011649859162862516",
"handleTime": "2022-04-13 22:12:42",
"result": "01",
"remark": "认证一致",
"type": "1",
"gender": "2",
"age": "24"
},
"code": "200000"
}
- 失败返回结果(示例):
{
"code": "500000",
"success": false,
"message": "系统异常",
"chargeStatus": 0
}
四、携号转网
- 协议说明
- 请求参数
请求参数 Body 以 multipart/form-data 方式提交
- 响应内容
响应 body 数据为 JSON 格式
字段名 | 类型 | 说明 |
---|
chargeStatus | Integer | 是否收费,1 :收费 0:不收费 |
message | String | 响应 code 码解释 |
data | Object | 返回对象 |
batchNo | String | 业务唯一流水号。 |
queryResult | Array | 查询结果 |
result | String | 是否携号转网转网 0 未转网 1 已转网 |
before | String | 原始运营商类型, -1 未知 1 移动 2 联通 3 电信 4 广电 |
mobile | String | 手机号 |
after | String | 转网后运营商类型, -1 未知 1 移动 2 联通 3 电信 4 广电 |
code | String | 响应 code 码。200000:成功,其他失败。见附录响应 code 码 |
- 成功返回结果(示例):
{
"chargeStatus": 1,
"message": "成功",
"data": {
"batchNo": "1046872236142624768",
"queryResult": [
{
"result": "0",
"before": "1",
"mobile": "13767641540",
"after": "1"
}
]
},
"code": "200000"
}
- 失败返回结果(示例):
{
"chargeStatus": 0,
"message": "手机号码格式不对",
"code": "400001"
}
五、运营商二要素 MD5
- 协议说明
- 请求参数
请求参数 Body 以 multipart/form-data 方式提交
- 响应内容
响应 body 数据为 JSON 格式
字段名 | 类型 | 说明 |
---|
chargeStatus | Integer | 是否收费,1 :收费 0:不收费 |
message | String | 响应 code 码解释 |
data | Object | 返回对象 |
orderNo | String | 业务唯一流水号。例:628291418130630 |
handleTime | String | 查询时间 例:2018-04-09 15:05:01 |
result | String | 认证结果,01-一致,02-不一致,03-不确定,04-失败 |
remark | String | 备注 ,例:认证一致 |
type | String | 运营商类型,1-移动 2-联通 3-电信 |
code | String | 响应 code 码。200000:成功,其他失败。见附录响应 code 码 |
- 核验成功(示例):
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "011669615589498628",
"handleTime": "2022-11-28 14:06:29",
"result": "01",
"remark": "认证一致",
"type": "1"
},
"code": "200000"
}
- 核验失败(示例):
{
"chargeStatus": 0,
"message": "系统错误",
"data": {
"orderNo": "021669615432466365",
"handleTime": "2022-11-28 14:03:52",
"result": "04",
"remark": "认证失败"
},
"code": "500000"
}
六、运营商二要素身份证版
- 协议说明
- 请求参数
请求参数 Body 以 multipart/form-data 方式提交
- 响应内容
响应 body 数据为 JSON 格式
字段名 | 类型 | 说明 |
---|
chargeStatus | Integer | 是否收费,1 :收费 0:不收费 |
message | String | 响应 code 码解释 |
data | Object | 返回对象 |
orderNo | String | 业务唯一流水号。例:628291418130630 |
handleTime | String | 查询时间 例:2018-04-09 15:05:01 |
result | String | 认证结果,01-一致,02-不一致,03-不确定,04-失败 |
remark | String | 备注 ,例:认证一致 |
type | String | 运营商类型,1-移动 2-联通 3-电信 |
gender | String | 性别,1-男 2-女 |
age | String | 年龄例:26 |
code | String | 响应 code 码。200000:成功,其他失败。见附录响应 code 码 |
- 成功返回结果(示例):
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "011669616539507481",
"handleTime": "2022-11-28 14:22:19",
"result": "01",
"remark": "认证一致",
"type": "1",
"gender": "1",
"age": "30"
},
"code": "200000"
}
- 失败返回结果(示例):
{
"chargeStatus": 0,
"message": "身份证格式错误",
"code": "400001"
}
七、运营商三要素 MD5
- 协议说明
- 请求参数说明
请求参数 Body 以 multipart/form-data 方式提交
- 响应参数说明
响应 body 数据为 JSON 格式
字段名 | 类型 | 说明 |
---|
chargeStatus | Integer | 是否收费,1 :收费 0:不收费 |
message | String | 响应 code 码解释 |
data | Object | 返回对象 |
orderNo | String | 业务唯一流水号。例:628291418130630 |
handleTime | String | 查询时间 例:2018-04-09 15:05:01 |
result | String | 认证结果,01-一致,02-不一致,03-不确定,04-失败 |
remark | String | 备注 ,例:认证一致 |
type | String | 运营商类型,1-移动 2-联通 3-电信 |
code | String | 响应 code 码。200000:成功,其他失败。见附录响应 code 码 |
- 核验成功(示例):
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "021669619646506904",
"handleTime": "2022-11-28 15:14:06",
"result": "01",
"remark": "认证一致",
"type": "1"
},"code": "200000"
}
- 核验失败(示例):
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "011669628673638957",
"handleTime": "2022-11-28 17:44:33",
"result": "02",
"remark": "认证不一致",
"type": "1"
},"code": "200000"
}
八、运营商三要素详细版
- 协议说明
- 请求参数说明
请求参数 Body 以 multipart/form-data 方式提交
- 响应参数说明
响应 body 数据为 JSON 格式
字段名 | 类型 | 说明 |
---|
chargeStatus | Integer | 是否收费,1 :收费 0:不收费 |
message | String | 响应 code 码解释 |
data | Object | 返回对象 |
orderNo | String | 业务唯一流水号。例:628291418130630 |
handleTime | String | 查询时间 例:2018-04-09 15:05:01 |
result | String | 认证结果,01-一致,02-不一致,03-不确定,04-失败 |
remark | String | 备注 ,例:认证一致 |
type | String | 运营商类型,1-移动 2-联通 3-电信 4-广电 |
gender | String | 性别:1:男、2:女 |
age | String | 年龄 |
detail | Object | 详情信息 |
code | String | 详细的返回代码 |
remark | 详细描述 | 详细的返回代码描述 02-手机号已实名,但是身份证和姓名均与实名信息不一致 03-手机号已实名,手机号和证件号一致,姓名不一致 04-手机号已实名,手机号和姓名一致,身份证不一致 05-其他不一致 06-姓名身份证不一致 |
code | String | 响应 code 码。200000:成功,其他失败。见附录响应 code 码 |
- 成功返回结果(示例):
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "021669627895599482",
"handleTime": "2022-11-28 17:31:35",
"result": "02",
"remark": "认证不一致",
"type": "2","gender": "1",
"age": "30",
"detail": {
"code": "03",
"remark": "手机号、身份证匹配成功,姓名匹配失败"
}},
"code": "200000"
}
- 失败返回结果(示例):
{
"chargeStatus": 0,
"message": "姓名格式错误",
"code": "400001"
}
九、运营商三要素详细版(非身份证)
** 运营商三要素详细版(非身份证)(支持三网)**
- 协议说明
- 请求参数说明
请求参数 Body 以 multipart/form-data 方式提交
- 响应参数说明
响应 body 数据为 JSON 格式
字段名 | 类型 | 说明 |
---|
code | String | 响应 code 码。200000:成功,其他失败。见附录响应 code 码 |
chargeStatus | Integer | 是否收费,1 :收费 0:不收费 |
chargeCount | String | 扣费条数 |
message | String | 响应 code 码解释 |
reqId | String | 流水号 |
data | Object | 返回对象 |
result | String | 认证结果,具体见下面映射关系枚举 |
remark | String | 备注 |
type | String | 运营商类型 1移动 2联通 3电信 |
handleTime | String | 调用日期 |
orderNo | String | 订单号 |
- 成功返回结果(示例):
{
"code": "200000",
"message": "success",
"reqId": "4215958629146410023",
"chargeStatus": 1,
"chargeCount": "1",
"data": {
"result": "01",
"remark": "一致",
"type": "CUCC",
"handleTime": "2024-11-25 11:15:25",
"orderNo": "4215958629146410024"
}
}
- 失败返回结果(示例):
{
"code": "200000",
"message": "success",
"reqId": "4215958629146410025",
"chargeStatus": 1,
"chargeCount": "1",
"data": {
"result": "06",
"remark": "证件(类型/号码)不正确",
"type": "CMCC",
"handleTime": "2024-11-25 11:21:00",
"orderNo": "4215958629146410026"
}
}
6.证件类型枚举
枚举名称 | 枚举值 |
---|
护照 | 03 |
港澳居民来往内地通行证(回乡证) | 15 |
台湾同胞来往内地通行证 | 07 |
外国人居留证 | 09 |
其他 | 99 |
7.result映射关系枚举
result | remark | 是否收费 |
---|
01 | 一致 | 是 |
02 | 不一致 | 是 |
03 | 查无信息 | 否 |
04 | 系统错误 | 否 |
05 | 交易次数超限 | 否 |
06 | 证件(类型/号码)不正确 | 是 |
07 | 姓名不正确 | 是 |
08 | 姓名为空 | 否 |
09 | 证件号为空 | 否 |
10 | 手机号为空或格式错误 | 否 |
十、运营商三要素详细 MD5
- 协议说明
- 请求参数说明
请求参数 Body 以 multipart/form-data 方式提交
- 响应参数说明
响应 body 数据为 JSON 格式
字段名 | 类型 | 说明 |
---|
chargeStatus | Integer | 是否收费,1 :收费 0:不收费 |
message | String | 响应 code 码解释 |
data | Object | 返回对象 |
orderNo | String | 业务唯一流水号。例:628291418130630 |
handleTime | String | 查询时间 例:2018-04-09 15:05:01 |
result | String | 认证结果,01-一致,02-不一致,03-不确定,04-失败 |
remark | String | 备注 ,例:认证一致 |
type | String | 运营商类型,1-移动 2-联通 3-电信 |
detail | Object | 详情信息 |
code | String | 详细的返回代码 |
remark | 详细描述 | 详细的返回代码描述 02-手机号已实名,但是身份证和姓名均与实名信息不一致 03-手机号已实名,手机号和证件号一致,姓名不一致 04-手机号已实名,手机号和姓名一致,身份证不一致 05-其他不一致 06-姓名身份证不一致 |
code | String | 响应 code 码。200000:成功,其他失败。见附录响应 code 码 |
- 核验成功(示例):
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "011669628587638072",
"handleTime": "2022-11-28 17:43:07",
"result": "01",
"remark": "认证一致",
"type": "1"
},
"code": "200000"
}
- 核验失败(示例):
{
"chargeStatus": 1,
"message": "成功",
"data": {"orderNo": "011669628612638308",
"handleTime": "2022-11-28 17:43:32",
"result": "02","remark": "认证不一致",
"type": "1",
"detail": {
"code": "04",
"remark": "手机号、姓名匹配成功,身份证匹配失败"
}
},
"code": "200000"
}
十一、运营商三要素简版加密
- 协议说明
- 请求参数说明
请求参数 Body 以 multipart/form-data 方式提交
参数名 | 类型 | 是否必填 | 说明 |
---|
appId | String | 是 | 请在https://www.chuanglan.com/ 登录后获取 |
param | String | 是 | 加密之后的参数。将参数按照如下格式拼接,name=张三&idnum=123456789012345678&mobilenum=18600000000;然后使用 AppKey MD5 之后的前 16 位做密钥,后 16 位做向量,进行 AES/CBC/PKCS5Padding 模式加密 (参数生成代码示例见下文附录) |
- 响应参数说明
响应 body 数据为 JSON 格式
字段名 | 类型 | 说明 |
---|
chargeStatus | Integer | 是否收费,1 :收费 0:不收费 |
message | String | 响应 code 码解释 |
data | Object | 返回对象 |
orderNo | String | 业务唯一流水号。例:628291418130630 |
handleTime | String | 查询时间 例:2018-04-09 15:05:01 |
result | String | 认证结果,01-一致,02-不一致,03-不确定,04-失败 |
remark | String | 备注 ,例:认证一致 |
type | String | 运营商类型,1-移动 2-联通 3-电信 |
gender | String | 性别:1:男、2:女 |
age | String | 年龄 |
code | String | 响应 code 码。200000:成功,其他失败。见附录响应 code 码 |
- 成功返回结果(示例):
{
"chargeStatus": 1,
"message": "成功",
"data": {
"orderNo": "011669631513666479",
"handleTime": "2022-11-28 18:31:53",
"result": "01",
"remark": "认证一致",
"type": "1",
"gender": "1",
"age": "30"
},
"code": "200000"
}
- 失败返回结果(示例):
{
"message": "数据解密异常",
"code": "500002"
}
十二、运营商三要素核验(仅广电号段)
- 协议说明
- 请求参数说明
请求参数 Body 以 multipart/form-data 方式提交
- 响应参数说明
响应 body 数据为 JSON 格式
字段名 | 类型 | 说明 |
---|
code | String | 响应 code 码。200000:成功,其他失败。见附录响应 code 码 |
chargeStatus | Integer | 是否收费,1 :收费 0:不收费 |
chargeCount | String | 扣费条数 |
message | String | 响应 code 码解释 |
reqId | String | 流水号 |
data | Object | 返回对象 |
result | String | 认证结果,01-一致,02-不一致,03-不确定,04-失败 |
remark | String | 备注 ,备注,例:认证一致;认证不一致;无记录;虚拟号 |
type | String | 运营商类型,仅广电返回“0” 0 中国广电 |
- 成功返回结果(示例):
{
"code": "200000",
"message": "success",
"reqId": "1198531487920554466",
"chargeStatus": 1,
"chargeCount": "1",
"data": {
"result": "01",
"remark": "认证一致",
"type": "0"
}
}
- 失败返回结果(示例):
{
"chargeStatus": 0,
"message": "身份证格式错误",
"code": "400001"
}
附录:运营商三要素简版加密参数生成代码示例
package com.chuanglan;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
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"));
}
}
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 carriersAuthSecretTest {
public static void main(String[] args) throws Exception {
String name = "小明";
String idnum = "362528199301010035";
String mobilenum = "13767646666";
String appKey = "2tCLlXQZ";
String splicingParam = "name=" + name + "&idnum=" + idnum + "&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码解释
没有更多了