From 64ab364ac55385c9f0af38663cdac679a98d4a3d Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Wed, 31 Dec 2025 10:31:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E8=BD=AC=E8=B4=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../brokerage/AppBrokerageUserController.java | 3 +- .../wallet/PayWalletRechargeServiceImpl.java | 2 +- .../dto/transfer/PayTransferRespDTO.java | 27 +++++- .../impl/weixin/AbstractWxPayClient.java | 90 ++++++++++++++----- .../social/SocialClientServiceImpl.java | 5 +- .../src/main/resources/application.yaml | 2 +- 6 files changed, 97 insertions(+), 32 deletions(-) diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageUserController.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageUserController.java index 6af88a7..8aa8134 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageUserController.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageUserController.java @@ -118,8 +118,7 @@ public class AppBrokerageUserController { @GetMapping("/child-summary-page") @Operation(summary = "获得下级分销统计分页") - public CommonResult> getBrokerageUserChildSummaryPage( - AppBrokerageUserChildSummaryPageReqVO pageReqVO) { + public CommonResult> getBrokerageUserChildSummaryPage(AppBrokerageUserChildSummaryPageReqVO pageReqVO) { PageResult pageResult = brokerageUserService.getBrokerageUserChildSummaryPage(pageReqVO, getLoginUserId()); return success(pageResult); } diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java index 8874202..6cf54f3 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java @@ -237,7 +237,7 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { .setTitle(String.format("用户[%s]充值[%s]元", user.getNickname(), fenToYuanStr(payOrderDO.getPrice()))) ); }}; - tradeBrokerageRecordApi.addBrokerage(recharge.getId(), BrokerageRecordBizTypeEnum.ORDER, brokerageList); + tradeBrokerageRecordApi.addBrokerage(user.getId(), BrokerageRecordBizTypeEnum.ORDER, brokerageList); // 5. 发送订阅消息 getSelf().sendWalletRechargerPaidMessage(payOrderId, recharge); diff --git a/yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/dto/transfer/PayTransferRespDTO.java b/yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/dto/transfer/PayTransferRespDTO.java index 0f9b482..b23f95c 100644 --- a/yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/dto/transfer/PayTransferRespDTO.java +++ b/yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/dto/transfer/PayTransferRespDTO.java @@ -15,7 +15,7 @@ public class PayTransferRespDTO { /** * 转账状态 - * + *

