提交内容:整体代码更新

备注:整体代码更新
提交人:邹江涛
This commit is contained in:
zoujiangtao 2025-01-20 10:29:25 +08:00
parent 7c4761107f
commit 9ed5afc85b
5 changed files with 177 additions and 117 deletions

View File

@ -71,21 +71,26 @@ import java.util.stream.Collectors;
*/ */
public class ApiService { public class ApiService {
private static final Log logger = LogFactory.getLog(ApiService.class); private static final Log logger = LogFactory.getLog(ApiService.class);
private static final String APP_KEY = "22564a240d3140d0b15582aca71a748c";
// BIP测试环境AppKey
// private static final String APP_KEY = "22564a240d3140d0b15582aca71a748c";
// BIP生产环境AppKey
// private static final String APP_KEY = "e9ac4d8b14ea48c887634289cc5ca828";
private static final String API_ENDPOINT = "/iuap-api-auth/open-auth/selfAppAuth/getAccessToken"; private static final String API_ENDPOINT = "/iuap-api-auth/open-auth/selfAppAuth/getAccessToken";
private static final RestTemplate restTemplate = new RestTemplate(); private static final RestTemplate restTemplate = new RestTemplate();
public static String getBIPToken(String domainName) { public static String getBIPToken(String domainName, String appKey, String appSecret) {
String token = "获取失败"; String token = "获取失败";
try { try {
String timestamp = Long.toString(System.currentTimeMillis()); String timestamp = Long.toString(System.currentTimeMillis());
String signature = generateSignature("appKey" + APP_KEY + "timestamp" + timestamp); String signature = generateSignature("appKey" + appKey + "timestamp" + timestamp, appSecret);
logger.info("getBIPToken → 签名: {}", signature); logger.info("getBIPToken → 签名: {}", signature);
// URL with parameters // URL with parameters
String urlString = String.format( String urlString = String.format(
domainName + API_ENDPOINT + "?appKey=%s&timestamp=%s&signature=%s", domainName + API_ENDPOINT + "?appKey=%s&timestamp=%s&signature=%s",
APP_KEY, timestamp, signature appKey, timestamp, signature
); );
URL url = new URL(urlString); URL url = new URL(urlString);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
@ -158,10 +163,10 @@ public class ApiService {
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
} }
private static String generateSignature(String toSign) { private static String generateSignature(String toSign, String appSecret) {
try { try {
// 计算 HmacSHA256 签名 // 计算 HmacSHA256 签名
byte[] hmacData = computeHmacSha256(toSign); byte[] hmacData = computeHmacSha256(toSign, appSecret);
// Base64 编码 // Base64 编码
String base64Encoded = Base64.getEncoder().encodeToString(hmacData); String base64Encoded = Base64.getEncoder().encodeToString(hmacData);
@ -174,8 +179,12 @@ public class ApiService {
} }
} }
private static byte[] computeHmacSha256(String data) throws Exception { private static byte[] computeHmacSha256(String data, String appSecret) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec("79f0b7daa428c1abd9272565dbc65486ab565c80".getBytes(StandardCharsets.UTF_8), "HmacSHA256"); // BIP测试环境appSecret
// SecretKeySpec secretKey = new SecretKeySpec("79f0b7daa428c1abd9272565dbc65486ab565c80".getBytes(StandardCharsets.UTF_8), "HmacSHA256");
// BIP生产环境appSecret
SecretKeySpec secretKey = new SecretKeySpec(appSecret.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256"); Mac mac = Mac.getInstance("HmacSHA256");
mac.init(secretKey); mac.init(secretKey);
return mac.doFinal(data.getBytes(StandardCharsets.UTF_8)); return mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
@ -194,7 +203,7 @@ public class ApiService {
String billMark = dynamic.getDataEntityType().getName(); String billMark = dynamic.getDataEntityType().getName();
DynamicObject[] objects = BusinessDataServiceHelper.load("shkd_apimapping", "id,billno," + DynamicObject[] objects = BusinessDataServiceHelper.load("shkd_apimapping", "id,billno," +
"shkd_name,shkd_sourcenumber,shkd_domainname,shkd_token,shkd_url,shkd_bodytype," + "shkd_name,shkd_sourcenumber,shkd_domainname,shkd_appkey,shkd_appsecret,shkd_token,shkd_url,shkd_bodytype," +
"shkd_sourcebill,shkd_targetsystem,entryentity,entryentity.shkd_tarfield,entryentity.shkd_tartier," + "shkd_sourcebill,shkd_targetsystem,entryentity,entryentity.shkd_tarfield,entryentity.shkd_tartier," +
"entryentity.shkd_tartype,entryentity.shkd_parentfield,entryentity.shkd_soufield,entryentity.shkd_defaultdata," + "entryentity.shkd_tartype,entryentity.shkd_parentfield,entryentity.shkd_soufield,entryentity.shkd_defaultdata," +
"entryentity.shkd_required,entryentity.shkd_remarks,shkd_submiturl", "entryentity.shkd_required,entryentity.shkd_remarks,shkd_submiturl",
@ -204,7 +213,9 @@ public class ApiService {
// 获取token // 获取token
String domainName = objects[0].getString("shkd_domainname"); String domainName = objects[0].getString("shkd_domainname");
String token = ApiService.getBIPToken(domainName); String appKey = objects[0].getString("shkd_appkey");
String appSecret = objects[0].getString("shkd_appsecret");
String token = ApiService.getBIPToken(domainName, appKey, appSecret);
logger.info("获取token{}", token); logger.info("获取token{}", token);
String saveUrl = objects[0].getString("shkd_url"); String saveUrl = objects[0].getString("shkd_url");

View File

@ -1,46 +1,30 @@
package shkd.sys.sys.plugin.CA; package shkd.sys.sys.plugin.CA;
import cn.com.infosec.netsign.agent.NetSignAgent; import com.alibaba.fastjson.JSON;
import cn.com.infosec.netsign.agent.NetSignResult; import com.alibaba.fastjson.JSONObject;
import java.io.InputStream;
import java.security.cert.X509Certificate;
import java.util.Map;
import java.util.Properties;
import kd.bos.ca.bean.VerifySignResult;
import kd.bos.dataentity.serialization.SerializationUtils;
import kd.bos.ca.AbstractCAService; import kd.bos.ca.AbstractCAService;
import kd.bos.ca.bean.VerifySignResult;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.logging.Log; import kd.bos.logging.Log;
import kd.bos.logging.LogFactory; import kd.bos.logging.LogFactory;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.user.UserServiceHelper;
import okhttp3.*;
import java.io.IOException;
import java.util.Map;
/** /**
* @description: CA服务 * @description: CA服务
**/ **/
public class InfoSecService extends AbstractCAService { public class InfoSecService extends AbstractCAService {
private static Log log = LogFactory.getLog(InfoSecService.class); private static Log log = LogFactory.getLog(InfoSecService.class);
private static Properties properties;
private static boolean isInitialize; private static boolean isInitialize;
static { private static final OkHttpClient client = new OkHttpClient();
initProperties();
}
/**
* 初始化
*/
private static void initProperties() {
if (properties == null) {
try (InputStream in = InfoSecService.class.getResourceAsStream("/resources/InfoSecConfig.properties")) {
properties = new Properties();
properties.load(in);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("信安世纪服务配置文件初始化失败:" + e.getMessage());
}
}
}
/** /**
* @param signData 签名信息 * @param signData 签名信息
@ -52,29 +36,70 @@ public class InfoSecService extends AbstractCAService {
@Override @Override
public VerifySignResult verifySign(String signData, String cleartext, String publicKey, Map<String, Object> caConfig) { public VerifySignResult verifySign(String signData, String cleartext, String publicKey, Map<String, Object> caConfig) {
log.info("验签开始"); log.info("验签开始");
log.info("验签参数:\nsignData{}\ncleartext{}\npublicKey{}\ncaConfig{}", signData, cleartext, publicKey, caConfig);
VerifySignResult result = new VerifySignResult(); VerifySignResult result = new VerifySignResult();
try {
/**
* 虽然能获取到苍穹系统上的配置并构造ResourceBundle对象但是信安世纪的服务只能初始化一次感觉有点坑
* 服务只能初始化一次再次调用NetSignAgent.initialize不会生效所以修改配置后只能重启服务
*/
if (!isInitialize) {
properties.putAll(caConfig);
InfoSecResourceBundle resourceBundle = new InfoSecResourceBundle(properties);
NetSignAgent.initialize(resourceBundle);
isInitialize = Boolean.TRUE;
}
X509Certificate certificate = NetSignAgent.generateCertificate(publicKey.getBytes()); long userId = UserServiceHelper.getCurrentUserId();//获取当前登录对象的Id
NetSignResult netSignResult = NetSignAgent.rawVerify(cleartext.getBytes(), signData, "SHA1", null, certificate); DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(userId, "bos_user");
log.info(SerializationUtils.toJsonString(netSignResult)); DynamicObject[] objects = BusinessDataServiceHelper.load("bd_usercredentials", "id,number,publickey,uname", new QFilter("uname", QCP.equals, dynamicObject.getString("name")).toArray());
if (objects.length == 0) {
result.setSuccess(false);
result.setMessage("验签失败。");
return result;
} else {
String puKey = objects[0].getString("publickey");
if (publicKey.equals(puKey)) {
try {
String response = verifyPkcs7(cleartext, signData, "" + System.currentTimeMillis());
JSONObject jsonObject = JSON.parseObject(response);
String code = jsonObject.getString("code");
if ("200".equals(code)) {
result.setSuccess(true); result.setSuccess(true);
result.setMessage("验签通过。"); result.setMessage("验签通过。");
} else {
result.setSuccess(false);
result.setMessage("验签失败。");
}
log.info("验签响应: " + response);
} catch (Exception e) { } catch (Exception e) {
log.error(e); log.error(e);
result.setSuccess(false); result.setSuccess(false);
result.setMessage("验签失败:" + e.getMessage()); result.setMessage("验签失败:" + e.getMessage());
} }
return result; return result;
} else {
result.setSuccess(false);
result.setMessage("验签失败,签名人员和验签人员不同");
log.info("验签失败,签名人员和验签人员不同");
return result;
}
}
}
private String verifyPkcs7(String toSign, String signedData, String reqId) throws IOException {
RequestBody formBody = new FormBody.Builder()
.add("projectId", "CTJD")
.add("toSign", toSign)
.add("signedData", signedData)
.add("version", "1")
.add("opType", "验签")
.add("reqId", reqId)
.build();
log.info("POST请求开始请求参数{}", formBody);
Request request = new Request.Builder()
.url("http://10.1.6.123:8080/sign-gw/api/signature/verifyPkcs7")
.post(formBody)
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
return response.body().string();
} else {
log.error("POST请求未成功响应码: " + response.code());
return "POST请求未成功";
}
}
} }
} }

View File

@ -75,6 +75,7 @@ public class PayBillApiSavePlugin implements ApiSavePlugin {
map.put("payeeformid", "other"); map.put("payeeformid", "other");
} }
// 如果为供应商或者客户
if ("bd_supplier".equals(payeetype) || "bd_customer".equals(payeetype)) { if ("bd_supplier".equals(payeetype) || "bd_customer".equals(payeetype)) {
logger.info("收款人ID{}", map.get("payeenumber")); logger.info("收款人ID{}", map.get("payeenumber"));
DynamicObject[] objects = BusinessDataServiceHelper.load(payeetype.toString(), "id,number,name,societycreditcode", new QFilter("societycreditcode", QCP.equals, map.get("payeenumber").toString()).toArray()); DynamicObject[] objects = BusinessDataServiceHelper.load(payeetype.toString(), "id,number,name,societycreditcode", new QFilter("societycreditcode", QCP.equals, map.get("payeenumber").toString()).toArray());
@ -86,6 +87,16 @@ public class PayBillApiSavePlugin implements ApiSavePlugin {
//收款人编码 //收款人编码
objectNumber = map.get("payeenumber").toString(); objectNumber = map.get("payeenumber").toString();
} }
} else if ("bos_user".equals(payeetype)) {
DynamicObject[] objects = BusinessDataServiceHelper.load(payeetype.toString(), "id,number,username", new QFilter("username", QCP.equals, map.get("payeenumber").toString()).toArray());
if (objects.length > 0) {
map.put("payeenumber", objects[0].getString("number"));
//收款人编码
objectNumber = objects[0].getString("number");
} else {
//收款人编码
objectNumber = map.get("payeenumber").toString();
}
} else { } else {
//收款人编码 //收款人编码
objectNumber = map.get("payeenumber").toString(); objectNumber = map.get("payeenumber").toString();

View File

@ -64,62 +64,10 @@ public class ApiMappingBillPlugin extends AbstractFormPlugin implements Plugin {
} }
DynamicObject dataEntity = this.getModel().getDataEntity(true); DynamicObject dataEntity = this.getModel().getDataEntity(true);
// 获取想要推送单据编码
String billNumber = dataEntity.getString("shkd_sourcenumber");
logger.info("获取推送单据编码 → billNumber{}", billNumber);
// 获取想要推送单据类型
String billMark = dataEntity.getDynamicObject("shkd_sourcebill").getString("number");
logger.info("获取推送单据类型 → billMark{}", billMark);
DynamicObject billObject;
switch (billMark) {
// 付款处理
case "cas_paybill":
DynamicObject[] objects1 = BusinessDataServiceHelper.load("cas_paybill",
"id,billno,actpayamt,entry,entry.e_expenseitem,entry.e_remark,settletype,payeebanknum," +
"payeetype,payeenumber,payeracctbank,payeebank,payeebankname,paymenttype,org,bizdate,description," +
"shkd_pushstatus,shkd_businessnumber,shkd_businessid,shkd_businessname,billstatus,bankpaystatus"
, new QFilter("billno", QCP.equals, billNumber).toArray());
billObject = objects1[0];
logger.info("获取付款处理推送对象 → billObject{}", billObject);
break;
// 收款处理
case "cas_recbill":
DynamicObject[] objects2 = BusinessDataServiceHelper.load("cas_recbill",
"id,billno,entry,entry.e_expenseitem,settletype,entry.e_remark,receivingtype," +
"payertype,org,bizdate,accountbank,payernumber,actrecamt,txt_description,shkd_pushstatus," +
"shkd_businessnumber,shkd_businessid,shkd_businessname,billstatus"
, new QFilter("billno", QCP.equals, billNumber).toArray());
billObject = objects2[0];
logger.info("获取收款处理推送对象 → billObject{}", billObject);
break;
// 银企交易明细查询
case "bei_transdetail_cas":
DynamicObject[] objects3 = BusinessDataServiceHelper.load("bei_transdetail_cas",
"id,billno,bizdate,oppbank,oppunit,accountbank,description,company,oppbanknumber," +
"bankdetailno,transbalance,description,debitamount,creditamount,shkd_pushstatus," +
"shkd_businessnumber,shkd_businessid,shkd_businessname"
, new QFilter("billno", QCP.equals, billNumber).toArray());
billObject = objects3[0];
logger.info("获取银企交易明细查询推送对象 → billObject{}", billObject);
break;
// 电子回单查询
case "bei_elecreceipt":
DynamicObject[] objects4 = BusinessDataServiceHelper.load("bei_elecreceipt",
"id,billno,shkd_pushstatus,fileserverurl,bizdate,oppbankname,description,company,oppbanknumber," +
"detaildatetime,accountbank,amount,use,debitamount,creditamount,detailid,uploadfilename," +
"shkd_businessnumber,shkd_businessid,shkd_businessname,filepath"
, new QFilter("billno", QCP.equals, billNumber).toArray());
billObject = objects4[0];
logger.info("获取银企交易明细查询推送对象 → billObject{}", billObject);
break;
default:
return;
}
// 生成JSON // 生成JSON
if ("shkd_generatejson".equals(itemKey)) { if ("shkd_generatejson".equals(itemKey)) {
DynamicObject billObject = getDynamicObject(dataEntity);
if (billObject == null) { if (billObject == null) {
this.getView().showTipNotification("未查询到具体推送单据"); this.getView().showTipNotification("未查询到具体推送单据");
return; return;
@ -131,12 +79,14 @@ public class ApiMappingBillPlugin extends AbstractFormPlugin implements Plugin {
List<DynamicObject> dynamicObjects = new ArrayList<>(); List<DynamicObject> dynamicObjects = new ArrayList<>();
if ("shkd_testapi".equals(itemKey)) { if ("shkd_testapi".equals(itemKey)) {
DynamicObject billObject = getDynamicObject(dataEntity);
String result = ApiService.paymentSlipsJson(billObject, "BIP", dynamicObjects, null); String result = ApiService.paymentSlipsJson(billObject, "BIP", dynamicObjects, null);
SaveServiceHelper.save(dynamicObjects.toArray(new DynamicObject[0])); SaveServiceHelper.save(dynamicObjects.toArray(new DynamicObject[0]));
this.getView().showTipNotification("返回结果:" + result); this.getView().showTipNotification("返回结果:" + result);
} }
if ("shkd_pushjson".equals(itemKey)) { if ("shkd_pushjson".equals(itemKey)) {
DynamicObject billObject = getDynamicObject(dataEntity);
String requestBody = codeEdit.getText(); String requestBody = codeEdit.getText();
String result = ApiService.paymentSlipsJson(billObject, "BIP", dynamicObjects, requestBody); String result = ApiService.paymentSlipsJson(billObject, "BIP", dynamicObjects, requestBody);
SaveServiceHelper.save(dynamicObjects.toArray(new DynamicObject[0])); SaveServiceHelper.save(dynamicObjects.toArray(new DynamicObject[0]));
@ -144,6 +94,7 @@ public class ApiMappingBillPlugin extends AbstractFormPlugin implements Plugin {
} }
if ("shkd_hitback".equals(itemKey)) { if ("shkd_hitback".equals(itemKey)) {
DynamicObject billObject = getDynamicObject(dataEntity);
String result = ApiService.paymentSlipsJson(billObject, "BIPNO", dynamicObjects, null); String result = ApiService.paymentSlipsJson(billObject, "BIPNO", dynamicObjects, null);
SaveServiceHelper.save(dynamicObjects.toArray(new DynamicObject[0])); SaveServiceHelper.save(dynamicObjects.toArray(new DynamicObject[0]));
this.getView().showTipNotification("返回结果:" + result); this.getView().showTipNotification("返回结果:" + result);
@ -152,7 +103,10 @@ public class ApiMappingBillPlugin extends AbstractFormPlugin implements Plugin {
if ("shkd_gettoken".equals(itemKey)) { if ("shkd_gettoken".equals(itemKey)) {
//域名 //域名
String domainName = dataEntity.getString("shkd_domainname"); String domainName = dataEntity.getString("shkd_domainname");
String token = ApiService.getBIPToken(domainName); String appKey = dataEntity.getString("shkd_appkey");
String appSecret = dataEntity.getString("shkd_appsecret");
String token = ApiService.getBIPToken(domainName, appKey, appSecret);
this.getModel().setValue("shkd_token", token); this.getModel().setValue("shkd_token", token);
} }
} }
@ -242,4 +196,63 @@ public class ApiMappingBillPlugin extends AbstractFormPlugin implements Plugin {
sb.append(" "); // 使用4个空格作为缩进 sb.append(" "); // 使用4个空格作为缩进
} }
} }
private DynamicObject getDynamicObject(DynamicObject dataEntity) {
// 获取想要推送单据编码
String billNumber = dataEntity.getString("shkd_sourcenumber");
logger.info("获取推送单据编码 → billNumber{}", billNumber);
// 获取想要推送单据类型
String billMark = dataEntity.getDynamicObject("shkd_sourcebill").getString("number");
logger.info("获取推送单据类型 → billMark{}", billMark);
DynamicObject billObject;
switch (billMark) {
// 付款处理
case "cas_paybill":
DynamicObject[] objects1 = BusinessDataServiceHelper.load("cas_paybill",
"id,billno,actpayamt,entry,entry.e_expenseitem,entry.e_remark,settletype,payeebanknum," +
"payeetype,payeenumber,payeracctbank,payeebank,payeebankname,paymenttype,org,bizdate,description," +
"shkd_pushstatus,shkd_businessnumber,shkd_businessid,shkd_businessname,billstatus,bankpaystatus"
, new QFilter("billno", QCP.equals, billNumber).toArray());
billObject = objects1[0];
logger.info("获取付款处理推送对象 → billObject{}", billObject);
break;
// 收款处理
case "cas_recbill":
DynamicObject[] objects2 = BusinessDataServiceHelper.load("cas_recbill",
"id,billno,entry,entry.e_expenseitem,settletype,entry.e_remark,receivingtype," +
"payertype,org,bizdate,accountbank,payernumber,actrecamt,txt_description,shkd_pushstatus," +
"shkd_businessnumber,shkd_businessid,shkd_businessname,billstatus"
, new QFilter("billno", QCP.equals, billNumber).toArray());
billObject = objects2[0];
logger.info("获取收款处理推送对象 → billObject{}", billObject);
break;
// 银企交易明细查询
case "bei_transdetail_cas":
DynamicObject[] objects3 = BusinessDataServiceHelper.load("bei_transdetail_cas",
"id,billno,bizdate,oppbank,oppunit,accountbank,description,company,oppbanknumber," +
"bankdetailno,transbalance,description,debitamount,creditamount,shkd_pushstatus," +
"shkd_businessnumber,shkd_businessid,shkd_businessname"
, new QFilter("billno", QCP.equals, billNumber).toArray());
billObject = objects3[0];
logger.info("获取银企交易明细查询推送对象 → billObject{}", billObject);
break;
// 电子回单查询
case "bei_elecreceipt":
DynamicObject[] objects4 = BusinessDataServiceHelper.load("bei_elecreceipt",
"id,billno,shkd_pushstatus,fileserverurl,bizdate,oppbankname,description,company,oppbanknumber," +
"detaildatetime,accountbank,amount,use,debitamount,creditamount,detailid,uploadfilename," +
"shkd_businessnumber,shkd_businessid,shkd_businessname,filepath"
, new QFilter("billno", QCP.equals, billNumber).toArray());
billObject = objects4[0];
logger.info("获取银企交易明细查询推送对象 → billObject{}", billObject);
break;
default:
billObject = null;
}
return billObject;
}
} }

View File

@ -32,9 +32,9 @@ public class ApiTestBillPlugin extends AbstractBillPlugIn implements Plugin {
String key = evt.getItemKey(); String key = evt.getItemKey();
if ("shkd_token".equals(key)) { if ("shkd_token".equals(key)) {
String url = this.getModel().getValue("shkd_url").toString(); // String url = this.getModel().getValue("shkd_url").toString();
String token = ApiService.getBIPToken(url); // String token = ApiService.getBIPToken(url);
this.getView().showTipNotification(token == null ? "获取token为空" :token); // this.getView().showTipNotification(token == null ? "获取token为空" :token);
} }
if ("shkd_api".equals(key)) { if ("shkd_api".equals(key)) {