From 1635812bb5964fb5051d3660eb37a3d4fc41e8ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=85=E6=99=A8?= <136767481@qq.com> Date: Mon, 19 May 2025 14:38:07 +0800 Subject: [PATCH] =?UTF-8?q?feat(mall):=20=E6=96=B0=E5=A2=9E=E5=95=86?= =?UTF-8?q?=E5=93=81=E6=A0=87=E7=AD=BE=E7=AD=9B=E9=80=89=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E6=94=AF=E4=BB=98=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E4=BB=A3=E7=A0=81-=20=E5=9C=A8=E5=95=86=E5=93=81=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E6=8E=A5=E5=8F=A3=E4=B8=AD=E6=B7=BB=E5=8A=A0=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E7=AD=9B=E9=80=89=E5=8F=82=E6=95=B0=20-=20=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=95=B0=E6=8D=AE=E5=BA=93=E6=9F=A5=E8=AF=A2=E4=BB=A5?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=A0=87=E7=AD=BE=E7=AD=9B=E9=80=89=20-=20?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=86=97=E4=BD=99=E7=9A=84=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81=20-=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=8B=89=E5=8D=A1=E6=8B=89SDK=E7=9A=84=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-common/pom.xml | 2 +- ruoyi-common/ruoyi-common-core/pom.xml | 13 -- .../zf/laop/java/sdk/demo/BaseCommonDemo.java | 8 +- .../laop/java/sdk/demo/utils/KlkConstant.java | 8 +- .../laop/java/sdk/demo/utils/LakalaUtils.java | 83 ++++++++ .../sdk/demo/utils/V3LakalaOrderUtils.java | 53 +++-- .../zf/laop/java/sdk/demo/BaseCommonDemo.java | 8 +- .../laop/java/sdk/demo/utils/KlkConstant.java | 8 +- .../sdk/demo/utils/V3LakalaUserUtils.java | 11 +- .../demo/v3/V3LabsRelationRefundRequest.java | 166 +++++++++++++++ ruoyi-mall-api/pom.xml | 15 ++ .../controller/ApiAppletAuthController.java | 2 +- .../web/controller/ApiCallbackController.java | 3 +- .../web/controller/ApiProdController.java | 4 +- .../org/dromara/web/utils/TxApiSdkUtils.java | 189 ++++++++++++++++++ ruoyi-modules/ruoyi-mall/pom.xml | 4 +- .../org/dromara/mall/mapper/TzProdMapper.java | 2 +- .../dromara/mall/service/ITzProdService.java | 2 +- .../service/impl/HyOrderItemServiceImpl.java | 5 +- .../mall/service/impl/HyOrderServiceImpl.java | 5 +- .../service/impl/TzBankCardServiceImpl.java | 8 +- .../mall/service/impl/TzProdServiceImpl.java | 5 +- .../resources/mapper/mall/TzProdMapper.xml | 3 + 23 files changed, 539 insertions(+), 68 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-pay/src/main/java/com/lakala/zf/laop/java/sdk/demo/v3/V3LabsRelationRefundRequest.java create mode 100644 ruoyi-mall-api/src/main/java/org/dromara/web/utils/TxApiSdkUtils.java diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 5beddba..12a4c82 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -35,7 +35,7 @@ ruoyi-common-websocket ruoyi-common-sse ruoyi-common-pay - ruoyi-common-pay-new + ruoyi-common diff --git a/ruoyi-common/ruoyi-common-core/pom.xml b/ruoyi-common/ruoyi-common-core/pom.xml index 081c1ad..35b740d 100644 --- a/ruoyi-common/ruoyi-common-core/pom.xml +++ b/ruoyi-common/ruoyi-common-core/pom.xml @@ -99,20 +99,7 @@ transmittable-thread-local - - - com.qcloud - cos-sts_api - ${com.qcloud.version} - compile - - - - com.tencentcloudapi - tencentcloud-sdk-java - ${tencentcloudapi.version} - diff --git a/ruoyi-common/ruoyi-common-pay-new/src/main/java/com/lakala/zf/laop/java/sdk/demo/BaseCommonDemo.java b/ruoyi-common/ruoyi-common-pay-new/src/main/java/com/lakala/zf/laop/java/sdk/demo/BaseCommonDemo.java index 6dda90f..4f35122 100644 --- a/ruoyi-common/ruoyi-common-pay-new/src/main/java/com/lakala/zf/laop/java/sdk/demo/BaseCommonDemo.java +++ b/ruoyi-common/ruoyi-common-pay-new/src/main/java/com/lakala/zf/laop/java/sdk/demo/BaseCommonDemo.java @@ -16,24 +16,24 @@ public class BaseCommonDemo { // 你的证书序列号 private static final String serialNo = "0195119ac8ac"; - /*//商户私钥信息地址 + //商户私钥信息地址 private static final String priKeyPath = "D:\\manage\\jcs\\OP10000499商户私钥.txt"; //拉卡拉支付平台证书地址 private static final String lklCerPath = "D:\\manage\\jcs\\平台公钥生产.cer"; //拉卡拉支付平台证书地址2(用于拉卡拉通知验签)+ - private static final String lklNotifyCerPath = "D:\\manage\\jcs\\平台公钥生产.cer";*/ + private static final String lklNotifyCerPath = "D:\\manage\\jcs\\平台公钥生产.cer"; - //商户私钥信息地址 + /*//商户私钥信息地址 private static final String priKeyPath = "/home/manage/jcs/OP10000499商户私钥.txt"; //拉卡拉支付平台证书地址 private static final String lklCerPath = "/home/manage/jcs/平台公钥生产.cer"; //拉卡拉支付平台证书地址2(用于拉卡拉通知验签) - private static final String lklNotifyCerPath = "/home/manage/jcs/平台公钥生产.cer"; + private static final String lklNotifyCerPath = "/home/manage/jcs/平台公钥生产.cer";*/ /** * 拉卡拉报文加密对称性密钥 diff --git a/ruoyi-common/ruoyi-common-pay-new/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/KlkConstant.java b/ruoyi-common/ruoyi-common-pay-new/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/KlkConstant.java index 4045bb7..19c7dec 100644 --- a/ruoyi-common/ruoyi-common-pay-new/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/KlkConstant.java +++ b/ruoyi-common/ruoyi-common-pay-new/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/KlkConstant.java @@ -40,22 +40,22 @@ public class KlkConstant { /** * bindAccount 分账关系绑定结果回调地址 */ - public static final String BIND_ACC_URL = "https://jcs-api.52o.site/api/mall/callback/applyBind"; + public static final String BIND_ACC_URL = "https://jcsapi-new.52o.site/jcsapi/api/mall/callback/applyBind"; /** * 提现结果回调地址 */ - public static final String WITHDRAWAL = "https://jcs-api.52o.site/api/mall/callback/withdrawal"; + public static final String WITHDRAWAL = "https://jcsapi-new.52o.site/jcsapi/api/mall/callback/withdrawal"; /** * 会员兑换码订单回调地址 */ - public static final String MEMBER_CODE_ORDER = "https://jcs-api.52o.site/api/mall/callback/codeOrder"; + public static final String MEMBER_CODE_ORDER = "https://jcsapi-new.52o.site/jcsapi/api/mall/callback/codeOrder"; /** * 材料订单回调地址 */ - public static final String MEMBER_ORDER = "https://jcs-api.52o.site/api/mall/callback/order"; + public static final String MEMBER_ORDER = "https://jcsapi-new.52o.site/jcsapi/api/mall/callback/order"; /** * 分账状态 处理中:PROCESSING, 已受理:ACCEPTED, 成功:SUCCESS, 失败:FAIL diff --git a/ruoyi-common/ruoyi-common-pay-new/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/LakalaUtils.java b/ruoyi-common/ruoyi-common-pay-new/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/LakalaUtils.java index c4ff361..aec1f70 100644 --- a/ruoyi-common/ruoyi-common-pay-new/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/LakalaUtils.java +++ b/ruoyi-common/ruoyi-common-pay-new/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/LakalaUtils.java @@ -7,6 +7,7 @@ import com.lakala.zf.laop.java.sdk.demo.BaseCommonDemo; import com.lkl.laop.sdk.LKLSDK; import com.lkl.laop.sdk.exception.SDKException; import com.lkl.laop.sdk.request.V3CcssCounterOrderCreateRequest; +import com.lkl.laop.sdk.request.model.V3CcssOrderOutSplitInfo; import com.lkl.laop.sdk.request.model.V3CcssOrderSceneFieldInfo; import java.math.BigDecimal; @@ -21,6 +22,88 @@ import java.util.List; public class LakalaUtils extends BaseCommonDemo { + + + + */ +/** + * 聚合收银台创建订单 + * + * @return + *//* + + public static JSONObject createOrderPayment(String orderNo, BigDecimal payPrice, List splitInfoList) throws Exception { + doInit(); + //创建订单请求参数 + V3CcssCounterOrderCreateRequest request = new V3CcssCounterOrderCreateRequest(); + + //商户订单号 + request.setOutOrderNo(orderNo); + + //是否支持多次发起订单 0 不支持 1 支持 + request.setSupportRepeatPay(1); + + //银联商户号 + request.setMerchantNo(KlkConstant.merchantNo); + + //订单支付金额 单位:分 + request.setTotalAmount(payPrice.multiply(new BigDecimal(100)).longValue()); + + //支付有效期 一天 + request.setOrderEfficientTime(DateUtil.format(DateUtil.offsetDay(new Date(), 1), "yyyyMMddHHmmss")); + + //回调地址 + request.setNotifyUrl(KlkConstant.MEMBER_ORDER); + + request.setSupportCancel(1); + + request.setSupportRefund(1); + + */ +/*request.setSplitMark("1"); + request.setOutSplitInfo(splitInfoList);*//* + + + //支付类型 +// req.setCounterParam("{\"pay_mode\":\"ALIPAY\"}"); + +// req.setBusiTypeParam("[{\"busi_type\":\"UPCARD\",\"params\":{\"crd_flg\":\"CRDFLG_D|CRDFLG_C|CRDFLG_OTH\"}},{\"busi_type\":\"SCPAY\",\"params\":{\"pay_mode\":\"WECHAT\",\"crd_flg\":\"CRDFLG_D\"}}]"); + + // 订单标题,在使用收银台扫码支付时必输入,交易时送往账户端 + request.setOrderInfo("集材社订单支付"); + + List sgnInfos = new ArrayList<>(); + + sgnInfos.add("1"); + + request.setSgnInfo(sgnInfos); + + V3CcssOrderSceneFieldInfo.HbFqSceneInfo hbFqSceneInfo = new V3CcssOrderSceneFieldInfo.HbFqSceneInfo(); + + hbFqSceneInfo.setHbFqNum("3"); + + hbFqSceneInfo.setHbFqSellerPercent("0"); + + //3. 发送请求 + String response = null; + try { + response = LKLSDK.httpPost(request); + } catch (SDKException e) { + throw new RuntimeException(e); + } + + //4. 响应 + System.out.println(response); + + JSONObject jsonObject = JSONObject.parseObject(response); + if ("000000".equals(jsonObject.get("code"))) { + System.out.println(jsonObject.get("resp_data").toString()); + } else { + System.out.println(jsonObject.get("msg").toString()); + } + return jsonObject; + } + */ /** * 聚合收银台创建订单 diff --git a/ruoyi-common/ruoyi-common-pay-new/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/V3LakalaOrderUtils.java b/ruoyi-common/ruoyi-common-pay-new/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/V3LakalaOrderUtils.java index e1f70b3..dc2dd76 100644 --- a/ruoyi-common/ruoyi-common-pay-new/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/V3LakalaOrderUtils.java +++ b/ruoyi-common/ruoyi-common-pay-new/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/V3LakalaOrderUtils.java @@ -1,22 +1,28 @@ +/* package com.lakala.zf.laop.java.sdk.demo.utils; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.lakala.zf.laop.java.sdk.demo.BaseCommonDemo; import com.lkl.laop.sdk.LKLSDK; -import com.lkl.laop.sdk.request.V3LabsRelationRefundRequest; +import com.lkl.laop.sdk.request.*; +import com.lkl.laop.sdk.utils.CommonUtil; import javax.servlet.ServletException; +*/ /** * @author Maosw - */ -public class V3LakalaOrderUtils extends BaseCommonDemo { + *//* -/* - *//** +public class V3LakalaUserUtils extends BaseCommonDemo { + + + */ +/** * 根据卡号查询卡BIN信息 *//* + public static JSONObject cardBin(String acctNo) throws Exception { doInit(); if (acctNo == null) { @@ -27,13 +33,17 @@ public class V3LakalaOrderUtils extends BaseCommonDemo { cardBin.setOrderNo(CommonUtil.getOrderNo()); cardBin.setOrgCode(KlkConstant.ORG_CODE); cardBin.setCardNo(acctNo); + System.out.println("cardBin:"+cardBin); String cardBinResponse = LKLSDK.httpPost(cardBin); + System.out.println(cardBinResponse); return JSON.parseObject(cardBinResponse); } - *//** + */ +/** *附件上传 *//* + public static JSONObject uploadFile(V2MmsOpenApiUploadFile uploadFile) throws Exception { doInit(); if (uploadFile == null) { @@ -50,9 +60,11 @@ public class V3LakalaOrderUtils extends BaseCommonDemo { return JSON.parseObject(uploadFileResponse); } - *//** + */ +/** * 分账接收方创建申请 *//* + public static JSONObject applyLedgerReceiver(V2MmsApplyLedgerReceiverRequest ledgerReceiver) throws Exception { doInit(); if (ledgerReceiver == null) { @@ -65,9 +77,11 @@ public class V3LakalaOrderUtils extends BaseCommonDemo { return JSON.parseObject(uploadFileResponse); } - *//** + */ +/** * 查询提现申请详情 *//* + public static JSONObject queryWithdraw(V3SacsQueryRequest queryRequest) throws Exception { doInit(); if (queryRequest == null) { @@ -77,9 +91,11 @@ public class V3LakalaOrderUtils extends BaseCommonDemo { return JSON.parseObject(response); } - *//** + */ +/** * 提现申请 *//* + public static JSONObject withdraw(V3SacsBalanceSeparateRequest separateRequest) throws Exception { doInit(); if (separateRequest == null) { @@ -89,9 +105,11 @@ public class V3LakalaOrderUtils extends BaseCommonDemo { return JSON.parseObject(response); } - *//** + */ +/** *提款模式设置 *//* + public static JSONObject setWithdrawMode(V2LaepIndustryEwalletSettleProfileRequest ewalletSettleProfileRequest) throws Exception { doInit(); if (ewalletSettleProfileRequest == null) { @@ -99,11 +117,16 @@ public class V3LakalaOrderUtils extends BaseCommonDemo { } String response = LKLSDK.httpPost(ewalletSettleProfileRequest); return JSON.parseObject(response); - }*/ + } - /** + */ +/* *//* +*/ +/** * 退款 - */ + *//* +*/ +/* public static JSONObject relationRefund(V3LabsRelationRefundRequest v3LabsRelationRefundRequest) throws Exception { // 1. 配置初始化 doInit(); @@ -115,6 +138,8 @@ public class V3LakalaOrderUtils extends BaseCommonDemo { //4. 响应 System.out.println(response); return JSON.parseObject(response); - } + }*//* + } +*/ diff --git a/ruoyi-common/ruoyi-common-pay/src/main/java/com/lakala/zf/laop/java/sdk/demo/BaseCommonDemo.java b/ruoyi-common/ruoyi-common-pay/src/main/java/com/lakala/zf/laop/java/sdk/demo/BaseCommonDemo.java index ebf5020..21a6df4 100644 --- a/ruoyi-common/ruoyi-common-pay/src/main/java/com/lakala/zf/laop/java/sdk/demo/BaseCommonDemo.java +++ b/ruoyi-common/ruoyi-common-pay/src/main/java/com/lakala/zf/laop/java/sdk/demo/BaseCommonDemo.java @@ -16,24 +16,24 @@ public class BaseCommonDemo { // 你的证书序列号 private static final String serialNo = "0195119ac8ac"; - /*//商户私钥信息地址 + //商户私钥信息地址 private static final String priKeyPath = "D:\\manage\\jcs\\OP10000499商户私钥.txt"; //拉卡拉支付平台证书地址 private static final String lklCerPath = "D:\\manage\\jcs\\平台公钥生产.cer"; //拉卡拉支付平台证书地址2(用于拉卡拉通知验签) - private static final String lklNotifyCerPath = "D:\\manage\\jcs\\平台公钥生产.cer";*/ + private static final String lklNotifyCerPath = "D:\\manage\\jcs\\平台公钥生产.cer"; //商户私钥信息地址 - private static final String priKeyPath = "/home/manage/jcs/OP10000499商户私钥.txt"; + /*private static final String priKeyPath = "/home/manage/jcs/OP10000499商户私钥.txt"; //拉卡拉支付平台证书地址 private static final String lklCerPath = "/home/manage/jcs/平台公钥生产.cer"; //拉卡拉支付平台证书地址2(用于拉卡拉通知验签) - private static final String lklNotifyCerPath = "/home/manage/jcs/平台公钥生产.cer"; + private static final String lklNotifyCerPath = "/home/manage/jcs/平台公钥生产.cer";*/ /** * 拉卡拉报文加密对称性密钥 diff --git a/ruoyi-common/ruoyi-common-pay/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/KlkConstant.java b/ruoyi-common/ruoyi-common-pay/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/KlkConstant.java index 4045bb7..19c7dec 100644 --- a/ruoyi-common/ruoyi-common-pay/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/KlkConstant.java +++ b/ruoyi-common/ruoyi-common-pay/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/KlkConstant.java @@ -40,22 +40,22 @@ public class KlkConstant { /** * bindAccount 分账关系绑定结果回调地址 */ - public static final String BIND_ACC_URL = "https://jcs-api.52o.site/api/mall/callback/applyBind"; + public static final String BIND_ACC_URL = "https://jcsapi-new.52o.site/jcsapi/api/mall/callback/applyBind"; /** * 提现结果回调地址 */ - public static final String WITHDRAWAL = "https://jcs-api.52o.site/api/mall/callback/withdrawal"; + public static final String WITHDRAWAL = "https://jcsapi-new.52o.site/jcsapi/api/mall/callback/withdrawal"; /** * 会员兑换码订单回调地址 */ - public static final String MEMBER_CODE_ORDER = "https://jcs-api.52o.site/api/mall/callback/codeOrder"; + public static final String MEMBER_CODE_ORDER = "https://jcsapi-new.52o.site/jcsapi/api/mall/callback/codeOrder"; /** * 材料订单回调地址 */ - public static final String MEMBER_ORDER = "https://jcs-api.52o.site/api/mall/callback/order"; + public static final String MEMBER_ORDER = "https://jcsapi-new.52o.site/jcsapi/api/mall/callback/order"; /** * 分账状态 处理中:PROCESSING, 已受理:ACCEPTED, 成功:SUCCESS, 失败:FAIL diff --git a/ruoyi-common/ruoyi-common-pay/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/V3LakalaUserUtils.java b/ruoyi-common/ruoyi-common-pay/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/V3LakalaUserUtils.java index ef10174..b9e6835 100644 --- a/ruoyi-common/ruoyi-common-pay/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/V3LakalaUserUtils.java +++ b/ruoyi-common/ruoyi-common-pay/src/main/java/com/lakala/zf/laop/java/sdk/demo/utils/V3LakalaUserUtils.java @@ -3,6 +3,7 @@ package com.lakala.zf.laop.java.sdk.demo.utils; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.lakala.zf.laop.java.sdk.demo.BaseCommonDemo; +import com.lakala.zf.laop.java.sdk.demo.v3.V3LabsRelationRefundRequest; import com.lkl.laop.sdk.LKLSDK; import com.lkl.laop.sdk.request.*; import com.lkl.laop.sdk.utils.CommonUtil; @@ -28,7 +29,9 @@ public class V3LakalaUserUtils extends BaseCommonDemo { cardBin.setOrderNo(CommonUtil.getOrderNo()); cardBin.setOrgCode(KlkConstant.ORG_CODE); cardBin.setCardNo(acctNo); + System.out.println("cardBin:"+cardBin); String cardBinResponse = LKLSDK.httpPost(cardBin); + System.out.println(cardBinResponse); return JSON.parseObject(cardBinResponse); } @@ -102,9 +105,9 @@ public class V3LakalaUserUtils extends BaseCommonDemo { return JSON.parseObject(response); } -/* *//** - * 退款 - *//* + /** + * 提款模式查询 + */ public static JSONObject relationRefund(V3LabsRelationRefundRequest v3LabsRelationRefundRequest) throws Exception { // 1. 配置初始化 doInit(); @@ -116,6 +119,6 @@ public class V3LakalaUserUtils extends BaseCommonDemo { //4. 响应 System.out.println(response); return JSON.parseObject(response); - }*/ + } } diff --git a/ruoyi-common/ruoyi-common-pay/src/main/java/com/lakala/zf/laop/java/sdk/demo/v3/V3LabsRelationRefundRequest.java b/ruoyi-common/ruoyi-common-pay/src/main/java/com/lakala/zf/laop/java/sdk/demo/v3/V3LabsRelationRefundRequest.java new file mode 100644 index 0000000..5242887 --- /dev/null +++ b/ruoyi-common/ruoyi-common-pay/src/main/java/com/lakala/zf/laop/java/sdk/demo/v3/V3LabsRelationRefundRequest.java @@ -0,0 +1,166 @@ +package com.lakala.zf.laop.java.sdk.demo.v3; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.lkl.laop.sdk.enums.FunctionCodeEnum; +import com.lkl.laop.sdk.request.V3CommRequest; +import com.lkl.laop.sdk.request.model.V3LabsTradeLocationInfo; + +/** + * @author nxj + * @date 2023/7/21 14:07 + * @description v3退款交易 + */ +public class V3LabsRelationRefundRequest extends V3CommRequest { + + /** + * 商户号 + * M + * 拉卡拉分配的商户号 + */ + @JsonProperty("merchant_no") + private String merchantNo; + + /** + * 终端号 + * M + * 拉卡拉分配的业务终端号 + */ + @JsonProperty("term_no") + private String termNo; + + /** + * 商户交易流水号 + * M + * 商户系统唯一 + */ + @JsonProperty("out_trade_no") + private String outTradeNo; + + /** + * 退款金额 + * M + * 单位分,整数数字型字符 + */ + @JsonProperty("refund_amount") + private String refundAmount; + + /** + * 退款原因 + * M + * 退款原因描述 + */ + @JsonProperty("refund_reason") + private String refundReason; + + /** + * 原商户交易流水号 + * C + * 下单时的商户请求流水号(退款时origin_out_trade_no,origin_trade_no,origin_log_no必送其一) + */ + @JsonProperty("origin_out_trade_no") + private String originOutTradeNo; + + /** + * 原拉卡拉交易流水号 + * C + * 下单成功时,返回的拉卡拉交易流水。 origin_out_trade_no、origin_log_no、origin_trade_no至少一个必填 + * (调用收银台下单接口拉起交易后发起退款时至少要传两个),同时存在时优先级顺序如下: origin_trade_no、origin_log_no、origin_out_trade_no。 + */ + @JsonProperty("origin_trade_no") + private String originTradeNo; + + /** + * 原对账单流水号 + * C + * 对账单中的交易流水。 origin_out_trade_no、origin_log_no、origin_trade_no至少一个必填 + * (调用收银台下单接口拉起交易后发起退款时至少要传两个,同时存在时优先级顺序如下: origin_trade_no、origin_log_no、origin_out_trade_no。 + */ + @JsonProperty("origin_log_no") + private String originLogNo; + + /** + * 地址位置信息 + * M + * 地址位置信息,风控要求必送 + */ + @JsonProperty("location_info") + private V3LabsTradeLocationInfo locationInfo; + + public String getMerchantNo() { + return merchantNo; + } + + public void setMerchantNo(String merchantNo) { + this.merchantNo = merchantNo; + } + + public String getTermNo() { + return termNo; + } + + public void setTermNo(String termNo) { + this.termNo = termNo; + } + + public String getOutTradeNo() { + return outTradeNo; + } + + public void setOutTradeNo(String outTradeNo) { + this.outTradeNo = outTradeNo; + } + + public String getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(String refundAmount) { + this.refundAmount = refundAmount; + } + + public String getRefundReason() { + return refundReason; + } + + public void setRefundReason(String refundReason) { + this.refundReason = refundReason; + } + + public String getOriginOutTradeNo() { + return originOutTradeNo; + } + + public void setOriginOutTradeNo(String originOutTradeNo) { + this.originOutTradeNo = originOutTradeNo; + } + + public String getOriginTradeNo() { + return originTradeNo; + } + + public void setOriginTradeNo(String originTradeNo) { + this.originTradeNo = originTradeNo; + } + + public String getOriginLogNo() { + return originLogNo; + } + + public void setOriginLogNo(String originLogNo) { + this.originLogNo = originLogNo; + } + + public V3LabsTradeLocationInfo getLocationInfo() { + return locationInfo; + } + + public void setLocationInfo(V3LabsTradeLocationInfo locationInfo) { + this.locationInfo = locationInfo; + } + + @Override + public FunctionCodeEnum getFunctionCode() { + return FunctionCodeEnum.API_V3_LABS_RELATION_REFUND; + } + +} diff --git a/ruoyi-mall-api/pom.xml b/ruoyi-mall-api/pom.xml index 7c1d82d..d7fffed 100644 --- a/ruoyi-mall-api/pom.xml +++ b/ruoyi-mall-api/pom.xml @@ -83,6 +83,21 @@ 3.17.0 + + + com.qcloud + cos-sts_api + ${com.qcloud.version} + compile + + + + + com.tencentcloudapi + tencentcloud-sdk-java + ${tencentcloudapi.version} + + diff --git a/ruoyi-mall-api/src/main/java/org/dromara/web/controller/ApiAppletAuthController.java b/ruoyi-mall-api/src/main/java/org/dromara/web/controller/ApiAppletAuthController.java index fdf7a6a..b1a90ac 100644 --- a/ruoyi-mall-api/src/main/java/org/dromara/web/controller/ApiAppletAuthController.java +++ b/ruoyi-mall-api/src/main/java/org/dromara/web/controller/ApiAppletAuthController.java @@ -4,8 +4,8 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.core.utils.TxApiSdkUtils; import org.dromara.web.common.ServerResponseEntity; +import org.dromara.web.utils.TxApiSdkUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/ruoyi-mall-api/src/main/java/org/dromara/web/controller/ApiCallbackController.java b/ruoyi-mall-api/src/main/java/org/dromara/web/controller/ApiCallbackController.java index bffd871..a9afdc7 100644 --- a/ruoyi-mall-api/src/main/java/org/dromara/web/controller/ApiCallbackController.java +++ b/ruoyi-mall-api/src/main/java/org/dromara/web/controller/ApiCallbackController.java @@ -5,7 +5,6 @@ import com.alibaba.fastjson.JSONObject; import com.lakala.zf.laop.java.sdk.demo.BaseCommonDemo; import com.lakala.zf.laop.java.sdk.demo.utils.KlkConstant; import com.lakala.zf.laop.java.sdk.demo.utils.V3LakalaUserUtils; -import com.lkl.laop.sdk.LKLSDK; import com.lkl.laop.sdk.request.V2LaepIndustryEwalletSettleProfileRequest; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -152,7 +151,7 @@ public class ApiCallbackController extends BaseCommonDemo { // 1. 配置初始化 doInit(); - LKLSDK.notificationHandle(getBody(request), getAuthorization(request)); +// LKLSDK.notificationHandle(getBody(request), getAuthorization(request)); String body = getBody(request); // 业务处理 diff --git a/ruoyi-mall-api/src/main/java/org/dromara/web/controller/ApiProdController.java b/ruoyi-mall-api/src/main/java/org/dromara/web/controller/ApiProdController.java index bdd2e69..866707a 100644 --- a/ruoyi-mall-api/src/main/java/org/dromara/web/controller/ApiProdController.java +++ b/ruoyi-mall-api/src/main/java/org/dromara/web/controller/ApiProdController.java @@ -238,6 +238,7 @@ public class ApiProdController { @Parameter(name = "envLevel", description = "环保等级", required = false), @Parameter(name = "fireLevel", description = "防火等级", required = false), @Parameter(name = "trialScenario", description = "试用场景", required = false), + @Parameter(name = "label", description = "标签 0:默认 1:性价比 2:品质款 3:旗舰款", required = false), @Parameter(name = "floor", description = "是否特价 1:是 2:否", required = true), @Parameter(name = "sort", description = "排序(0综合 1价格排序 2热门 3新品)", required = true), @Parameter(name = "orderBy", description = "排序(0升序 1降序)--sort选择1时必传") @@ -249,6 +250,7 @@ public class ApiProdController { @RequestParam(value = "envLevel", required = false) String envLevel, @RequestParam(value = "fireLevel", required = false) String fireLevel, @RequestParam(value = "trialScenario", required = false) String trialScenario, + @RequestParam(value = "label", required = false) Integer label, @RequestParam(value = "floor") Integer floor, @RequestParam(value = "sort") Integer sort, @RequestParam(value = "orderBy") Integer orderBy) { @@ -260,7 +262,7 @@ public class ApiProdController { //热搜关键词次数叠加 hotSearchService.setSearchNum(prodName); - return ServerResponseEntity.success(prodService.getSearchProdPageByProdName(pageQuery, categoryId, prodName, envLevel, fireLevel, trialScenario,floor, sort, orderBy)); + return ServerResponseEntity.success(prodService.getSearchProdPageByProdName(pageQuery, categoryId, prodName, envLevel, fireLevel, trialScenario, label, floor, sort, orderBy)); } @GetMapping("/prodCommPage") diff --git a/ruoyi-mall-api/src/main/java/org/dromara/web/utils/TxApiSdkUtils.java b/ruoyi-mall-api/src/main/java/org/dromara/web/utils/TxApiSdkUtils.java new file mode 100644 index 0000000..8aacafe --- /dev/null +++ b/ruoyi-mall-api/src/main/java/org/dromara/web/utils/TxApiSdkUtils.java @@ -0,0 +1,189 @@ +package org.dromara.web.utils; + +import cn.hutool.core.codec.Base64; +import com.tencent.cloud.CosStsClient; +import com.tencent.cloud.Policy; +import com.tencent.cloud.Response; +import com.tencent.cloud.Statement; +import com.tencent.cloud.cos.util.Jackson; +import com.tencentcloudapi.common.AbstractModel; +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +import com.tencentcloudapi.common.profile.ClientProfile; +import com.tencentcloudapi.common.profile.HttpProfile; +import com.tencentcloudapi.ims.v20201229.ImsClient; +import com.tencentcloudapi.ims.v20201229.models.ImageModerationRequest; +import com.tencentcloudapi.ims.v20201229.models.ImageModerationResponse; +import com.tencentcloudapi.sms.v20210111.SmsClient; +import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest; +import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse; +import com.tencentcloudapi.tms.v20201229.TmsClient; +import com.tencentcloudapi.tms.v20201229.models.TextModerationRequest; +import com.tencentcloudapi.tms.v20201229.models.TextModerationResponse; + +import java.util.TreeMap; + + +public class TxApiSdkUtils +{ + + private static final String SMS_SECRET_ID = "AKIDMcmoeNr64nIpicWBYeU6TaR8h280uyAF"; + + private static final String SMS_SECRET_KEY = "yg8JEzVmriLjtqZ3KURUIrDRQ9euxmbI"; + + /** + * 获取上传临时密钥 + */ + public void getCredential() { + TreeMap config = new TreeMap(); + try { + //这里的 SecretId 和 SecretKey 代表了用于申请临时密钥的永久身份(主账号、子账号等),子账号需要具有操作存储桶的权限。 + String secretId = System.getenv(SMS_SECRET_ID); + String secretKey = System.getenv(SMS_SECRET_KEY); + // 替换为您的云 api 密钥 SecretId + config.put("secretId", secretId); + // 替换为您的云 api 密钥 SecretKey + config.put("secretKey", secretKey); + // 初始化 policy + Policy policy = new Policy(); + // 临时密钥有效时长,单位是秒,默认 1800 秒,目前主账号最长 2 小时(即 7200 秒),子账号最长 36 小时(即 129600)秒 + config.put("durationSeconds", 1800); + // 换成您的 bucket + config.put("bucket", "examplebucket-1250000000"); + // 换成 bucket 所在地区 + config.put("region", "ap-shanghai"); + + // 开始构建一条 statement + Statement statement = new Statement(); + // 声明设置的结果是允许操作 + statement.setEffect("allow"); + statement.addActions(new String[]{ + "cos:PutObject", + // 表单上传、小程序上传 + "cos:PostObject", + // 分块上传 + "cos:InitiateMultipartUpload", + "cos:ListMultipartUploads", + "cos:ListParts", + "cos:UploadPart", + "cos:CompleteMultipartUpload", + // 处理相关接口一般为数据万象产品 权限中以ci开头 + // 创建媒体处理任务 + "ci:CreateMediaJobs", + // 文件压缩 + "ci:CreateFileProcessJobs" + }); + + statement.addResources(new String[]{ + "qcs::cos:ap-chongqing:uid/1250000000:examplebucket-1250000000/*", + "qcs::ci:ap-chongqing:uid/1250000000:bucket/examplebucket-1250000000/*"}); + + // 把一条 statement 添加到 policy 可以添加多条 + policy.addStatement(statement); + // 将 Policy 示例转化成 String,可以使用任何 json 转化方式,这里是本 SDK 自带的推荐方式 + config.put("policy", Jackson.toJsonPrettyString(policy)); + Response response = CosStsClient.getCredential(config); + } catch (Exception e) { + throw new IllegalArgumentException("no valid secret !"); + } + } + + /** + * 腾讯云文件安全检测 + * @param content + * @return + */ + public static String checkContext(String content){ + try{ + Credential cred = new Credential(SMS_SECRET_ID, SMS_SECRET_KEY); + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint("tms.ap-shanghai.tencentcloudapi.com"); + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + // 实例化要请求产品的client对象,clientProfile是可选的 + TmsClient client = new TmsClient(cred, "ap-shanghai", clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + TextModerationRequest req = new TextModerationRequest(); + + String str = Base64.encode(content); + req.setContent(str); + // 返回的resp是一个TextModerationResponse的实例,与请求对象对应 + TextModerationResponse resp = client.TextModeration(req); + // 输出json格式的字符串回包 + return AbstractModel.toJsonString(resp); + } catch (TencentCloudSDKException e) { + throw new IllegalArgumentException("文件检测接口异常"); + } + } + + + /** + * 腾讯云图片安全检测 + * @param imgUrl + * @return + */ + public static String checkImages(String imgUrl){ + try{ + Credential cred = new Credential(SMS_SECRET_ID, SMS_SECRET_KEY); + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint("ims.ap-shanghai.tencentcloudapi.com"); + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + // 实例化要请求产品的client对象,clientProfile是可选的 + ImsClient client = new ImsClient(cred, "ap-shanghai", clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象jkighjkhgkhgkhgjhghkjj + ImageModerationRequest req = new ImageModerationRequest(); + req.setFileUrl(imgUrl); + // 返回的resp是一个ImageModerationResponse的实例,与请求对象对应 + ImageModerationResponse resp = client.ImageModeration(req); + // 输出json格式的字符串回包 + return AbstractModel.toJsonString(resp); + } catch (TencentCloudSDKException e) { + throw new IllegalArgumentException("文件检测接口异常"); + } + } + + + /** + * 腾讯云发送短信 + * @param phoneNumber + * @param code + * @return + */ + public static String sendSmsMsg(String phoneNumber, String code){ + try{ + Credential cred = new Credential(SMS_SECRET_ID, SMS_SECRET_KEY); + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint("sms.tencentcloudapi.com"); + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + // 实例化要请求产品的client对象,clientProfile是可选的 + SmsClient client = new SmsClient(cred, "ap-nanjing", clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + SendSmsRequest req = new SendSmsRequest(); + + String[] phoneNumberSet1 = {phoneNumber}; + req.setPhoneNumberSet(phoneNumberSet1); + req.setSmsSdkAppId("1400926380"); + req.setTemplateId("2222045"); + req.setSignName("合肥小图科技"); + + String[] templateParamSet1 = {code}; + req.setTemplateParamSet(templateParamSet1); + + // 返回的resp是一个SendSmsResponse的实例,与请求对象对应 + SendSmsResponse resp = client.SendSms(req); + // 输出json格式的字符串回包 + return AbstractModel.toJsonString(resp); + } catch (TencentCloudSDKException e) { + throw new IllegalArgumentException("短信接口异常"); + } + } + +} diff --git a/ruoyi-modules/ruoyi-mall/pom.xml b/ruoyi-modules/ruoyi-mall/pom.xml index d73fdf5..c34be6b 100644 --- a/ruoyi-modules/ruoyi-mall/pom.xml +++ b/ruoyi-modules/ruoyi-mall/pom.xml @@ -139,12 +139,12 @@ 5.3.0 compile - + diff --git a/ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/mapper/TzProdMapper.java b/ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/mapper/TzProdMapper.java index b6060c3..a5417d0 100644 --- a/ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/mapper/TzProdMapper.java +++ b/ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/mapper/TzProdMapper.java @@ -60,7 +60,7 @@ public interface TzProdMapper extends BaseMapperPlus, MPJBaseM * @param orderBy * @return */ - IPage getSearchProdPageByProdName(@Param("page") IPage page, @Param("categoryId") Long categoryId, @Param("prodName") String prodName, @Param("envLevel") String envLevel, @Param("fireLevel") String fireLevel, @Param("trialScenario") String trialScenario, @Param("floor") Integer floor, @Param("sort") Integer sort, @Param("orderBy") Integer orderBy); + IPage getSearchProdPageByProdName(@Param("page") IPage page, @Param("categoryId") Long categoryId, @Param("prodName") String prodName, @Param("envLevel") String envLevel, @Param("fireLevel") String fireLevel, @Param("trialScenario") String trialScenario, @Param("label") Integer label, @Param("floor") Integer floor, @Param("sort") Integer sort, @Param("orderBy") Integer orderBy); /** diff --git a/ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/service/ITzProdService.java b/ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/service/ITzProdService.java index 20282e6..10541c1 100644 --- a/ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/service/ITzProdService.java +++ b/ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/service/ITzProdService.java @@ -108,7 +108,7 @@ public interface ITzProdService extends MPJBaseService { * @param orderBy * @return */ - IPage getSearchProdPageByProdName(PageQuery pageQuery, Long categoryId, String prodName, String envLevel, String fireLevel, String trialScenario, Integer floor, Integer sort, Integer orderBy); + IPage getSearchProdPageByProdName(PageQuery pageQuery, Long categoryId, String prodName, String envLevel, String fireLevel, String trialScenario, Integer label, Integer floor, Integer sort, Integer orderBy); /** * 商品收藏 diff --git a/ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/service/impl/HyOrderItemServiceImpl.java b/ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/service/impl/HyOrderItemServiceImpl.java index 59dab85..427e1f3 100644 --- a/ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/service/impl/HyOrderItemServiceImpl.java +++ b/ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/service/impl/HyOrderItemServiceImpl.java @@ -8,9 +8,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.base.MPJBaseServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.lakala.zf.laop.java.sdk.demo.utils.KlkConstant; -import com.lakala.zf.laop.java.sdk.demo.utils.V3LakalaOrderUtils; import com.lakala.zf.laop.java.sdk.demo.utils.V3LakalaUserUtils; -import com.lkl.laop.sdk.request.V3LabsRelationRefundRequest; +import com.lakala.zf.laop.java.sdk.demo.v3.V3LabsRelationRefundRequest; import com.lkl.laop.sdk.request.V3SacsBalanceSeparateRequest; import com.lkl.laop.sdk.request.model.V3LabsTradeLocationInfo; import lombok.RequiredArgsConstructor; @@ -836,7 +835,7 @@ public class HyOrderItemServiceImpl extends MPJBaseServiceImpl i private MPJLambdaWrapper buildQueryMPJWrapper(TzProdBo bo) { Map params = bo.getParams(); MPJLambdaWrapper lqw = new MPJLambdaWrapper<>(); + lqw.eq(bo.getProdId() != null, TzProd::getProdId, bo.getProdId()); lqw.eq(StringUtils.isNotBlank(bo.getTenantId()), TzProd::getTenantId, bo.getTenantId()); lqw.like(StringUtils.isNotBlank(bo.getProdName()), TzProd::getProdName, bo.getProdName()); lqw.like(StringUtils.isNotBlank(bo.getTenantName()), SysTenant::getCompanyName, bo.getTenantName()); @@ -453,9 +454,9 @@ public class TzProdServiceImpl extends MPJBaseServiceImpl i } @Override - public IPage getSearchProdPageByProdName(PageQuery pageQuery, Long categoryId, String prodName, String envLevel, String fireLevel, String trialScenario, Integer floor, Integer sort, Integer orderBy) { + public IPage getSearchProdPageByProdName(PageQuery pageQuery, Long categoryId, String prodName, String envLevel, String fireLevel, String trialScenario, Integer label, Integer floor, Integer sort, Integer orderBy) { IPage page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); - return baseMapper.getSearchProdPageByProdName(page, categoryId, prodName, envLevel, fireLevel, trialScenario, floor, sort, orderBy); + return baseMapper.getSearchProdPageByProdName(page, categoryId, prodName, envLevel, fireLevel, trialScenario, label, floor, sort, orderBy); } /** diff --git a/ruoyi-modules/ruoyi-mall/src/main/resources/mapper/mall/TzProdMapper.xml b/ruoyi-modules/ruoyi-mall/src/main/resources/mapper/mall/TzProdMapper.xml index 7f575d3..2c560e7 100644 --- a/ruoyi-modules/ruoyi-mall/src/main/resources/mapper/mall/TzProdMapper.xml +++ b/ruoyi-modules/ruoyi-mall/src/main/resources/mapper/mall/TzProdMapper.xml @@ -70,6 +70,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and p.is_floor = 1 + + and p.label = #{label} + and p.prod_name like concat('%',#{prodName} ,'%') or