* 关联 {@link PayTransferStatusRespEnum#getStatus()} */ private Integer status; @@ -50,11 +50,20 @@ public class PayTransferRespDTO { */ private String channelErrorMsg; + /** + * 渠道 package 信息 + *

+ * 特殊:目前只有微信转账有这个东西!!! + * + * @see JSAPI 调起用户确认收款 + */ + private String channelPackageInfo; + /** * 创建【WAITING】状态的转账返回 */ public static PayTransferRespDTO waitingOf(String channelTransferNo, - String outTransferNo, Object rawData) { + String outTransferNo, Object rawData) { PayTransferRespDTO respDTO = new PayTransferRespDTO(); respDTO.status = PayTransferStatusRespEnum.WAITING.getStatus(); respDTO.channelTransferNo = channelTransferNo; @@ -63,6 +72,18 @@ public class PayTransferRespDTO { return respDTO; } + /** + * 创建【IN_PROGRESS】状态的转账返回 + */ + public static PayTransferRespDTO processingOf(String channelTransferNo, String outTransferNo, Object rawData) { + PayTransferRespDTO respDTO = new PayTransferRespDTO(); + respDTO.status = PayTransferStatusRespEnum.IN_PROGRESS.getStatus(); + respDTO.channelTransferNo = channelTransferNo; + respDTO.outTransferNo = outTransferNo; + respDTO.rawData = rawData; + return respDTO; + } + /** * 创建【IN_PROGRESS】状态的转账返回 */ @@ -95,7 +116,7 @@ public class PayTransferRespDTO { * 创建【SUCCESS】状态的转账返回 */ public static PayTransferRespDTO successOf(String channelTransferNo, LocalDateTime successTime, - String outTransferNo, Object rawData) { + String outTransferNo, Object rawData) { PayTransferRespDTO respDTO = new PayTransferRespDTO(); respDTO.status = PayTransferStatusRespEnum.SUCCESS.getStatus(); respDTO.channelTransferNo = channelTransferNo; diff --git a/yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/weixin/AbstractWxPayClient.java b/yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/weixin/AbstractWxPayClient.java index 374afcc..32f99fc 100644 --- a/yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/weixin/AbstractWxPayClient.java +++ b/yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/weixin/AbstractWxPayClient.java @@ -7,6 +7,7 @@ import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.date.TemporalAccessorUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.util.io.FileUtils; +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderRespDTO; import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; @@ -24,10 +25,7 @@ import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult; import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyV3Result; import com.github.binarywang.wxpay.bean.request.*; import com.github.binarywang.wxpay.bean.result.*; -import com.github.binarywang.wxpay.bean.transfer.QueryTransferBatchesRequest; -import com.github.binarywang.wxpay.bean.transfer.QueryTransferBatchesResult; -import com.github.binarywang.wxpay.bean.transfer.TransferBatchesRequest; -import com.github.binarywang.wxpay.bean.transfer.TransferBatchesResult; +import com.github.binarywang.wxpay.bean.transfer.*; import com.github.binarywang.wxpay.config.WxPayConfig; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; @@ -460,30 +458,74 @@ public abstract class AbstractWxPayClient extends AbstractPayClient transferDetailList = Collections.singletonList( +// TransferBatchesRequest.TransferDetail.newBuilder() +// .outDetailNo(reqDTO.getOutTransferNo()) +// .transferAmount(reqDTO.getPrice()) +// .transferRemark(reqDTO.getSubject()) +// .openid(reqDTO.getOpenid()) +// .build()); +// // TODO @luchi:能不能我们搞个 TransferBatchesRequestX extends TransferBatchesRequest,这样更简洁一点。 +// TransferBatchesRequest transferBatches = TransferBatchesRequest.newBuilder() +// .appid(this.config.getAppId()) +// .outBatchNo(reqDTO.getOutTransferNo()) +// .batchName(reqDTO.getSubject()) +// .batchRemark(reqDTO.getSubject()) +// .totalAmount(reqDTO.getPrice()) +// .totalNum(transferDetailList.size()) +// .transferDetailList(transferDetailList).build() +// .setNotifyUrl(reqDTO.getNotifyUrl()); +// // 2.1 执行请求 +// TransferBatchesResult transferBatchesResult = client.getTransferService().transferBatches(transferBatches); +// // 2.2 创建返回结果 +// return PayTransferRespDTO.dealingOf(transferBatchesResult.getBatchId(), reqDTO.getOutTransferNo(), transferBatchesResult); +// } + @Override protected PayTransferRespDTO doUnifiedTransfer(PayTransferUnifiedReqDTO reqDTO) throws WxPayException { - // 1. 构建 TransferBatchesRequest 请求 - List transferDetailList = Collections.singletonList( - TransferBatchesRequest.TransferDetail.newBuilder() - .outDetailNo(reqDTO.getOutTransferNo()) - .transferAmount(reqDTO.getPrice()) - .transferRemark(reqDTO.getSubject()) - .openid(reqDTO.getOpenid()) - .build()); - // TODO @luchi:能不能我们搞个 TransferBatchesRequestX extends TransferBatchesRequest,这样更简洁一点。 - TransferBatchesRequest transferBatches = TransferBatchesRequest.newBuilder() + // 1. 构建 TransferBillsRequest 请求 + TransferBillsRequest request = TransferBillsRequest.newBuilder() .appid(this.config.getAppId()) - .outBatchNo(reqDTO.getOutTransferNo()) - .batchName(reqDTO.getSubject()) - .batchRemark(reqDTO.getSubject()) - .totalAmount(reqDTO.getPrice()) - .totalNum(transferDetailList.size()) - .transferDetailList(transferDetailList).build() - .setNotifyUrl(reqDTO.getNotifyUrl()); + .outBillNo(reqDTO.getOutTransferNo()) + .transferAmount(reqDTO.getPrice()) + .transferRemark(reqDTO.getSubject()) + .transferSceneId(reqDTO.getChannelExtras().get("sceneId")) + .openid(reqDTO.getOpenid()) + .userName(reqDTO.getUserName()) + .transferSceneReportInfos(JsonUtils.parseArray(reqDTO.getChannelExtras().get("sceneReportInfos"), + TransferBillsRequest.TransferSceneReportInfo.class)) + .notifyUrl(reqDTO.getNotifyUrl()) + .build(); + // 特殊:微信转账,必须 0.3 元起,才允许传入姓名 + if (reqDTO.getPrice() < 30) { + request.setUserName(null); + } // 2.1 执行请求 - TransferBatchesResult transferBatchesResult = client.getTransferService().transferBatches(transferBatches); - // 2.2 创建返回结果 - return PayTransferRespDTO.dealingOf(transferBatchesResult.getBatchId(), reqDTO.getOutTransferNo(), transferBatchesResult); + try { + TransferBillsResult response = client.getTransferService().transferBills(request); + + // 2.2 创建返回结果 + String state = response.getState(); + if (ObjectUtils.equalsAny(state, "ACCEPTED", "PROCESSING", "WAIT_USER_CONFIRM", "TRANSFERING")) { + return PayTransferRespDTO.processingOf(response.getTransferBillNo(), response.getOutBillNo(), response) + .setChannelPackageInfo(response.getPackageInfo()); // 一般情况下,只有 WAIT_USER_CONFIRM 会有! + } + if (Objects.equals("SUCCESS", state)) { + return PayTransferRespDTO.successOf(response.getTransferBillNo(), parseDateV3(response.getCreateTime()), + response.getOutBillNo(), response); + } + return PayTransferRespDTO.closedOf(state, response.getFailReason(), + response.getOutBillNo(), response); + } catch (WxPayException e) { + log.error("[doUnifiedTransfer][转账({}) 发起微信支付异常", reqDTO, e); + String errorCode = getErrorCode(e); + String errorMessage = getErrorMessage(e); + return PayTransferRespDTO.closedOf(errorCode, errorMessage, + reqDTO.getOutTransferNo(), e.getXmlString()); + } } @Override diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java index fa93103..1cf43c3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java @@ -274,7 +274,10 @@ public class SocialClientServiceImpl implements SocialClientService { try { String urlScheme = service.getWxMaSchemeService().generate(WxMaGenerateSchemeRequest.newBuilder() .jumpWxa( - WxMaGenerateSchemeRequest.JumpWxa.newBuilder().path(path).query(json).envVersion("trial").build() + // 正式版本-release + // 体验版-trial + // 开发版-develop + WxMaGenerateSchemeRequest.JumpWxa.newBuilder().path(path).query(json).envVersion("release").build() ) .expireTime(expireTime) .expireType(0) diff --git a/yudao-server/src/main/resources/application.yaml b/yudao-server/src/main/resources/application.yaml index ecde1f4..50013b9 100644 --- a/yudao-server/src/main/resources/application.yaml +++ b/yudao-server/src/main/resources/application.yaml @@ -109,7 +109,7 @@ aj: cache-number: 1000 # local 缓存的阈值,达到这个值,清除缓存 timing-clear: 180 # local定时清除过期缓存(单位秒),设置为0代表不执行 type: blockPuzzle # 验证码类型 default两种都实例化。 blockPuzzle 滑块拼图 clickWord 文字点选 - water-mark: 芋道源码 # 右下角水印文字(我的水印),可使用 https://tool.chinaz.com/tools/unicode.aspx 中文转 Unicode,Linux 可能需要转 unicode + water-mark: 荷塘月色 # 右下角水印文字(我的水印),可使用 https://tool.chinaz.com/tools/unicode.aspx 中文转 Unicode,Linux 可能需要转 unicode interference-options: 0 # 滑动干扰项(0/1/2) req-frequency-limit-enable: false # 接口请求次数一分钟限制是否开启 true|false req-get-lock-limit: 5 # 验证失败 5 次,get接口锁定