From d2746dc5b6d80e017fcfdf2f3b264dc83d1e96bf Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Sat, 20 Dec 2025 00:10:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=8D=A2=20=E5=85=AC=E5=AF=86?= =?UTF-8?q?=E9=92=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/utils/RestTemplateHttpUtil.java | 39 +++++++++++++++++++ .../controller/mobile/LakalaController.java | 8 +++- .../lakala/service/impl/LklTkServiceImpl.java | 33 ++++++++++------ .../payKey/lakala/prod/tk_api_private_key.txt | 2 +- .../payKey/lakala/prod/tk_api_public_key.txt | 2 +- 5 files changed, 70 insertions(+), 14 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/RestTemplateHttpUtil.java b/mall-common/src/main/java/com/suisung/mall/common/utils/RestTemplateHttpUtil.java index de99feb6..e3539972 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/utils/RestTemplateHttpUtil.java +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/RestTemplateHttpUtil.java @@ -11,6 +11,7 @@ package com.suisung.mall.common.utils; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; +import com.suisung.mall.common.exception.ApiException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.*; @@ -250,6 +251,44 @@ public class RestTemplateHttpUtil { } } + /** + * 发送拉卡拉的POST请求并处理异常,原样返回 + * + * @param url 请求URL + * @param headers 请求头 + * @param requestBody 请求体 + * @param responseType 响应类型 + * @param 泛型类型 + * @return ResponseEntity + */ + public static JSONObject sendLklPostSrc(String url, JSONObject headers, JSONObject requestBody, Class 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 entity = new HttpEntity<>(requestBody, httpHeaders); + + try { + ResponseEntity 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中查找第一个非空值 * diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/mobile/LakalaController.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/mobile/LakalaController.java index 984bf952..4df37850 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/mobile/LakalaController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/mobile/LakalaController.java @@ -14,6 +14,7 @@ import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.service.impl.BaseControllerImpl; import com.suisung.mall.shop.lakala.service.LakalaApiService; 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.message.service.MqMessageService; import com.suisung.mall.shop.message.service.PushMessageService; @@ -80,9 +81,13 @@ public class LakalaController extends BaseControllerImpl { @Resource private ShopStorePrinterService shopStorePrinterService; + @Lazy @Resource private LklLedgerEcService lklLedgerEcService; + @Resource + private LklTkServiceImpl lklTkService; + @ApiOperation(value = "测试案例", notes = "测试案例") @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 shopStorePrinterService.printShopStoreReturnOrder(paramsJSON.getStr("returnId")); + return lklTkService.getLklShopId("8226330541100J8", ""); + } @ApiOperation(value = "批量发送推送消息 - 测试案例", notes = "批量发送推送消息 - 测试案例") diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklTkServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklTkServiceImpl.java index 737ec817..d574e9af 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklTkServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklTkServiceImpl.java @@ -943,7 +943,7 @@ public class LklTkServiceImpl { // 发送请求 String urlPath = "/htkmerchants/open/merchant/addTerm"; - JSONObject response = RestTemplateHttpUtil.sendLklPost( + JSONObject response = RestTemplateHttpUtil.sendLklPostSrc( buildLklTkUrl(urlPath), header, requestBody, JSONObject.class); // 检查响应结果 @@ -1001,9 +1001,12 @@ public class LklTkServiceImpl { logger.error("获取拉卡拉私钥失败,apiPriKeyPath={}", apiPriKeyPath); return null; } +// logger.info("api 私钥:{}", privateKey); + + logger.info("请求明文参数:{}", requestParams); String encryptedParams = LakalaUtil.encryptByPrivateKey(requestParams.toString(), privateKey); - logger.debug("请求参数加密完成"); +// logger.debug("请求参数加密完成"); // 获取认证信息 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 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( - buildLklTkUrl(urlPath), header, requestBody, JSONObject.class); + + JSONObject response = RestTemplateHttpUtil.sendLklPostSrc( + urlPath, header, requestBody, JSONObject.class); // 检查响应结果 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); - logger.debug("响应数据解密完成"); + logger.info("响应数据解密完成: {}", responseData); return JSONUtil.parseObj(responseData); @@ -1053,7 +1062,7 @@ public class LklTkServiceImpl { * @param customerNo 内部商户号(备选) * @return 拉卡拉商户的shopId,获取失败返回null */ - private Long getLklShopId(String externalCustomerNo, String customerNo) { + public Long getLklShopId(String externalCustomerNo, String customerNo) { logger.debug("开始获取拉卡拉商户shopId,externalCustomerNo={}, customerNo={}", externalCustomerNo, customerNo); try { @@ -1064,10 +1073,12 @@ public class LklTkServiceImpl { } // 检查响应中的code字段是否表示成功 - if (!"000000".equals(response.getStr("code"))) { - logger.warn("拉卡拉商户信息获取失败,code={},response={}", response.getStr("code"), response); - return null; - } +// if (!"000000".equals(response.getStr("code"))) { +// logger.warn("拉卡拉商户信息获取失败,code={},response={}", response.getStr("code"), response); +// return null; +// } + + logger.info("拉卡拉商户信息:{}", response); // 检查shopInfoList是否存在且不为空 JSONArray shopInfoList = response.getJSONArray("shopInfoList"); diff --git a/mall-shop/src/main/resources/payKey/lakala/prod/tk_api_private_key.txt b/mall-shop/src/main/resources/payKey/lakala/prod/tk_api_private_key.txt index a17740cc..02e68fcb 100644 --- a/mall-shop/src/main/resources/payKey/lakala/prod/tk_api_private_key.txt +++ b/mall-shop/src/main/resources/payKey/lakala/prod/tk_api_private_key.txt @@ -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== \ No newline at end of file +MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAI4dPEw5wEGxH9aN+5WwFazEDvhomT/FWX0yHQRMdL0CTi8dy0hIN1sdNEbBmcOKc6dw2XHQCVQS3hfFFvpmnUqLJi32RbMhzxYz8Li9zN45eNKhiUfm/LupucHeTm3axGfOT3dfi0uhgq9LHk7ku12Pe+JIYdDu8RMCNeLJ7/AJAgMBAAECgYBAJSgLS+HghN9XC50sMl+GLLSJIUVSyHQdE1qPjyb+DSVXFP6lcJsz0BnBei86WKrdQA2V1o3vWdjPJ9G4UkraJ3hz2elzEeYok+MpLiPRicUd9RNHTVp9YqTzFyAsuranMxwt07tQaZBGc0T6hiGEsSHShwA+FfLGmz0TacR7hQJBAMOjlnP6zEzjUiW0BoZDnLHR6B5EpVVwhN7gS1B0HZtkGOjuoMz8z/GBbKLniGUtoRTDqFE4MJe7iA7237DZvscCQQC59gcIU4ezoonbDvMPbr4GMCgjP2eVrXUD02qGLJlQ45Wla6FpFZvQH5Wno5qRjdU9+Kjwms4lTTLVPHHfh0qvAkEAj2O9CDCPwOLz+JJkHdA8btBskpK5o0+e80Ptr4ALmzLYVxFfZh79wgKcPyH4BEBXScLGARFv/CYE6QLknNhbTQJAZ+F5+DrBOaX4oHhvaxWP7WEFavtGYCSvk12MyjsrwjYAKJJBbrR1gAPE1Arek6TJlH7N0OqJcej4FopXimjHXQJBAIS5nqeJPd3J7ath+uge+itkQUJnrTDHe4Feinmenuh6YLcwVJwuGqtUqxUUW/6TCrxdlMdiFmBjBjr7lkhlnuc= \ No newline at end of file diff --git a/mall-shop/src/main/resources/payKey/lakala/prod/tk_api_public_key.txt b/mall-shop/src/main/resources/payKey/lakala/prod/tk_api_public_key.txt index 7f699e3a..d8f2bef4 100644 --- a/mall-shop/src/main/resources/payKey/lakala/prod/tk_api_public_key.txt +++ b/mall-shop/src/main/resources/payKey/lakala/prod/tk_api_public_key.txt @@ -1 +1 @@ -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp5aV3ZiXG2R8Yd8Nxocv+cF7VAUHBc0TF4MNne7mI8wM2yEP2QgI+rK1qDf6G7ZFPhutpIHKQchpolbSuC0vgaHpSjO9OUs1fpnK/JjZq9o8DatUsA0n4Fccec9NBbV5dy5yrwro7xmDpsevp1/IeiIssi1+iD+nBWqqVFx7GVQIDAQAB \ No newline at end of file +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCOHTxMOcBBsR/WjfuVsBWsxA74aJk/xVl9Mh0ETHS9Ak4vHctISDdbHTRGwZnDinOncNlx0AlUEt4XxRb6Zp1KiyYt9kWzIc8WM/C4vczeOXjSoYlH5vy7qbnB3k5t2sRnzk93X4tLoYKvSx5O5Ltdj3viSGHQ7vETAjXiye/wCQIDAQAB \ No newline at end of file