更换 公密钥

This commit is contained in:
Jack 2025-12-20 00:10:48 +08:00
parent 7c3e025d76
commit d2746dc5b6
5 changed files with 70 additions and 14 deletions

View File

@ -11,6 +11,7 @@ package com.suisung.mall.common.utils;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.suisung.mall.common.exception.ApiException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.http.*; import org.springframework.http.*;
@ -250,6 +251,44 @@ public class RestTemplateHttpUtil {
} }
} }
/**
* 发送拉卡拉的POST请求并处理异常原样返回
*
* @param url 请求URL
* @param headers 请求头
* @param requestBody 请求体
* @param responseType 响应类型
* @param <T> 泛型类型
* @return ResponseEntity<T>
*/
public static <T> JSONObject sendLklPostSrc(String url, JSONObject headers, JSONObject requestBody, Class<T> responseType) {
// 使用 APPLICATION_JSON 作为默认 content-type
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
// 安全添加 headers
if (headers != null) {
headers.forEach((key, value) -> {
if (value != null) {
httpHeaders.add(key, value.toString());
}
});
}
HttpEntity<Object> entity = new HttpEntity<>(requestBody, httpHeaders);
try {
ResponseEntity<T> response = restTemplate.postForEntity(url, entity, responseType);
Object body = response.getBody();
return (body instanceof JSONObject) ? (JSONObject) body : JSONUtil.parseObj(body);
} catch (Exception e) {
log.error("Unexpected error occurred while calling LKL API: {}", e.getMessage(), e);
new ApiException("Unexpected error occurred while calling LKL API");
}
return null;
}
/** /**
* 在JSONObject中查找第一个非空值 * 在JSONObject中查找第一个非空值
* *

View File

@ -14,6 +14,7 @@ import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.service.impl.BaseControllerImpl; import com.suisung.mall.common.service.impl.BaseControllerImpl;
import com.suisung.mall.shop.lakala.service.LakalaApiService; import com.suisung.mall.shop.lakala.service.LakalaApiService;
import com.suisung.mall.shop.lakala.service.LklLedgerEcService; import com.suisung.mall.shop.lakala.service.LklLedgerEcService;
import com.suisung.mall.shop.lakala.service.impl.LklTkServiceImpl;
import com.suisung.mall.shop.library.service.LibraryProductService; import com.suisung.mall.shop.library.service.LibraryProductService;
import com.suisung.mall.shop.message.service.MqMessageService; import com.suisung.mall.shop.message.service.MqMessageService;
import com.suisung.mall.shop.message.service.PushMessageService; import com.suisung.mall.shop.message.service.PushMessageService;
@ -80,9 +81,13 @@ public class LakalaController extends BaseControllerImpl {
@Resource @Resource
private ShopStorePrinterService shopStorePrinterService; private ShopStorePrinterService shopStorePrinterService;
@Lazy
@Resource @Resource
private LklLedgerEcService lklLedgerEcService; private LklLedgerEcService lklLedgerEcService;
@Resource
private LklTkServiceImpl lklTkService;
@ApiOperation(value = "测试案例", notes = "测试案例") @ApiOperation(value = "测试案例", notes = "测试案例")
@RequestMapping(value = "/testcase", method = RequestMethod.POST) @RequestMapping(value = "/testcase", method = RequestMethod.POST)
@ -94,7 +99,8 @@ public class LakalaController extends BaseControllerImpl {
// return lakalaApiService.tradeQuery(paramsJSON.getInt("storeId"), paramsJSON.getStr("orderId")); // return lakalaApiService.tradeQuery(paramsJSON.getInt("storeId"), paramsJSON.getStr("orderId"));
return shopStorePrinterService.printShopStoreReturnOrder(paramsJSON.getStr("returnId")); return lklTkService.getLklShopId("8226330541100J8", "");
} }
@ApiOperation(value = "批量发送推送消息 - 测试案例", notes = "批量发送推送消息 - 测试案例") @ApiOperation(value = "批量发送推送消息 - 测试案例", notes = "批量发送推送消息 - 测试案例")

View File

@ -943,7 +943,7 @@ public class LklTkServiceImpl {
// 发送请求 // 发送请求
String urlPath = "/htkmerchants/open/merchant/addTerm"; String urlPath = "/htkmerchants/open/merchant/addTerm";
JSONObject response = RestTemplateHttpUtil.sendLklPost( JSONObject response = RestTemplateHttpUtil.sendLklPostSrc(
buildLklTkUrl(urlPath), header, requestBody, JSONObject.class); buildLklTkUrl(urlPath), header, requestBody, JSONObject.class);
// 检查响应结果 // 检查响应结果
@ -1001,9 +1001,12 @@ public class LklTkServiceImpl {
logger.error("获取拉卡拉私钥失败apiPriKeyPath={}", apiPriKeyPath); logger.error("获取拉卡拉私钥失败apiPriKeyPath={}", apiPriKeyPath);
return null; return null;
} }
// logger.info("api 私钥:{}", privateKey);
logger.info("请求明文参数:{}", requestParams);
String encryptedParams = LakalaUtil.encryptByPrivateKey(requestParams.toString(), privateKey); String encryptedParams = LakalaUtil.encryptByPrivateKey(requestParams.toString(), privateKey);
logger.debug("请求参数加密完成"); // logger.debug("请求参数加密完成");
// 获取认证信息 // 获取认证信息
String authorization = getLklTkAuthorization(); String authorization = getLklTkAuthorization();
@ -1013,13 +1016,19 @@ public class LklTkServiceImpl {
} }
// 构造请求头和请求体 // 构造请求头和请求体
String urlPath = buildLklTkUrl("/htkmerchants/open/merchant/info");
JSONObject header = new JSONObject().set("Authorization", authorization); JSONObject header = new JSONObject().set("Authorization", authorization);
JSONObject requestBody = new JSONObject().set("data", encryptedParams); JSONObject requestBody = new JSONObject().set("data", encryptedParams);
logger.info("请求地址:{}", urlPath);
logger.info("请求头:{}", header);
logger.info("请求加密参数:{}", requestBody);
// 发送请求 // 发送请求
String urlPath = "/htkmerchants/open/merchant/info";
JSONObject response = RestTemplateHttpUtil.sendLklPost( JSONObject response = RestTemplateHttpUtil.sendLklPostSrc(
buildLklTkUrl(urlPath), header, requestBody, JSONObject.class); urlPath, header, requestBody, JSONObject.class);
// 检查响应结果 // 检查响应结果
if (response == null || !"000000".equals(response.getStr("code")) || response.get("data") == null) { if (response == null || !"000000".equals(response.getStr("code")) || response.get("data") == null) {
@ -1035,7 +1044,7 @@ public class LklTkServiceImpl {
} }
String responseData = LakalaUtil.decryptByPublicKey(response.getStr("data"), publicKey); String responseData = LakalaUtil.decryptByPublicKey(response.getStr("data"), publicKey);
logger.debug("响应数据解密完成"); logger.info("响应数据解密完成: {}", responseData);
return JSONUtil.parseObj(responseData); return JSONUtil.parseObj(responseData);
@ -1053,7 +1062,7 @@ public class LklTkServiceImpl {
* @param customerNo 内部商户号备选 * @param customerNo 内部商户号备选
* @return 拉卡拉商户的shopId获取失败返回null * @return 拉卡拉商户的shopId获取失败返回null
*/ */
private Long getLklShopId(String externalCustomerNo, String customerNo) { public Long getLklShopId(String externalCustomerNo, String customerNo) {
logger.debug("开始获取拉卡拉商户shopIdexternalCustomerNo={}, customerNo={}", externalCustomerNo, customerNo); logger.debug("开始获取拉卡拉商户shopIdexternalCustomerNo={}, customerNo={}", externalCustomerNo, customerNo);
try { try {
@ -1064,10 +1073,12 @@ public class LklTkServiceImpl {
} }
// 检查响应中的code字段是否表示成功 // 检查响应中的code字段是否表示成功
if (!"000000".equals(response.getStr("code"))) { // if (!"000000".equals(response.getStr("code"))) {
logger.warn("拉卡拉商户信息获取失败code={}response={}", response.getStr("code"), response); // logger.warn("拉卡拉商户信息获取失败code={}response={}", response.getStr("code"), response);
return null; // return null;
} // }
logger.info("拉卡拉商户信息:{}", response);
// 检查shopInfoList是否存在且不为空 // 检查shopInfoList是否存在且不为空
JSONArray shopInfoList = response.getJSONArray("shopInfoList"); JSONArray shopInfoList = response.getJSONArray("shopInfoList");

View File

@ -1 +1 @@
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKnlpXdmJcbZHxh3w3Ghy/5wXtUBQcFzRMXgw2d7uYjzAzbIQ/ZCAj6srWoN/obtkU+G62kgcpByGmiVtK4LS+BoelKM705SzV+mcr8mNmr2jwNq1SwDSfgVxx5z00FtXl3LnKvCujvGYOmx6+nX8h6IiyyLX6IP6cFaqpUXHsZVAgMBAAECgYA4NpeM7etJ48T6H4Y3LsWEJkH6UDQlgbIblsaQkstMmLtTgOebrzN28UNfd8njcu9FVOrHGclOKbK7L+1cOLiduWsZKc/c/gAy9wAR4EhoLvlerH9EEPiPWFxdEDbMxPqlkpqLOo+PxHrhTn4vU4CaPdJtL2ujKn7nmsUdUDWo8QJBANS1TlM6nhPt2XlzN5kGfsJ4kBYNjuLXNA2YdNuC2ttYvEXHJ9T70FN/GnRBBIZu47uHH3Ie5nfep+qMk6a8RP8CQQDMecIyI0z1kVt+tOfWKw2ZFLsi74708qTaeR4W1ABtkngj1+bxoWWXr3KqhjqJkWxnhioSfXqu7CScNzjdM1CrAkAQd+ESjI1EmbumrYb2cAxMXi05p98SLPs4uj8B58WuCda5yEuLL9vXOxX/PjFtfxRepn2GxmGtki2J+UxNMnJdAkAFoORjlO0tZU7rcfdfwdeh+xwbnhSFUZiQGv1lC3jnizybX/oPdK3jOwUhBIjf+IzPXLYTxDh4UC/BzRNXo235AkEAhgYBk6H7RU2iIuvwz1c6CtE1gJ8DvEp1F0KOMWMFB0KCpDXUToix0dlMz962FozYENi4X4zYQo6nFwlXeS3Pfw== MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAI4dPEw5wEGxH9aN+5WwFazEDvhomT/FWX0yHQRMdL0CTi8dy0hIN1sdNEbBmcOKc6dw2XHQCVQS3hfFFvpmnUqLJi32RbMhzxYz8Li9zN45eNKhiUfm/LupucHeTm3axGfOT3dfi0uhgq9LHk7ku12Pe+JIYdDu8RMCNeLJ7/AJAgMBAAECgYBAJSgLS+HghN9XC50sMl+GLLSJIUVSyHQdE1qPjyb+DSVXFP6lcJsz0BnBei86WKrdQA2V1o3vWdjPJ9G4UkraJ3hz2elzEeYok+MpLiPRicUd9RNHTVp9YqTzFyAsuranMxwt07tQaZBGc0T6hiGEsSHShwA+FfLGmz0TacR7hQJBAMOjlnP6zEzjUiW0BoZDnLHR6B5EpVVwhN7gS1B0HZtkGOjuoMz8z/GBbKLniGUtoRTDqFE4MJe7iA7237DZvscCQQC59gcIU4ezoonbDvMPbr4GMCgjP2eVrXUD02qGLJlQ45Wla6FpFZvQH5Wno5qRjdU9+Kjwms4lTTLVPHHfh0qvAkEAj2O9CDCPwOLz+JJkHdA8btBskpK5o0+e80Ptr4ALmzLYVxFfZh79wgKcPyH4BEBXScLGARFv/CYE6QLknNhbTQJAZ+F5+DrBOaX4oHhvaxWP7WEFavtGYCSvk12MyjsrwjYAKJJBbrR1gAPE1Arek6TJlH7N0OqJcej4FopXimjHXQJBAIS5nqeJPd3J7ath+uge+itkQUJnrTDHe4Feinmenuh6YLcwVJwuGqtUqxUUW/6TCrxdlMdiFmBjBjr7lkhlnuc=

View File

@ -1 +1 @@
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp5aV3ZiXG2R8Yd8Nxocv+cF7VAUHBc0TF4MNne7mI8wM2yEP2QgI+rK1qDf6G7ZFPhutpIHKQchpolbSuC0vgaHpSjO9OUs1fpnK/JjZq9o8DatUsA0n4Fccec9NBbV5dy5yrwro7xmDpsevp1/IeiIssi1+iD+nBWqqVFx7GVQIDAQAB MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCOHTxMOcBBsR/WjfuVsBWsxA74aJk/xVl9Mh0ETHS9Ak4vHctISDdbHTRGwZnDinOncNlx0AlUEt4XxRb6Zp1KiyYt9kWzIc8WM/C4vczeOXjSoYlH5vy7qbnB3k5t2sRnzk93X4tLoYKvSx5O5Ltdj3viSGHQ7vETAjXiye/wCQIDAQAB