1、新增bip获取token方法

This commit is contained in:
zhengyf 2025-09-09 08:34:07 +08:00
parent 4d92ccbaa5
commit 7438069201
4 changed files with 138 additions and 280 deletions

View File

@ -2,7 +2,10 @@ package com.hzya.frame.finance.bip.controller;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.hzya.frame.finance.bip.entity.BIPTokenResVO;
import com.hzya.frame.finance.bip.service.IBipApiService;
import com.hzya.frame.voucher.utils.ZTResult;
import com.hzya.frame.web.action.DefaultController;
import com.hzya.frame.web.entity.JsonResultEntity;
import org.springframework.beans.factory.annotation.Autowired;
@ -24,13 +27,12 @@ public class BipApiController extends DefaultController {
public JsonResultEntity getToken() {
try {
String bipToken = bipApiService.getToekn();
JSONObject jsonObject = JSONUtil.parseObj(bipToken);
boolean success = (boolean) jsonObject.get("success");
if (success) {
return getSuccessMessageEntity(bipToken);
BIPTokenResVO bipTokenResVO = JSON.parseObject(bipToken).toJavaObject(BIPTokenResVO.class);
String success = bipTokenResVO.getSuccess();
if ("true".equals(success)) {
return getSuccessMessageEntity("查询成功",bipTokenResVO);
} else {
return getFailureMessageEntity(bipToken);
return getFailureMessageEntity("查询成功",bipTokenResVO);
}
} catch (Exception e) {
e.printStackTrace();

View File

@ -0,0 +1,28 @@
package com.hzya.frame.finance.bip.entity;
import lombok.Data;
/**
* Created by zydd on 2025-09-08 18:34
*/
@lombok.Data
public class BIPTokenResVO {
private String success;
private String code;
private String message;
private String errorStack;
private String pageInfo;
private Data data;
@lombok.Data
public static class Data {
private String access_token;
private String expires_in;
private String refresh_token;
private String security_key;
private String ts;
private String grant_type;
private String security_level;
}
}

View File

@ -23,165 +23,91 @@ import java.util.Properties;
@Service
public class IBipApiServiceImpl implements IBipApiService {
@Value("${spring.profiles.active}")
public String activeProfile;
// app_secret
private static String client_secret = null;
// 公钥
private static String pubKey = null;
// app_id
private static String client_id = null;
// bip用户名
private static String username = null;
private static String usercode = null;
// bip用户名密码
private static String pwd = null;
// bip账套
private static String busi_center = null;
private static String dsname = null;
// 获取token方式client_credentialspassword
private static String grant_type = null;
// 服务器ipport
private static String baseUrl = null;
// 返回值压缩加密级别
private static String secret_level = null;
// 请求参数
private static String requestBody = null;
// openapi请求路径
private static String apiUrl = null;
private String grant_type = "client";
private String apiUrl;
private String secret_level = "L0";
private String baseUrl;
@Value("${BIP.ip}")
private String ip;
@Value("${BIP.port}")
private String port;
// @Value("${BIP.biz_center}")
private String biz_center="01";
@Value("${BIP.client_id}")
private String client_id;
@Value("${BIP.client_secret}")
private String client_secret;
@Value("${BIP.pubKey}")
private String pubKey;
@Value("${BIP.user_name}")
private String user_name;
@Value("${BIP.pwd}")
private String pwd;
class SecretConst {
public static final String LEVEL0 = "L0";
public static final String LEVEL1 = "L1";
public static final String LEVEL2 = "L2";
public static final String LEVEL3 = "L3";
public static final String LEVEL4 = "L4";
}
// 访问api获取到的access_token
public static String token = null;
// 重复调用检查
public static String repeat_check = null;
// 接口调用业务标识
public static String busi_id = null;
@Override
public String getToekn() throws Exception {
// 初始化数据
init();
//获取token
String token = getToken();
return token;
}
public String pushData(String url, String data, String bipUserCode) throws Exception {
Assert.notNull(url, "请求地址不能为空");
Assert.notNull(data, "请求参数不能为空(需要JSON格式)");
// 初始化相关参数
if (pubKey == null) {
init();
}
if (bipUserCode == null) {
token = getTokenByPWD();
} else {
token = getTokenByClient(bipUserCode);
}
// 发起api接口
return sendApi(token, url, data);
}
private void init() {
Properties properties = new Properties();
String filepath = "application-" + activeProfile + ".properties";
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
InputStream inputStream = classloader.getResourceAsStream(filepath);
try {
InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");
properties.load(reader);
client_secret = new String(properties.getProperty("client_secret").getBytes("utf-8"), "utf-8");
client_id = properties.getProperty("client_id");
pubKey = properties.getProperty("pubKey");
username = properties.getProperty("username");
usercode = properties.getProperty("usercode");
pwd = properties.getProperty("pwd");
busi_center = properties.getProperty("busi_center");
dsname = properties.getProperty("dsname");
baseUrl = properties.getProperty("baseUrl");
requestBody = new String(properties.getProperty("requestBody").getBytes("utf-8"), "utf-8");
// apiUrl = properties.getProperty("apiUrl");
grant_type = properties.getProperty("grant_type");
secret_level = properties.getProperty("secret_level");
repeat_check = properties.getProperty("repeat_check");
busi_id = properties.getProperty("busi_id");
} catch (IOException e) {
e.printStackTrace();
}
}
private static String getToken() throws Exception {
String token = null;
if ("password".equals(grant_type)) {
// 密码模式
token = getTokenByPWD();
} else if ("client_credentials".equals(grant_type)) {
// // 客户端模式
// token = getTokenByClient();
} else if ("client".equals(grant_type)) {
token = getTokenByClient();
} else {
Assert.state(false, "token获取模式错误");
}
return token;
}
private static String getTokenByClient(String userCode) throws Exception {
Map<String, String> paramMap = new HashMap<String, String>();
// 密码模式认证
paramMap.put("grant_type", "client_credentials");
// 第三方应用id
paramMap.put("client_id", client_id);
// 第三方应用secret 公钥加密
String secret_entryption = Encryption.pubEncrypt(pubKey, client_secret);
// System.out.println("secret_entryption" + secret_entryption);
paramMap.put("client_secret", URLEncoder.encode(secret_entryption, "utf-8"));
// 账套编码
paramMap.put("biz_center", busi_center);
paramMap.put("usercode", userCode);
// 签名
String sign = SHA256Util.getSHA256(client_id + client_secret + pubKey, pubKey);
paramMap.put("signature", sign);
// System.out.println("##gettoken sign::" + sign);
String url = baseUrl + "/biploud/opm/accesstoken";
String mediaType = "application/x-www-form-urlencoded";
String token = doPost(url, paramMap, mediaType, null, "");
return token;
}
private static String getTokenByPWD() throws Exception {
Map<String, String> paramMap = new HashMap<String, String>();
// 密码模式认证
private String getTokenByPWD() throws Exception {
Map<String, String> paramMap = new HashMap<>();
paramMap.put("grant_type", "password");
// 第三方应用id
paramMap.put("client_id", client_id);
// 第三方应用secret 公钥加密
paramMap.put("client_secret", URLEncoder.encode(Encryption.pubEncrypt(pubKey, client_secret), "utf-8"));
// paramMap.put("client_secret", client_secret);
// bip用户名
paramMap.put("username", username);
// 密码 公钥加密
paramMap.put("password", URLEncoder.encode(Encryption.pubEncrypt(pubKey, pwd), "utf-8"));
// paramMap.put("password", pwd);
// 账套编码
paramMap.put("biz_center", busi_center);
// 签名
String sign = SHA256Util.getSHA256(client_id + client_secret + username + pwd + pubKey, pubKey);
// System.out.println("sign_getToken::" + sign);
paramMap.put("client_secret", URLEncoder.encode(Encryption.pubEncrypt(pubKey, client_secret), "UTF-8"));
paramMap.put("username", user_name);
paramMap.put("password", URLEncoder.encode(Encryption.pubEncrypt(pubKey, pwd), "UTF-8"));
paramMap.put("biz_center", biz_center);
String sign = SHA256Util.getSHA256(String.valueOf(client_id) + client_secret + user_name + pwd + pubKey, pubKey);
paramMap.put("signature", sign);
String url = baseUrl + "/biploud/opm/accesstoken";
String url = String.valueOf(baseUrl) + "nccloud/opm/accesstoken";
String mediaType = "application/x-www-form-urlencoded";
String token = doPost(url, paramMap, mediaType, null, "");
return token;
}
private static String doPost(String baseUrl, Map<String, String> paramMap, String mediaType,
Map<String, String> headers, String json) throws Exception {
public String getTokenByClient() throws Exception {
Map<String, String> paramMap = new HashMap<>();
paramMap.put("grant_type", "client_credentials");
paramMap.put("client_id", client_id);
paramMap.put("client_secret", URLEncoder.encode(Encryption.pubEncrypt(pubKey, client_secret), "UTF-8"));
paramMap.put("biz_center", biz_center);
String sign = SHA256Util.getSHA256(String.valueOf(client_id) + client_secret + pubKey, pubKey);
paramMap.put("signature", sign);
String url = String.valueOf("http://" + ip + ":" + port + "/") + "nccloud/opm/accesstoken";
String mediaType = "application/x-www-form-urlencoded";
String token = doPost(url, paramMap, mediaType, null, "");
return token;
}
private String doPost(String baseUrl, Map<String, String> paramMap, String mediaType, Map<String, String> headers, String json) throws Exception {
HttpURLConnection urlConnection = null;
InputStream in = null;
OutputStream out = null;
@ -195,11 +121,10 @@ public class IBipApiServiceImpl implements IBipApiService {
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
sb.append(key + "=" + value).append("&");
sb.append(String.valueOf(key) + "=" + value).append("&");
}
baseUrl = sb.toString().substring(0, sb.toString().length() - 1);
}
URL urlObj = new URL(baseUrl);
urlConnection = (HttpURLConnection) urlObj.openConnection();
urlConnection.setConnectTimeout(50000);
@ -214,16 +139,15 @@ public class IBipApiServiceImpl implements IBipApiService {
}
}
out = urlConnection.getOutputStream();
out.write(json.getBytes("utf-8"));
out.write(json.getBytes("UTF-8"));
out.flush();
int resCode = urlConnection.getResponseCode();
// System.out.println("状态码::" + resCode);
// if (resCode == HttpURLConnection.HTTP_OK || resCode == HttpURLConnection.HTTP_CREATED || resCode == HttpURLConnection.HTTP_ACCEPTED) {
if (resCode == 200 || resCode == 201 || resCode == 202) {
in = urlConnection.getInputStream();
// } else {
// in = urlConnection.getErrorStream();
// }
bufferedReader = new BufferedReader(new InputStreamReader(in, "utf-8"));
} else {
in = urlConnection.getErrorStream();
}
bufferedReader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
StringBuffer temp = new StringBuffer();
String line = bufferedReader.readLine();
while (line != null) {
@ -232,33 +156,31 @@ public class IBipApiServiceImpl implements IBipApiService {
}
String ecod = urlConnection.getContentEncoding();
if (ecod == null) {
ecod = Charset.forName("utf-8").name();
ecod = Charset.forName("UTF-8").name();
}
result = new String(temp.toString().getBytes("utf-8"), ecod);
// System.out.println(result);
result = new String(temp.toString().getBytes("UTF-8"), ecod);
} catch (Exception e) {
System.out.println(e);
throw e;
} finally {
if (null != bufferedReader) {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
throw e;
}
}
if (null != out) {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
throw e;
}
}
if (null != in) {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
throw e;
}
}
urlConnection.disconnect();
@ -266,123 +188,17 @@ public class IBipApiServiceImpl implements IBipApiService {
return result;
}
private String sendApi(String token, String apiUrl, String putParameter) throws Exception {
// token转对象获取api访问所用token和secret
ResultMessageUtil returnData = new Gson().fromJson(token, ResultMessageUtil.class);
Map<String, Object> data = (Map<String, Object>) returnData.getData();
String access_token = (String) data.get("access_token");
String security_key = (String) data.get("security_key");
String refresh_token = (String) data.get("refresh_token");
long expire_in = new Double((double) data.get("expires_in")).longValue();
long ts = new Double((double) data.get("ts")).longValue();
if (ts + expire_in < System.currentTimeMillis()) {
token = getTokenByPWD();
returnData = new Gson().fromJson(token, ResultMessageUtil.class);
data = (Map<String, Object>) returnData.getData();
access_token = (String) data.get("access_token");
security_key = (String) data.get("security_key");
refresh_token = (String) data.get("refresh_token");
}
// System.out.println("ACCESS_TOKEN:" + access_token);
// 请求路径
String url = apiUrl;
// header 参数
Map<String, String> headermap = new HashMap<>();
headermap.put("access_token", access_token);
headermap.put("client_id", client_id);
StringBuffer sb = new StringBuffer();
sb.append(client_id);
if (StringUtils.isNotBlank(putParameter)) {
// sb.append(requestBody.replaceAll("\\s*|\t|\r|\n", "").trim());
sb.append(putParameter);
}
sb.append(pubKey);
String sign = SHA256Util.getSHA256(sb.toString(), pubKey);
headermap.put("signature", sign);
if (StringUtils.isNotBlank(busi_id)) {
headermap.put("busi_id", busi_id);
}
if (StringUtils.isNotBlank(repeat_check)) {
headermap.put("repeat_check", repeat_check);
}
// headermap.put("ucg_flag", "y");
String mediaType = "application/json;charset=utf-8";
// 表体数据json
// 根据安全级别选择加密或压缩请求表体参数
String json = dealRequestBody(putParameter, security_key, secret_level);
// 返回值
String result = doPost(url, null, mediaType, headermap, json);
String result2 = dealResponseBody(result, security_key, secret_level);
// System.out.println("【RESULT】:" + result);
// System.out.println("result解密:" + result2);
return result2;
}
private static String dealRequestBody(String source, String security_key, String level) throws Exception {
String result = null;
if (StringUtils.isEmpty(level) || SecretConst.LEVEL0.equals(level)) {
result = source;
} else if (SecretConst.LEVEL1.equals(level)) {
result = Encryption.symEncrypt(security_key, source);
} else if (SecretConst.LEVEL2.equals(level)) {
result = CompressUtil.gzipCompress(source);
} else if (SecretConst.LEVEL3.equals(level)) {
result = Encryption.symEncrypt(security_key, CompressUtil.gzipCompress(source));
} else if (SecretConst.LEVEL4.equals(level)) {
result = CompressUtil.gzipCompress(Encryption.symEncrypt(security_key, source));
} else {
throw new Exception("无效的安全等级");
}
return result;
}
private static String dealResponseBody(String source, String security_key, String level) throws Exception {
String result = null;
if (StringUtils.isEmpty(level) || SecretConst.LEVEL0.equals(level)) {
result = source;
} else if (SecretConst.LEVEL1.equals(level)) {
result = Decryption.symDecrypt(security_key, source);
} else if (SecretConst.LEVEL2.equals(level)) {
result = CompressUtil.gzipDecompress(source);
} else if (SecretConst.LEVEL3.equals(level)) {
result = CompressUtil.gzipDecompress(Decryption.symDecrypt(security_key, source));
} else if (SecretConst.LEVEL4.equals(level)) {
result = Decryption.symDecrypt(security_key, CompressUtil.gzipDecompress(source));
} else {
throw new Exception("无效的安全等级");
}
return result;
}
class SecretConst {
/**
* LEVEL0 不压缩不加密
*/
public static final String LEVEL0 = "L0";
/**
* LEVEL1 只加密不压缩
*/
public static final String LEVEL1 = "L1";
/**
* LEVEL2 只压缩不加密
*/
public static final String LEVEL2 = "L2";
/**
* LEVEL3 先压缩后加密
*/
public static final String LEVEL3 = "L3";
/**
* LEVEL4 先加密后压缩
*/
public static final String LEVEL4 = "L4";
// public void init(String ip, String port, String biz_center, String client_id, String client_secret, String pubKey, String user_name, String pwd) {
public void init() {
baseUrl = "http://" + ip + ":" + port + "/";
biz_center = biz_center;
client_id = client_id;
client_secret = client_secret;
pubKey = pubKey;
user_name = user_name;
pwd = pwd;
}
}

View File

@ -50,6 +50,18 @@ datasource: COCOCS
client_secret: d18726dcc8ad487facdc
pubKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAur9ViNXdgV9qTxoKuLRhXqhKcQ1A4Vl6AqM8me0W5iXSCW49X2jSdnp3kEL5CqiINqPoqwQjFSdBCDrYotvp8nmIW1iifpR+IRteDWmJ6H/bHOarZYCDz3rkYYqe6UOzjWnlx0xq3VPjRyJ51z/bL26c0GiQK6sLS9k960kfv3JwmyT1DFQzXTcRExqSAqDawyvwYfjmbwF8SX50CzIz5eXfVTsQhEZBcd6EIKJL37uo+7mBJ6QLpjLyXio51CdJoLRXmPfRrmY29yyTwLIDV0ujOM0u7SPOK+loXesNnSS9Qjwg9B++GZzZdg0smVd/MS0dVLnr541RzGuaK7GuFwIDAQAB
secret_level: L0
BIP:
ip: 172.16.10.252
port: 8089
biz_center: 01
client_id: XOne
client_secret: 99e0dc95c94a4b08b511
user_name: XONE
pwd: xone123.
pubKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxdybRO4Um/tqdXfmZaR0GlPP+RsWgEWCp15T+4Y5BN7xW91gUoFqXwgyQRvHqEodIdjMJ8PtbcLnfTz2MmFx2zavwnaI+2QE09cOXUUV196hvyBISq4v2tXuUWdJ/9bRE1oIv69tfe2x2eo5FMyUIZ1z8ko3pwlULIUpSbyjozzfvItD7pG5RwFCrgJQJYy9zPi4VmGb1Cx74+VdYj8K6ZK6LErN9LQ/FOeS03vyMh12hAQbZjsuHzKIONnkTovqXI4Z5sSQ8RvInajHAp8+9pYV+KWIrTWcrEI/Ha+VGjUSZDqOeuReCI3IEf6thStVtVOXoxHB/WVWocTtiZf9FwIDAQAB
busi_center: develop
## 服务器地址
baseUrl: http://115.238.74.170:8089/