From e695b288d090ca1d78eac302acb39f497f97f70d Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Tue, 6 May 2025 15:42:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E7=AC=AC=E4=B8=89=E6=96=B9=E6=89=A3?= =?UTF-8?q?=E6=AC=BE=E3=80=81=E9=80=80=E6=AC=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hard/api/constant/HardTypeEnum.java | 1 + .../api/constant/order/HardOrderTypeEnum.java | 1 + .../api/feign/RemoteHardThirdPayService.java | 28 ++ ...mework.cloud.openfeign.FeignClient.imports | 1 + .../pjcloud/hard/config/LbCallbackConfig.java | 14 + .../{zy => }/config/ZyCallbackConfig.java | 2 +- .../third/HardThirdPayController.java | 47 ++++ .../pjcloud/hard/service/HardCarService.java | 5 + .../hard/service/HardThirdPayService.java | 21 ++ .../service/impl/HardDoorFlowServiceImpl.java | 2 +- .../impl/hard/HardThirdSelfZyServiceImpl.java | 14 +- .../impl/order/HardCarServiceImpl.java | 24 ++ .../impl/third/HardThirdPayServiceImpl.java | 251 ++++++++++++++++++ .../constant/pay/ThirdPayApiBizTypeEnum.java | 2 +- .../constant/pay/ThirdPayVoStatusEnum.java | 2 + .../pjcloud/thirdparty/dto/pay/PayDto.java | 41 ++- .../pjcloud/thirdparty/dto/pay/RefundDto.java | 10 + .../bsd/pjcloud/thirdparty/vo/pay/PayVo.java | 4 +- .../thirdparty/vo/pay/PayWalletInfoVo.java | 5 + .../pjcloud/thirdparty/vo/pay/RefundVo.java | 13 +- .../controller/pay/ThirdPayApiController.java | 17 +- .../service/ThirdPayApiService.java | 6 +- .../impl/ThirdKeyManageServiceImpl.java | 69 ++--- .../impl/pay/ThirdPayApiServiceImpl.java | 139 ++++++++-- .../src/main/resources/doc/第三方支付文档.wps | Bin 39936 -> 83968 bytes .../java/com/bsd/pjcloud/admin/PayTest.java | 69 +++++ .../admin/controller/SysUserController.java | 3 +- 27 files changed, 705 insertions(+), 86 deletions(-) create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardThirdPayService.java create mode 100644 pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/LbCallbackConfig.java rename pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/{zy => }/config/ZyCallbackConfig.java (87%) create mode 100644 pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/third/HardThirdPayController.java create mode 100644 pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdPayService.java create mode 100644 pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/third/HardThirdPayServiceImpl.java create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/PayTest.java diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardTypeEnum.java index d5a0684ff..84601db0b 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardTypeEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardTypeEnum.java @@ -20,6 +20,7 @@ public enum HardTypeEnum { READ_CARD("3", "读卡器"), DOOR("4", "生鲜柜"), MERCHANT_QR_CODE("5", "商户二维码扣款牌"), + OTHER("6","其他支付方式(第三方接口对接)") ; private final String type; private final String description; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java index 0f04101c9..0532ba06e 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java @@ -18,6 +18,7 @@ public enum HardOrderTypeEnum { FOREIGN_TICKET("3", "外来人员"), STRIDE_DEPT("4", "跨单位"), ZY("5", "正元公务餐"), + LB("5", "宁波银行(美好生活)"), ; private final String type; private final String description; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardThirdPayService.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardThirdPayService.java new file mode 100644 index 000000000..f17698278 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardThirdPayService.java @@ -0,0 +1,28 @@ +package com.bsd.pjcloud.hard.api.feign; + +import com.bsd.pjcloud.common.core.constant.ServiceNameConstants; +import com.bsd.pjcloud.thirdparty.dto.pay.PayDto; +import com.bsd.pjcloud.thirdparty.dto.pay.RefundDto; +import com.bsd.pjcloud.thirdparty.vo.pay.PayBaseVo; +import com.bsd.pjcloud.thirdparty.vo.pay.PayVo; +import com.bsd.pjcloud.thirdparty.vo.pay.RefundVo; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@FeignClient(contextId = "remoteHardThirdPayService", value = ServiceNameConstants.HARDWARE_SERVICE) +public interface RemoteHardThirdPayService { + /** + * 第三方支付 + */ + @PostMapping("/hard-third-pay/wallet-refund") + PayBaseVo walletPay(@RequestBody PayDto dto, WalletTypeEnum walletType); + + /** + * 第三方退款 + */ + @PostMapping("/hard-third-pay/wallet-refund") + PayBaseVo walletRefund(@RequestBody RefundDto dto); + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/pjcloud-hardware/pjcloud-hardware-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports index c5c83c74f..9504a92a8 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports @@ -1,4 +1,5 @@ com.bsd.pjcloud.hard.api.feign.RemoteHardDoorService com.bsd.pjcloud.hard.api.feign.RemoteHardOrderService com.bsd.pjcloud.hard.api.feign.RemoteHardSpuController +com.bsd.pjcloud.hard.api.feign.RemoteHardThirdPayService com.bsd.pjcloud.hard.api.feign.RemoteHardThirdSelfZyService diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/LbCallbackConfig.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/LbCallbackConfig.java new file mode 100644 index 000000000..27f33778f --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/LbCallbackConfig.java @@ -0,0 +1,14 @@ +package com.bsd.pjcloud.hard.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@ConfigurationProperties(prefix = "lb-callback") +@Component +public class LbCallbackConfig { + + private Long mchId; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/zy/config/ZyCallbackConfig.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/ZyCallbackConfig.java similarity index 87% rename from pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/zy/config/ZyCallbackConfig.java rename to pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/ZyCallbackConfig.java index 84591da9d..6de622300 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/zy/config/ZyCallbackConfig.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/ZyCallbackConfig.java @@ -1,4 +1,4 @@ -package com.bsd.pjcloud.hard.zy.config; +package com.bsd.pjcloud.hard.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/third/HardThirdPayController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/third/HardThirdPayController.java new file mode 100644 index 000000000..b1fbc614f --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/third/HardThirdPayController.java @@ -0,0 +1,47 @@ +package com.bsd.pjcloud.hard.controller.third; + +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.hard.service.HardThirdPayService; +import com.bsd.pjcloud.thirdparty.dto.pay.PayDto; +import com.bsd.pjcloud.thirdparty.dto.pay.RefundDto; +import com.bsd.pjcloud.thirdparty.vo.pay.PayBaseVo; +import com.bsd.pjcloud.thirdparty.vo.pay.PayVo; +import com.bsd.pjcloud.thirdparty.vo.pay.RefundVo; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/hard-third-pay") +@Tag(description = "hard-third-pay", name = "第三方支付调用") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class HardThirdPayController { + + private final HardThirdPayService hardThirdPayService; + + @Inner + @PostMapping("/wallet-pay") + @SysLog("第三方支付") + @Operation(summary = "第三方支付") + public PayBaseVo walletPay(@RequestBody PayDto dto, WalletTypeEnum walletType) { + return hardThirdPayService.walletPay(dto, walletType); + } + + @Inner + @PostMapping("/wallet-refund") + @SysLog("第三方退款") + @Operation(summary = "第三方退款") + public PayBaseVo walletRefund(@RequestBody RefundDto dto) { + return hardThirdPayService.walletRefund(dto); + } + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCarService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCarService.java index 7ed95232c..42e8e6dfc 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCarService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCarService.java @@ -10,6 +10,7 @@ import com.bsd.pjcloud.hard.api.dto.order.HardCreateCarDto; import com.bsd.pjcloud.hard.api.entity.order.HardCarEntity; import com.bsd.pjcloud.hard.api.entity.order.HardParentCarEntity; import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; +import com.bsd.pjcloud.thirdparty.dto.pay.PayDto; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; @@ -39,6 +40,10 @@ public interface HardCarService extends IService { */ Long createCard(Long userId, Long merchantId, HardTypeEnum sysType, HardOrderTypeEnum orderTYpe, List list); + /** + * 创建第三方支付购物车 + */ + Long createThiredPayCard(Long userId, Long merchantId, List list); /** * 生成购买商品的描述 diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdPayService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdPayService.java new file mode 100644 index 000000000..e06ed18c0 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdPayService.java @@ -0,0 +1,21 @@ +package com.bsd.pjcloud.hard.service; + + +import com.bsd.pjcloud.thirdparty.dto.pay.PayDto; +import com.bsd.pjcloud.thirdparty.dto.pay.RefundDto; +import com.bsd.pjcloud.thirdparty.vo.pay.PayBaseVo; +import com.bsd.pjcloud.thirdparty.vo.pay.PayVo; +import com.bsd.pjcloud.thirdparty.vo.pay.RefundVo; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; + +public interface HardThirdPayService { + /** + * 第三方支付 + */ + PayBaseVo walletPay(PayDto dto, WalletTypeEnum walletType); + + /** + * 第三方退款 + */ + PayBaseVo walletRefund(RefundDto dto); +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardDoorFlowServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardDoorFlowServiceImpl.java index 89f717fa3..46ca4898e 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardDoorFlowServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardDoorFlowServiceImpl.java @@ -349,7 +349,7 @@ public class HardDoorFlowServiceImpl extends ServiceImpl list) { @@ -218,6 +223,25 @@ public class HardCarServiceImpl extends ServiceImpl list) { + // 创建父订单 + HardParentCarEntity parentCarObj = HardParentCarEntity.builder().userId(userId).merchantId(merchantId).hardType(HardTypeEnum.OTHER.getType()).orderStatus(HardOrderStatusEnum.PAY.getType()).build(); + hardParentCarMapper.insert(parentCarObj); + List carObjectList = new ArrayList<>(); + for (PayDto.Product v : list) { + Long totalPrice = BigDecimal.valueOf(v.getCount()).multiply(BigDecimal.valueOf(v.getPrice())).setScale(0, RoundingMode.CEILING).longValue(); + HardCarEntity item = HardCarEntity.builder().parentCarId(parentCarObj.getId()).productName(v.getName()).productPic(v.getPic()).productPrice(v.getPrice()).productNature(HardProductNatureEnum.DEFAULT.getType()).productCount(v.getCount()).totalPrice(totalPrice).build(); + carObjectList.add(item); + } + baseMapper.insert(carObjectList); + return parentCarObj.getId(); + } + @Transactional(rollbackFor = Exception.class) public void appCreateCard(Long parentCarId, HardTypeEnum sysType, HardOrderTypeEnum orderType, List productList) { List productIds = productList.stream().map(HardCreateCarDto::getProductId).toList(); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/third/HardThirdPayServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/third/HardThirdPayServiceImpl.java new file mode 100644 index 000000000..f9935e3d3 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/third/HardThirdPayServiceImpl.java @@ -0,0 +1,251 @@ +package com.bsd.pjcloud.hard.service.impl.third; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.bsd.pjcloud.admin.api.dto.UserInfo; +import com.bsd.pjcloud.admin.api.feign.RemoteUserService; +import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; +import com.bsd.pjcloud.common.core.util.BeanUtils; +import com.bsd.pjcloud.hard.api.constant.HardTypeEnum; +import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; +import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum; +import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; +import com.bsd.pjcloud.hard.api.constant.refund.HardAfterSaleOperateTypeEnum; +import com.bsd.pjcloud.hard.api.constant.refund.HardSaleStatusEnum; +import com.bsd.pjcloud.hard.api.constant.refund.HardSaleTypeEnum; +import com.bsd.pjcloud.hard.api.constant.third.HardCallbackPayStatus; +import com.bsd.pjcloud.hard.api.dto.order.HardCreateCarDto; +import com.bsd.pjcloud.hard.api.entity.order.HardAfterSaleEntity; +import com.bsd.pjcloud.hard.api.entity.order.HardAfterSaleLogEntity; +import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; +import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo; +import com.bsd.pjcloud.hard.api.vo.third.HardCallbackPayVo; +import com.bsd.pjcloud.hard.config.LbCallbackConfig; +import com.bsd.pjcloud.hard.mapper.order.HardAfterSaleLogMapper; +import com.bsd.pjcloud.hard.service.HardAfterSaleService; +import com.bsd.pjcloud.hard.service.HardCarService; +import com.bsd.pjcloud.hard.service.HardOrderService; +import com.bsd.pjcloud.hard.service.HardThirdPayService; +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayVoStatusEnum; +import com.bsd.pjcloud.thirdparty.dto.pay.PayDto; +import com.bsd.pjcloud.thirdparty.dto.pay.RefundDto; +import com.bsd.pjcloud.thirdparty.vo.pay.PayBaseVo; +import com.bsd.pjcloud.thirdparty.vo.pay.PayVo; +import com.bsd.pjcloud.thirdparty.vo.pay.RefundVo; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; +import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; +import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; +import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; +import com.bsd.pjcloud.wallet.api.vo.MchManageVo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.joda.time.DateTimeUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.time.LocalDateTime; +import java.util.List; + +@Validated +@Slf4j +@RequiredArgsConstructor +@Service +public class HardThirdPayServiceImpl implements HardThirdPayService { + + private static final String TAG = "第三方支付"; + + private final LbCallbackConfig lbCallbackConfig; + + private final HardOrderService hardOrderService; + private final HardCarService hardCarService; + private final HardAfterSaleService hardAfterSaleService; + private final HardAfterSaleLogMapper hardAfterSaleLogMapper; + + private final RemoteMchService mchService; + private final RemoteUserService userService; + private final RemoteWalletService walletService; + + /** + * 第三方支付 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public PayBaseVo walletPay(PayDto dto, WalletTypeEnum walletType) { + PayBaseVo baseVo = new PayBaseVo(); + try { + // 默认商户 + MchManageVo defaultMch = getLbDefaultMch(); + if (ObjectUtil.isEmpty(defaultMch)) { + baseVo.set(ThirdPayVoStatusEnum.MCH_EXIST); + return baseVo; + } + // 查询用户 + UserInfo userDetail = userService.getInnerByUserId(dto.getUserId()).getData(); + if (ObjectUtil.isEmpty(userDetail)) { + baseVo.set(ThirdPayVoStatusEnum.USER_EXIST); + return baseVo; + } + // 钱包 + WalletManageEntity wallet = walletService.getWallet(dto.getUserId(), walletType).getData(); + if (ObjectUtil.isEmpty(wallet)) { + baseVo.set(ThirdPayVoStatusEnum.USER_EXIST); + return baseVo; + } + // 判断余额 + Integer balance = wallet.getBalance(); + int totalPrice = dto.getPrice(); + if (balance < totalPrice) { + baseVo.set(ThirdPayVoStatusEnum.BALANCE_NOT_ENOUGH); + return baseVo; + } + List products = dto.getProducts(); + for (PayDto.Product v : products) { + if (!ObjectUtil.isAllNotEmpty(v.getName(), v.getCount(), v.getPrice())) continue; + products.add(v); + } + String subject = "美好生活物品 * ?"; + Integer orderTotalPrice = dto.getPrice(); + Long parentCarId = null; + if (ObjectUtil.isNotEmpty(products)) { + subject = generateSubDesc(products); + orderTotalPrice = computeCartTotalPrice(products); + // 添加购物车 + parentCarId = hardCarService.createThiredPayCard(dto.getUserId(), defaultMch.getId(), products); + } + // 添加硬件订单 + HardOrderEntity orderObj = HardOrderEntity.builder() + .orderNo(dto.getThirdOrderId()) + .parentCarId(parentCarId) + .userId(dto.getUserId()) + .merchantId(defaultMch.getId()) + .merchantType(defaultMch.getTypes()) + .merchantDeptId(defaultMch.getDeptId()) + .userDeptId(userDetail.getSysUser().getDeptId()) + .sysType(HardTypeEnum.OTHER.getType()) + .orderStatus(HardOrderStatusEnum.CREATE.getType()) + .orderType(HardOrderTypeEnum.LB.getType()) + .payType(HardPayTypeEnum.WALLET_CARD.getType()) + .orderSourceTypeId(null) + .totalPrice(orderTotalPrice) + .extraPrice(0) + .payPrice(dto.getPrice()) + .isOfflineOrder(YesNoEnum.NO.getCode()) + .productDesc(subject) + .walletId(wallet.getId()) + .build(); + log.info("|{}|第三方支付订单参数|{}", TAG, JSONUtil.toJsonStr(orderObj)); + hardOrderService.save(orderObj); + hardOrderService.fastReduceBalance(orderObj); + // 返回 + baseVo.set(ThirdPayVoStatusEnum.SUCCESS); + PayVo payVo = new PayVo(); + payVo.setPayTime(LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.NORM_DATETIME_PATTERN)); + payVo.setThirdOrderId(dto.getThirdOrderId()); + payVo.setPlatformOrderId(String.valueOf(orderObj.getId())); + baseVo.setData(payVo); + return baseVo; + } catch (Exception e) { + log.error("|{}|第三方支付异常dto|{}|walletType|{}|error|{}|", TAG, JSONUtil.toJsonStr(dto), walletType, e.getMessage()); + baseVo.set(ThirdPayVoStatusEnum.UNKNOWN_ERROR); + return baseVo; + } + } + + /** + * 第三方退款 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public PayBaseVo walletRefund(RefundDto dto) { + PayBaseVo baseVo = new PayBaseVo(); + try { + // 查询用户 + UserInfo userDetail = userService.getInnerByUserId(dto.getUserId()).getData(); + if (ObjectUtil.isEmpty(userDetail)) { + baseVo.set(ThirdPayVoStatusEnum.USER_EXIST); + return baseVo; + } + HardOrderVo order = hardAfterSaleService.validateOrderCanRefund(Long.valueOf(dto.getPlatformOrderId())); + if (ObjectUtil.isEmpty(userDetail)) { + baseVo.set(ThirdPayVoStatusEnum.ORDER_EXIST); + return baseVo; + } + // 添加售后订单 + HardAfterSaleEntity saveObj = BeanUtils.toBean(dto, HardAfterSaleEntity.class); + saveObj.setType(HardSaleTypeEnum.AFTER_SALE.getType()); + saveObj.setStatus(HardSaleStatusEnum.COMPLETE.getStatus()); + saveObj.setNo(dto.getThirdRefundId()); + saveObj.setWay("10"); + saveObj.setOrderId(order.getId()); + saveObj.setRefundPrice(order.getPayPrice()); + saveObj.setUserId(order.getUserId()); + saveObj.setAuditUserId(null); + saveObj.setAuditTime(LocalDateTime.now()); + saveObj.setApplyReason("宁波银行(美好生活)api退款"); + saveObj.setAuditReason("宁波银行(美好生活)api退款"); + saveObj.setApplyDescription("宁波银行(美好生活)api退款"); + hardAfterSaleService.save(saveObj); + // 添加售后进度 + HardAfterSaleLogEntity saveLogObj = HardAfterSaleLogEntity.builder() + .afterSaleId(saveObj.getId()) + .userId(order.getUserId()) + .operateType(HardAfterSaleOperateTypeEnum.ADMIN_REFUND.getType()) + .beforeStatus(order.getOrderStatus()) + .afterStatus(HardSaleStatusEnum.COMPLETE.getStatus()) + .content(HardSaleStatusEnum.COMPLETE.getContent()) + .build(); + hardAfterSaleLogMapper.insert(saveLogObj); + // 执行退款 + hardAfterSaleService.refund(saveObj.getId(), "zy"); + // 返回 + RefundVo refundVo = new RefundVo(); + refundVo.setRefundTime(LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.NORM_DATETIME_PATTERN)); + refundVo.setThirdOrderId(order.getOrderNo()); + refundVo.setThirdRefundId(dto.getThirdRefundId()); + refundVo.setPlatformOrderId(dto.getPlatformOrderId()); + refundVo.setPlatformRefundId(String.valueOf(saveObj.getId())); + baseVo.set(ThirdPayVoStatusEnum.SUCCESS); + baseVo.setData(refundVo); + return baseVo; + } catch (Exception e) { + log.error("|{}|第三方退款dto|{}|error|{}|", TAG, JSONUtil.toJsonStr(dto), e.getMessage()); + baseVo.set(ThirdPayVoStatusEnum.UNKNOWN_ERROR); + return baseVo; + } + } + + /** + * 查询美好生活默认商户信息 + */ + private MchManageVo getLbDefaultMch() { + MchManageVo defaultMch = mchService.getById(lbCallbackConfig.getMchId()).getData(); + log.info("查询美好生活默认商户信息 mchId |{}|defaultMch{}", lbCallbackConfig.getMchId(), JSONUtil.toJsonStr(defaultMch)); + return defaultMch; + } + + /** + * 生成商品简介 + */ + private String generateSubDesc(List list) { + StringBuilder str = new StringBuilder(); + for (PayDto.Product v : list) { + str.append(v.getName()).append("x").append(v.getCount()).append(";"); + } + return str.toString(); + } + + /** + * 计算购物车总价 + */ + private int computeCartTotalPrice(List list) { + int totalPrice = 0; + for (PayDto.Product v : list) { + totalPrice += v.getPrice() * v.getCount(); + } + return totalPrice; + } +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayApiBizTypeEnum.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayApiBizTypeEnum.java index d7b2aa7bf..e7c3219a3 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayApiBizTypeEnum.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayApiBizTypeEnum.java @@ -12,9 +12,9 @@ import java.util.Arrays; @AllArgsConstructor @Getter public enum ThirdPayApiBizTypeEnum { - PAY("10", "支付"), REFUND("20", "退款"), + WALLET_INFO("30", "钱包详情"), ; private final String type; diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayVoStatusEnum.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayVoStatusEnum.java index ea1440ecf..057450c69 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayVoStatusEnum.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayVoStatusEnum.java @@ -18,7 +18,9 @@ public enum ThirdPayVoStatusEnum { PARAMS_ERROR(500, "参数错误"), USER_EXIST(501, "用户不存在"), ORDER_EXIST(502, "订单不存在"), + MCH_EXIST(503, "第三方商户未配置"), BALANCE_NOT_ENOUGH(505, "用户余额不足"), + UNKNOWN_ERROR(599, "未知错误,请联系管理员"), ; private final int type; diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayDto.java index ce233bd56..4bc2df1fb 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayDto.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayDto.java @@ -3,6 +3,8 @@ package com.bsd.pjcloud.thirdparty.dto.pay; import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPaySoureBizTypeEnum; import lombok.Data; +import java.util.List; + @Data public class PayDto { @@ -12,18 +14,43 @@ public class PayDto { private Long userId; /** - * 第三方唯一id + * 第三方订单唯一id */ private String thirdOrderId; - /** - * 第三方统一支付类型 - */ - private ThirdPaySoureBizTypeEnum bizType; - /** * 扣款金额(分) */ - private Integer money; + private Integer price; + /** + * 商品列表 + */ + private List products; + + + @Data + public static class Product { + + /** + * 商品名 + */ + private String name; + + /** + * 商品图片(网络可访问) + */ + private String pic; + + /** + * 商品价格(分) + */ + private Integer price; + + /** + * 商品数量 + */ + private Integer count; + + } } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/RefundDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/RefundDto.java index f0e03b7d7..64ef13c0e 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/RefundDto.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/RefundDto.java @@ -15,4 +15,14 @@ public class RefundDto { */ private String platformOrderId; + /** + * 第三方退款单号 + */ + private String thirdRefundId; + + /** + * 退款金额(单位分) + */ + private Integer price; + } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayVo.java index 285bd327d..a33f7954b 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayVo.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayVo.java @@ -18,8 +18,8 @@ public class PayVo { private String thirdOrderId; /** - * 平台支付时间 + * 平台支付时间(yyyy-MM-dd HH:mm:ss格式) */ - private LocalDateTime payTime; + private String payTime; } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayWalletInfoVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayWalletInfoVo.java index 6cad81f66..ae7a21059 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayWalletInfoVo.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayWalletInfoVo.java @@ -5,6 +5,11 @@ import lombok.Data; @Data public class PayWalletInfoVo { + /** + * 用户id + */ + private String userId; + /** * sm4加密后的手机号 */ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/RefundVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/RefundVo.java index df4074534..106b4b8e0 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/RefundVo.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/RefundVo.java @@ -2,7 +2,6 @@ package com.bsd.pjcloud.thirdparty.vo.pay; import lombok.Data; -import java.time.LocalDateTime; @Data public class RefundVo { @@ -22,9 +21,19 @@ public class RefundVo { */ private String thirdOrderId; + /** + * 第三方唯一退款单号 + */ + private String thirdRefundId; + + /** + * 退款金额(单位分) + */ + private Integer price; + /** * 退款时间 */ - private LocalDateTime refundTime; + private String refundTime; } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayApiController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayApiController.java index 70d4a1902..36805d2d1 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayApiController.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayApiController.java @@ -7,7 +7,9 @@ import com.bsd.pjcloud.thirdparty.dto.pay.PayGetWalletInfoDto; import com.bsd.pjcloud.thirdparty.service.ThirdPayApiService; import com.bsd.pjcloud.thirdparty.service.ThirdPayLogService; import com.bsd.pjcloud.thirdparty.vo.pay.PayBaseVo; +import com.bsd.pjcloud.thirdparty.vo.pay.PayVo; import com.bsd.pjcloud.thirdparty.vo.pay.PayWalletInfoVo; +import com.bsd.pjcloud.thirdparty.vo.pay.RefundVo; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; @@ -39,8 +41,21 @@ public class ThirdPayApiController { return thirdPayApiService.getWalletInfo(body, headers); } + @Inner(value = false) + @Operation(summary = "通过userId扣款", description = "通过userId扣款") + @PostMapping("/wallet-pay") + public PayBaseVo walletPay(HttpEntity httpEntity, @RequestHeader Map headers) { + String body = httpEntity.getBody(); + return thirdPayApiService.walletPay(body, headers); + } - + @Inner(value = false) + @Operation(summary = "退款", description = "退款") + @PostMapping("/wallet-refund") + public PayBaseVo walletRefund(HttpEntity httpEntity, @RequestHeader Map headers) { + String body = httpEntity.getBody(); + return thirdPayApiService.walletRefund(body, headers); + } } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayApiService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayApiService.java index 66e027031..350370b9e 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayApiService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayApiService.java @@ -11,14 +11,14 @@ import java.util.Map; public interface ThirdPayApiService { /** - * 扣款 + * 通过userId扣款 */ - PayVo pay(PayDto dto); + PayBaseVo walletPay(String json, Map headers); /** * 退款 */ - RefundVo refund(RefundDto dto); + PayBaseVo walletRefund(String json, Map headers); /** * 根据加密的手机号查询用户钱包信息 diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdKeyManageServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdKeyManageServiceImpl.java index a018dd209..d18ebc973 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdKeyManageServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdKeyManageServiceImpl.java @@ -1,6 +1,7 @@ package com.bsd.pjcloud.thirdparty.service.impl; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bsd.pjcloud.thirdparty.constant.ThirdKeyTypeEnum; @@ -19,13 +20,14 @@ import java.util.Map; /** * 第三方密钥管理 */ - @Service @Validated @Slf4j @RequiredArgsConstructor public class ThirdKeyManageServiceImpl extends ServiceImpl implements ThirdKeyManageService { + private static final String TAG = "第三方密钥管理"; + /** * 新增 */ @@ -61,38 +63,43 @@ public class ThirdKeyManageServiceImpl extends ServiceImpl headers) { - Map transitionHeader = new LinkedHashMap<>(); - for (Map.Entry entry : headers.entrySet()) { - transitionHeader.put(entry.getKey().toUpperCase(), entry.getValue()); - } - // 验签 - String appKey = transitionHeader.get("APP-KEY"); - String bizType = transitionHeader.get("BIZ-TYPE"); - String timestamp = transitionHeader.get("TIMESTAMP"); - String sign = transitionHeader.get("SIGN"); - if (!ObjectUtil.isAllNotEmpty(appKey, bizType, timestamp, sign)) { + try { + Map transitionHeader = new LinkedHashMap<>(); + for (Map.Entry entry : headers.entrySet()) { + transitionHeader.put(entry.getKey().toUpperCase(), entry.getValue()); + } + // 验签 + String appKey = transitionHeader.get("APP-KEY"); + String bizType = transitionHeader.get("BIZ-TYPE"); + String timestamp = transitionHeader.get("TIMESTAMP"); + String sign = transitionHeader.get("SIGN"); + if (!ObjectUtil.isAllNotEmpty(appKey, bizType, timestamp, sign)) { + return null; + } + // 判断bizType + ThirdKeyTypeEnum keyType = ThirdKeyTypeEnum.valueOfByType(bizType); + if (ObjectUtil.isEmpty(keyType)) { + return null; + } + // 查询配置 + ThirdKeyManageEntity keyManage = get(keyType); + if (ObjectUtil.isEmpty(keyManage)) { + return null; + } + if (ObjectUtil.notEqual(appKey, keyManage.getAppKey())) { + return null; + } + // 计算签名 + String signStr = String.format("%s%s%s%s%s", keyManage.getAppKey(), keyManage.getAppSecret(), keyManage.getBizType(), timestamp, json); + String successSignMd5 = DigestUtils.md5Hex(signStr); + if (ObjectUtil.notEqual(successSignMd5.toLowerCase(), sign.toLowerCase())) { + return null; + } + return keyManage; + } catch (Exception e) { + log.error("|{}|checkSign意外的错误,加密参数|{}|", TAG, JSONUtil.toJsonStr(json), e); return null; } - // 判断bizType - ThirdKeyTypeEnum keyType = ThirdKeyTypeEnum.valueOfByType(bizType); - if (ObjectUtil.isEmpty(keyType)) { - return null; - } - // 查询配置 - ThirdKeyManageEntity keyManage = get(keyType); - if (ObjectUtil.isEmpty(keyManage)) { - return null; - } - if (ObjectUtil.notEqual(appKey, keyManage.getAppKey())) { - return null; - } - // 计算签名 - String signStr = String.format("%s%s%s%s%s", keyManage.getAppKey(), keyManage.getAppSecret(), keyManage.getBizType(), timestamp, json); - String successSignMd5 = DigestUtils.md5Hex(signStr); - if (ObjectUtil.notEqual(successSignMd5.toLowerCase(), sign.toLowerCase())) { - return null; - } - return keyManage; } /** diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayApiServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayApiServiceImpl.java index 9839c3d6f..437242f92 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayApiServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayApiServiceImpl.java @@ -2,8 +2,10 @@ package com.bsd.pjcloud.thirdparty.service.impl.pay; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; -import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.hard.api.feign.RemoteHardOrderService; +import com.bsd.pjcloud.hard.api.feign.RemoteHardThirdPayService; import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayApiBizTypeEnum; +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPaySoureBizTypeEnum; import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayVoStatusEnum; import com.bsd.pjcloud.thirdparty.dto.pay.PayDto; import com.bsd.pjcloud.thirdparty.dto.pay.PayGetWalletInfoDto; @@ -23,7 +25,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import java.util.Arrays; import java.util.Map; /** @@ -40,48 +41,106 @@ public class ThirdPayApiServiceImpl implements ThirdPayApiService { private final ThirdKeyManageService keyManageService; private final ThirdPayLogService payLogService; - private final RemoteWalletService remoteWalletService; + private final RemoteWalletService walletService; + private final RemoteHardOrderService hardOrderService; + private final RemoteHardThirdPayService hardThirdPayService; /** - * 扣款 + * 通过userId扣款 */ @Override - public PayVo pay(PayDto dto) { + public PayBaseVo walletPay(String json, Map headers) { long startTime = System.currentTimeMillis(); - ThirdPayLogEntity logObj = ThirdPayLogEntity.builder().apiUrl("/pay").bizType(ThirdPayApiBizTypeEnum.PAY.getType()).req(JSONUtil.toJsonStr(dto)).build(); - PayVo vo = new PayVo(); - try { - - } catch (Exception e) { - String error = String.format("|%s||pay|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); - log.error(error); - logObj.setError(error); - } finally { + ThirdPayLogEntity logObj = ThirdPayLogEntity.builder().apiUrl("/third/third-pay-api/wallet-pay").bizType(ThirdPayApiBizTypeEnum.PAY.getType()).paySourceType(ThirdPaySoureBizTypeEnum.LB.getType()).req(json).build(); + // 开始处理 + PayBaseVo baseVo = new PayBaseVo(); + ThirdKeyManageEntity keySetting = keyManageService.checkSignAndReturnConfig(json, headers); + if (ObjectUtil.isEmpty(keySetting)) { + baseVo.set(ThirdPayVoStatusEnum.SIGN_ERROR); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); payLogService.save(logObj); + return baseVo; + } + PayDto dto = JSONUtil.toBean(json, PayDto.class); + if (ObjectUtil.isEmpty(dto)) { + baseVo.set(ThirdPayVoStatusEnum.PARAMS_ERROR); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + // 开始支付 + try { + PayBaseVo payVoPayBaseVo = hardThirdPayService.walletPay(dto, WalletTypeEnum.PAY); + if (ObjectUtil.isEmpty(payVoPayBaseVo)) { + throw new RuntimeException("支付失败"); + } + // 日志 + logObj.setRes(JSONUtil.toJsonStr(payVoPayBaseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return payVoPayBaseVo; + } catch (Exception e) { + log.error("|{}|通过userId扣款错误,json|{}|headers|{}|", TAG, json, headers, e); + baseVo.set(ThirdPayVoStatusEnum.UNKNOWN_ERROR); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; } - return vo; } /** * 退款 */ @Override - public RefundVo refund(RefundDto dto) { + public PayBaseVo walletRefund(String json, Map headers) { long startTime = System.currentTimeMillis(); - ThirdPayLogEntity logObj = ThirdPayLogEntity.builder().apiUrl("/refund").bizType(ThirdPayApiBizTypeEnum.REFUND.getType()).req(JSONUtil.toJsonStr(dto)).build(); - RefundVo vo = new RefundVo(); - try { - - } catch (Exception e) { - String error = String.format("|%s||refund|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); - log.error(error); - logObj.setError(error); - } finally { + ThirdPayLogEntity logObj = ThirdPayLogEntity.builder().apiUrl("/third/third-pay-api/wallet-refund").bizType(ThirdPayApiBizTypeEnum.REFUND.getType()).paySourceType(ThirdPaySoureBizTypeEnum.LB.getType()).req(json).build(); + // 开始处理 + PayBaseVo baseVo = new PayBaseVo(); + ThirdKeyManageEntity keySetting = keyManageService.checkSignAndReturnConfig(json, headers); + if (ObjectUtil.isEmpty(keySetting)) { + baseVo.set(ThirdPayVoStatusEnum.SIGN_ERROR); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); payLogService.save(logObj); + return baseVo; + } + RefundDto dto = JSONUtil.toBean(json, RefundDto.class); + if (ObjectUtil.isEmpty(dto)) { + baseVo.set(ThirdPayVoStatusEnum.PARAMS_ERROR); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + // 开始退款 + try { + PayBaseVo payVoPayBaseVo = hardThirdPayService.walletRefund(dto); + if (ObjectUtil.isEmpty(payVoPayBaseVo)) { + throw new RuntimeException("退款失败"); + } + // 日志 + logObj.setRes(JSONUtil.toJsonStr(payVoPayBaseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return payVoPayBaseVo; + } catch (Exception e) { + log.error("|{}|退款,json|{}|headers|{}|", TAG, json, headers, e); + baseVo.set(ThirdPayVoStatusEnum.UNKNOWN_ERROR); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; } - return vo; } /** @@ -89,27 +148,47 @@ public class ThirdPayApiServiceImpl implements ThirdPayApiService { */ @Override public PayBaseVo getWalletInfo(String json, Map headers) { + // 日志 + long startTime = System.currentTimeMillis(); + ThirdPayLogEntity logObj = ThirdPayLogEntity.builder().apiUrl("/third/third-pay-api/user-wallet").bizType(ThirdPayApiBizTypeEnum.WALLET_INFO.getType()).req(json).paySourceType(ThirdPaySoureBizTypeEnum.LB.getType()).build(); + // 开始处理 PayBaseVo baseVo = new PayBaseVo(); ThirdKeyManageEntity keySetting = keyManageService.checkSignAndReturnConfig(json, headers); if (ObjectUtil.isEmpty(keySetting)) { baseVo.set(ThirdPayVoStatusEnum.SIGN_ERROR); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); return baseVo; } PayGetWalletInfoDto dto = JSONUtil.toBean(json, PayGetWalletInfoDto.class); if (ObjectUtil.isEmpty(dto)) { baseVo.set(ThirdPayVoStatusEnum.PARAMS_ERROR); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); return baseVo; } // 手机号解密 String phone = LbRetailSignUtils.sm4Decrypt(dto.getSignPhone(), keySetting.getFieldKey()); if (ObjectUtil.isEmpty(phone)) { baseVo.set(ThirdPayVoStatusEnum.PARAMS_ERROR); - baseVo.setMessage("手机号解迷失败"); + baseVo.setMessage("手机号解析失败"); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); return baseVo; } - WalletManageVo userWallet = remoteWalletService.getWalletByUserPhone(phone, WalletTypeEnum.EAT).getData(); + WalletManageVo userWallet = walletService.getWalletByUserPhone(phone, WalletTypeEnum.EAT).getData(); if (ObjectUtil.isEmpty(userWallet)) { baseVo.set(ThirdPayVoStatusEnum.USER_EXIST); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); return baseVo; } PayGetWalletInfoVo result = new PayGetWalletInfoVo(); @@ -119,6 +198,10 @@ public class ThirdPayApiServiceImpl implements ThirdPayApiService { // 返回成功的参数 baseVo.set(ThirdPayVoStatusEnum.SUCCESS); baseVo.setData(result); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); return baseVo; } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/doc/第三方支付文档.wps b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/doc/第三方支付文档.wps index 07d533bc13a8bd9d86135a7dca9fa41a4d45e313..b19729746e8b43fbd42a854e7eb9bf427a22f25e 100644 GIT binary patch literal 83968 zcmeI53w#viz4!lnNp=GS0)k>hU1^L|xrB>|h!}y|2pU3&pn}{JxkR84@q(9#QK?X+ zmMW!Qz@o>G^;nMD)9Ue~Xg%0kZPh9trM?;|@_PJmG_QwOtuMOo_dlCSW;eStyO}Jx zxRcK}bA9Hy{Ql2>o_S_=p4b1{yMFt><$su+;}xBD8UN+H@#2$j!#R>2SvUUc5f7N_ zc_R0-?168?;jnJr4i5sWnW>YMz`=)JklWYi_(l4bJ+C5)pe$2R?JZ(Ctz)3GNPhuG{Vi8yF#)$TAHn)A(t{A~ zKK+LD{kq*#(YgeTCD;xa+`8ax8tQe<)~!v?nBJ4kMfY*(jUsdQR+NBOdbEL;YDL7E zAYG^ghD%5uTKJFY+sbcP`_hk(Ezgyge>&*Okd(<(nJyLVeY&#O+%GpwsP-1+N{Lj; zd|AZ*RqPp3`v0!jR{rAjm6ci34=%_L=gLG`A=x1vWl_ww!KPgkC_ zc;i;xrf0f>7*?}1pQV*-8!n^yE8=g2oWas?8O7F%re8QUKm6u38Y+^SA+n5+*RWn9 z6F9n>zr`$HK^jjd+_^GS&Sd{pdd@2&@xH$Bms8)pLCfRmNi+V=rQR ze(Cn|wbyN!nR9t_xJ7Ia5JPks)~yLO=AtTQjaKw=pNvIp;z& zspL$-aJ;nUppK?mV_QIpFCx7mO1p6Fh|*lyzTuv=PglNOogdDg{o?eVrCQQ;YgE~s zg&|qn7|Rr+w62%JrY+WZBikdXGr@j>}zS4ImTHc z<)Fu`m4VpsVxvw}vOE?pzzVNGuTq&JGvrbu_EOTJsjorFOAI|PWzRH@zMiw>%CY5< zGOb$^(Rke@-AnVsy2q)s3SE~=p-~F@U-PSRM%P8PANRS;rFKVr*Vb9*W5Xk4C^3fQ zqs#Yg7l0 zKE$y7CG5M>2)BwYSFuffh1RxQ!&BvlTgIxjM}12#C|r8} z+B-@^XrM}m^DW{`>Z1e1zJU6q9?OhdkF8s?vU2&t zf6kh}(R#FV>6yBmPYlsHQY%$0=YRSVY-@%I2N4Jf=TCLQyX46`m<4VqAk}Kop znl#m@Pufa|sM6A!2d~X3eY*0&4Hr!xc9E2tDy=kZzGb;-df)izeOsE#?YnI8+K$q? zR7Fi%g#r)@9T9 zW$CkZZ3k81ua{HzO^a`iu`MmWEtE)P^P1v_&1=im^cNYscW3vpij`YzC6TW(YmX|@ zcJ)WE?kzoCeARVpq#m{Oq*iNhu8(?UvHm5zWu;>`5Bk8VFc^ly1yBm>;dZzK{_nxp z{=-_AazB|m*(YT%4d%d#L7w?+9)GHooGMq8vG#F7uHWTc~mrW!_?A zH`R3$+zngcUf2eYz@zXOJPQY2duqpq>gi*TGZc1L#;IFGf)J7}8%hwLjm@55Z{?Eu z8IME=$x&^0!JF_Fd<>t!r_cbO!xwPi<=<_&amB1D`a~ktDfOHGTsf^ZwZ7S8oUGbi4&8;eFP{W8%G5MY+a*B=n=40qmW~8e z<8AN=JPOaibFd5Eg!&gAym`?NMmCGts-^G6uNy|Gm{lsa9O5<@6Iyb5L#JkAZJY9R z#w`KW_!Bq?ejHsk6vAK_0b{_hf$~Ww+e;s-Kx(b_<7_OXHP(|_?C#RuwxQeBdhGq1 z1XW+X>!^S^@EAM}Pry^K3;z2rzu6=%E&{RT)A}3^;6^fzvIC5ZwdqLA)?bUe!PG;i z`))F|x*aFy{SxOqnOY-3)%PXX4+r2Y_!yio~U|7D#_ zA7y|2x8Lhd?R3^4w?5u&_}G$(wZ+t|Dc1Yh*Fg!Yz7;S7E``~!2&&*(sDn42_*u~Lo>tors=m*_v+zfF1>T2xI0#KAw3vi8bl^JmHhLn5Al5|8R@iM1Ac%cQrug~yV(ec18(wc~BG zUb*7!j~8Qt<688iCpfM}4&oi>RIBXE$z5p4Q~j!8C9HyL;X0^=I{4uE2Wsb?dy+a4@I(F=aU$Du$+tj-aF9Fr~Zs1iZ*#Qs3Bk(A^2@mu#z@SDe5J#Ma-~ z_KUs$inZXlq3sony2>2s@a}T&w(aOt|D5bcf~xO9Xn;d-7`_F6Px=DkgI(Khn(yTQ zZR?;@8rqAo4UUF34MX zozkCn>q%?faZ0@eRO8Vw2FAiTsDh=i3iSG)(DfTu;ky3VmVi?Z+Bf!C>uJT+$2Rxr zu01^eL*p8#g>_H|x58%F0!I7KMg7m{r*F6=y7!5-pV)h3xB5Gkz64a`ZSWvG0*}Ju zuoHd{^!=?{FyVU%{eNUf`(DK;#ZKG?bmzg`g_eM7{0uw?FT!8ob=U*%0PVk<7oAt= zpnqhylMYVSd{zq`n_m}o3hQKnM)*Y4P{ugLoG_$Qo}Fr-Q@V}tX^UL~s_|ZU5B9^y z@HHHUAfId4_lJjXTU;_IDgE`JSdSKaMRd~9DSQ&;8FfXCjo-dJoz!T(6?M#bC7>F2 zgC5Wm20|eWg(5Ke|0WEy)!#`oC(Wt%F`6Y`@15dKue~_M?v!(<@J^|B3hxv@FPo$B zI2aGbFab)T9Ogml?f=wjoKp^*N+9<7cVuICn|i14PWrhGF9Fqf0W5~4Pz}rBI;e$I z+y8OP-=+ne(a-uzm)O#CtG`q2k$`Hv4sM4#U=!R6PrzRI6dK@bI1GNi29pi-dtQC< zS9O&o6UGeHj~2DrlQ~*q_Sb@hZ6SA-0R}?-u5GpR&$Yk)lLqJeuY_s9hdGC~_aM&UTOE56HPAVBo7A^&?j@ia z7s3b_1!G|xjE7?Q;DzlsFP!Lf|L^uXdad%)>hFw`dx3=dtyqj{DfNFd-+zxlZ7T5~g;6X6jf9E>Y zf4elK+5Tf%3(-F^c8c3=**k@IYxi!$JLO*js__nZ7#@e6@B};szlRV1@X&2brkrMb z|KD<_Q@J>$D_!>FRG#0pcJ`6#=R@?*fARh+6AmI5=O7DNf=HAKElmAYwzEk?0t~jo($5rV`Ks7!U z2E$Oe7-qvFr~;$^Kc)A-VlAM3OQ2)N?$&yo!aLPI38==apa#~!)o?4^4tGJO|38)Y zH&V5IxB9saF9FqfGi-%>VH-RMkHTY6&;9>==jVT!79gJovH1zRP5Z}P3((#5LjtPt zPIwC5gtwp`_Q8H#-nD(*qDiN;yv2*V#qK={`<5t{Y->YKo{T%UnDEIzLv~WYh&y2m z&RuAyd?#`Jiph6$4~TuKOF%U~0Egf!$m_#%05}0c5PAR0zW?8?7fN?{r!sVk-zmI1 z3uw>K5>Sl?LII3|F>oG~Km{26e@XxTC-(a1RBN3|zP-acDeshix8dF9-zk0xsKztk zVz?BlU@26?a<~?*1LHnm#sw3`#P$2hZ%pu9v(>+-bgKZh&-M<=D8Yoj-)-#a4)0_? zlB3$Lhx=hS)WbeF2%o|i@D+RuTnlcwQGes>!U&waoqc(yU_C9Kl*bEe{Y~(9@y!G2 zrn<^eyw?HQ&=c~YFZ73`?*E-zAZcs=QiD2h>`wL1ZR*{Imw;+q0EI9ZhC&gHfU)r5 z3%}y|e@B1*+unZE&2uBCv^&|5o46&Q8jpwBFb9@GH7tjfK>fdIe%jyvu*-u}8>T(W z&u!f89bN*e@eQyJHo_gS8SaKHpzZ(pX|Mlw`lr+W+q?Xo;&*HNPT~3e7aDJc$6zNs z3(vtzup3?h-T_)C3let%k_%VYV7KAjwJF^`Lv_;7$$s62cT;yHsQSJNZ^0he3-7}L z_!x}e|0kB-xbbt!fs+-wz6Wz=ICoKZOSP91ejFqw9wtsQ*vp_y4gy zKu+4XyY1NC{kyHZZgcN8ey8yK{tJ!!Kwk*KKq!DhCoUFH_hnIkATmiFT4lIRgSPm<}?fV~Y6>uBAy%lgufBV)S+W%;L1FVDFVI$lH zn_&y+^S`9t|95o_c6%LjcMW%^fxFO79wfc?L;D|%x59(410I3L;1zfkBJDq?_rIOW z->8KNd(qv6ZeQE!+_6hQHGT*7!h7&O9E1kQ>!Kn0lKuYUk#7Av*_+#|zmxY(cl_y2zXVj{GAM^RFb@{M zBB+7Rt$%0N&#nGW;U%CNUk&S^4sM5ya0hGx^w0GFC;k1dSpVl#{^|A~PWCSW)%Zbp z7#@e6@GLwByFlxIrvE=t)3v?zbBfT9?e#%5y3*m6dGlp{f%ppK=mO9A zRUXpUzph{4*t*R#jb(|F3^1)l5z$tsW@1v0TfW=s<4 zRYwa8W={H}^sd|CnFn%&!v(#OWQv??q)W0@=lkKe9ZsGum!R`|#W9Y8MVimj-AG`J zF)Ak;8>TjIC^R;dHE%e@*f6bm!>j^1Y6o4o1=5$9X=gp_L@onc>-MPjI^MI6^*qvA zm}N$SiqssdncK$mXCocQm=$g8j64~&CtExoAGeyi;Pq8U7X0RxAX~Eb^!HOS z<8joUA}uoAmFzsQx!l+H3t!DiX63FN<;fkrspsZ?fnJ+8_YCeiPkfuh*W_&M6FjNb zIBoR5WVd3g!ob0bv?yvj`95*`s+B*2O}{>{{PLoGQ_%)#PY)#$tfkq z431zgxsy(**Er+4;!bY8msiz?25FNy?jO-Mb5+}dnQ_aVNjsso}QT6`_ z=$}zDs-1A8uM$4hT*rK039F#XUH`jAJx$q5M($gEz5<{9^<=57gt=5%0tt&TJSFW(G%(kwiw9Ge4THb@qoFvWn)@^YF zrO+}KaXzzoU+;|*JemH0BNZ;F`Wj>WGS@L*b=*%K3sT2{)G;6@Fcy@K`M3adyhj}? zP{#@U)GF5hvaY;pUHK2|%1-MFj=y<|>O$Jqyj|oz>q?Y`ZL#k8v32EI>q?wuK4aTb z)TU};zn9xG?x(c-B0>BgFyZIK=wDqQpZye=QNr^TiLEjJzCa#PNpV5Emf`*;TF zsS@|`H1A!R{Gmp>-{08p^L19F-)DJtq~GT>UHAEY|I8Dw>aJsc>Uf_ofsO^4*blr( zVw$FSH-wL7%)sdJNzM$CRLQ>Px!Egz)mz8?)G zTlZv^TbF+Y>=|N6MBwbPVX&pNk<${r?cx!DTkKq6E^Xu>G0EuX^iP zuQ~>(j{m7+e^yv?@B{10XzNOx_Md%hZuUyMwk*4VKMbC3@Lj=>%<&jKb!V;yg;T>A|rs$GL@UlWT|gRc{^Z^%>X|t9?`-P}IF&wA`7s zw3dKQ@ z|0nhVnf6}_HOBr>H+9%eSn;dgI_7Vt{+kNbnhTbB*XsYZ)_>Jr$9mQ=fO|p#Wa_^~ z`XjRFrVhIaD}L2m$9vXsfOQPuDc1asv#t!Wt|YO{$y)!E^~p>FgCcJI1EwVJ4#cOL z>zL1FpkqEKuKTI#FBuJud$?9VBur96L~DIL^Qq=K{K-uD{!79O zCU*#h-f9iqgcZN)ZH@u0V?XOy&pOU?)ODcPnv1ioDlXDa^xME`29UTG(*Kig-yvD5b#`84{O7*Rb=>CyIBeDOzpX3pTUY*SUD;(_$t)*T0u+C{)cnSp znWb76LZ`m}%e?;+`}&Y=+rjewk4Lp11v=)pjs-m#8myKZ^={{1tb3lfu4I;5Qvycq zPxwxq{obS0b7q-jCM(Pv3H`qDu|GKL05T9!P7U($O`=PvRsr_WsXO|9z_YP`DIkL*lyM z+3)|ls)qJ8$$qc+RP!pRfvaIXB({O5Hekm8yYl(g!1gMoZ?E`O@7rNB+zV0uzu20_ z;ntNDmhDsDIqv_us_zh=YW^TR22Vhebw36DGl#k@0s9){X0P~E^QWL|-2Xk4)vL!T zncsi%=9qr>(fs{?Z~fgr-+f%#`1}9OU@-z z|E;Cb#>;N%zkS$f?{IGd?;w8FdkmDo42Wv~XZn8{KQPqP{_iXejAXC>KGpnESPV;{ z8ltZMQT@MBeL$z#R0a?GI_mr1T}(rJKVZLC{HphIxDNKgr|=aB4kR1$;Ar^9D)!gb zmCvjzQJ0SYvhLYyUHP+hzgky1^|F1*r*CiM&CbU6JL7(Ru<^}nt)n@rZGY(0 z?Z2kS^IEk>XTJXybN^@a{Wp(lUkF2C1dM|y|DS39rO^u+UZ9olNFr1ly#J|skB2!> z4Q<^1Yh~U#THB%1Ihd&SpH2Puspc!87S=&j-A~;1OQudd*|C1Z*;O@k<3q%!n%@C; z!&Z1465GI=R^2nt|E#6qYT1p3Zo-OR_1+23!ET81|Hal!4Y#hOuxz9+aSvqN7HY=- zr}OuJmf!#QRP$G154;CS*8LRp&m8Ku1ng^&o4w*w&EJPkegD_gJ*VIQ&V2tBd$Vo- zS>FHhsP-Rgy@x~K?VGd@$Xx&3R_vzmZtAd`u;N#}{m>T%Le%v?)Bhja|KC|0OtSUg zrwi?=f0O0fEIiq#Dwk@s81aE9`(rA<4RLHH^%1noGb<4Yv;~KGpm& z=oi$_Heg|D~~Z+t*I}z1*xvz8vN1{ZB)0 zG|$w3Q|4N8!7}f6|8$lHMpWN{&Gp}>nlFMia5Y3-`@7Wh|E7DmE~cRyFCjkFybdCnsi zF8ruoQA67nEYcL0?hf)_Kjbeb8yluJZzwc2lr?WS#n>>ddBdy%Icf(VRwPnmt@j+_`ROXy@*8Pudv_d~egXtbxo6n4i2;cdbnva6H@5!EqzFz-_wgCp&- zA4xpeoYqO>Jd%^Y+is zC`OqFAt-`kD1&*h5^7-+BnoGq*PMqqwl(MZu7|snqW?c(uQ11RMJBH-Ty|TfNOx8v zKe8EKK_Q^EnbMQ&?C-;{rC0@CrB*(uRmY4X0H88it@XpGC!9kI+)McoM(5+)?47wQvcGeRoXuWEXg{3OvPynv#i= z2g~Wfo2HZu#ik{_80Xh>TBiazxA^n$cA-$4rfhlV{v8{ByX@?` znX{%()y<`{r1*crPco;N8YjOjugc%Fc>TD=B7_h%F%EPsJR~t`Jm6N2Eg%f0-OjTI0**A_dqS|WS|OB z+tg-6RN+(MG*BxT0z+XK6v1#90V81)oDMqj`57<<&V;dW7HAjw*)Sf?fnqopCcs3X zB8v{8eIBUBTi||p6n4QO7=*^m)1VxtLj_y}cw3=z%EfRA z;Mrvs%!bPVuPJk39?XXYun-mjPMQD~H^Dl%8S3B`xD{@L_3&f39X7y5_zBzrcfuy{qN6b#$~I=0 z6CGFZL;ofZyS-VyEPqyx&mZn4^%F@E8;$9CkJ{>&A5@UVE6Db02~n_>Bs@fcu3+1I zBco??o?Cs5fox_Q45xj5^(UoOr5k2#ES+LVa8UuN2zq;EdA(l0&+9i&V5Z`M#)XN* zR!vG4P?%ceC8VU9f~=%ammtpk#?)QO7Al&{Uj>Ko3Lcg zHPWK#qN*D)dOg`W*&dyq_e$;8*Zp;jx+R^=7~i;GFI`#+LrUMcKT-xxC1{3?pW1Mk z8W%NrB{VmuBJw|KN8?I}+0FF7Gl-`Vsk^yzKpxw_oV!(6OQ8LxrKy13g9F zB41HfQBG0!qTHfhMZJsq6&+LL346nVa89^KxMw&&d|dd%@Y&(w@a*tq;W^>@aC7`e zW@!*^VJ&Iz9~uw}7IiD?QPi_2uc&X)(M3VhcUE{-_`~o=u2U5ZY|DB|?iJ5XeTt4q zzIGk{#-?(VX&S!Y5bouX0+t`KIaH6#pZcx(EaQTx^XAD@>ygj!I*LweGv=~6&tbb7 zkGiFgz?_cz$7emS^{hB2cfprSG=`ji`{Krbul)Kqcg_9JCl3^U`r4@bzWhLsZS-mb z)e`j%zZdsTA>AR_4H&q1Ik8vgpvNe>O#98-pnf+`f(;tEaR4dlCB6n#f%aX)Am$#) z(a)c^n7q=>2&bvfVy_;rZH7LL+dY~quE8UvdxKWc=V@#AmN4-LRcytuIJUZ<4jsH(}g=QS{+r!rLK~;$!O9r9NW_WLuqrKX{^nq z6*-*NNfM3rgGo_vrZH>9DKgV zo<;>Q zOF(b+^ja6fODt!;%D7`i*d(W;@s?)p)sC`r^nc{q&Fnm5CFb8RSua)x$TXAKSK%Ee zF<*$U)LT(aN3v7Ccs*wPI!`v-NTW%q{XG@jTrR*vS0)=Y>bRc7Z`Pe;rmC*p z4QhMmqkffP6S_rj{#O{?5Rs!>{vXtsfAv|(#;@u9qyA&cYGHY)rDqKJ*Lck-a#s8Q z+O~bYF@F0a)4x}fVdwuft#>Lwt^mWFZ25vmvwzxjwk29dB-k+FnOW2Tl- zx)R1o(vAgg>hq5jf7W5t@dwWVVp2rMv8{i!HZ@LSGG^mAos4bONt)KN2KqfKOz`a{ zGCt-r?{eS0_nddmx#ym@!5&?3MC!?Oa>iIC2w!s;TZsnsjZaKWP~WQ4H79v*yS7iV zO0Dt2E~Oi@x6^}1*N~j&=JQ0Wlx=zyJty>xJ-Un2nsi;Ak+HdGEw(#j82c0hzL~sF zPG@%vjP2$a;@72^7?WtQ&4OueS}l&T7KyR#xO?&c#~7R_^7OCk+A!i6TEnq+^#2GX zhx>nmmI19}x?+rQD0%ufxoDK)l(R8|8l`R48lC8l&lGdb3A0{9sqPM98HRJ*h8# z&(ol_P>fr>qS_fo8Bg=`D8t)qxlww*6=4zMww@=9xMM%88nM%%HiR=PT};eN(Y41i z)-7y~wIZ}UPwbm-eB#X0$xdN+Zhhjooet+h7SoOO_kw|}i z2+9z??WJPOML0xglRZk?mq~N3fG@ypAR)@Mzzr6GT=1_ypX~W*t#&l-otF?B$qUs@I<}R|T zdSS@QSQ3)}YQY-tBB%pRU<23&LW5%K3x&*5;$OtuTaeAzvz3Vv-j7t|bn<+0Cp%6h zHZn3J-LW%ghZtL^b{iCa#y|>nfe~;PTmpXtpMo3UHekrJaR9q-@9yr7btN{@=&2Ib zF0D$JNXcZX6Rp)E*QS;psdr=#l0p%SBhjV62g*S$SOXeBBWMCGU^56^AKABS6RTfl z6TYUoD)pRYYTuH2dvh(e?{@`_n#`$|B?k6#MXdH!&{m-}Yz6fOjy!EmivGwi&b!>w z5}a6TQ#3R*XOT^<7q(y=X-`L9JJ<#~Kqu$|Z-dXy?GFaZoT5fb6TV`#H3Q8a@n%q+ zjw4?TtfH81U*b3D00?leCd>+yBbYmiC1^3r10Xo7zx;s(lU?qlXv+mmM=0d{ zS%i1XT~M(AsuY4EPz*MJ7SIm1K*a{Ng#t5KdIn=YZ~n0eMsALBml$8BPw9mCAm{?! zpbzW;{lZqVL}j!nulDrvBh4K)Q$J+y2S>mFI1WyLAuwW6>`jB}nlD_3mFZI7$A~fT z0k{f6;3l|*S#>wL{TAAP2M@qFFva5p1Xf^=SM2pS`FuOt4v-GAffx9IA5?(p38#Ab zs0db!qe7!6m0%U90`;H~G=UA^vvd2fkJ53%A_LE$QaI4%7AqRw6T!}4DvO~Nnn4TL z3|hh6n;-rOMScetXLlzTrO;U!02{+6=a$R(USQ#`nD2gKf40&gYFw7SU+X2N9qcif zbZsaG+ZAK~SKLW8E!BxsA5v{dRT|YpR0C0svPN<4FXiG~Z;t5fZO>;0DmSRqpz?xB z3p&^7=%izlj!ZhI=zN+wn>LFj2OGrMgGSG9=&+x<-kNIA{f%k=$YvkU5w9GZCvp#I zMdKlh=(uDR<%ixi&89#mjlqn%o zGQI#VD&~Q^Jdv^?WkSk=lmRK5-BS{e{)5NfLz9x)LnZb&7NERFIgOHy1tcrx6L-0p zat`Gh+TgUgn-%jZbT^|(dwdI^P1dcL2hmOY>}^2%jADI2F`v21jTG(_>LXxOm`^q~~99BLy}EbuRD<^QcW^ z-!qEeYuw7Z3%}!LigSu_ieif32E{yjmnSr!IX#e@<7LxqZskkl90$)3ThAnkz#)sW z^HL|z)T(3j@-+9c$Gj}?rTTEsa;}wUx%gE{lPPmI&wBLHI;L4ETRnVjQsU|zmD5+i zcR4OT{Go^cL0?B7MHHa)SwVqG1vJGV)tXek#lcS$7<3YocgdrA7=^Mhd4tjn*_o08 z*@m_-ZM4>SIdwU2lUsARql$I`ElLYfAW`(tViXe;2;_BgG5M36H{~Pp04+*ZB@>cm zu<-S4-e!^TTSNF7(u8lcRheGCmd7XX!ETUOdbvfH@9yDTzVGGve3zV=&!3SG paramsMap = new HashMap<>(); + paramsMap.put("signPhone", LbRetailSignUtils.sm4Encrypt("17683843144", config.getFieldKey())); + String body = JSONUtil.toJsonStr(paramsMap); + // 发送请求 + String res = HttpRequest.post(baseUrl + walletInfoUrl).contentType("application/json").header(apiCountersign(body)).body(body).execute().body(); + log.info(res); + } + + + private ThirdKeyManageEntity getLbConfig() { + return keyManageService.get(ThirdKeyTypeEnum.LB); + } + + private Map> apiCountersign(String body) { + + ThirdKeyManageEntity config = getLbConfig(); + + String timestamp = String.valueOf(Instant.now().getEpochSecond()); + + Map> headers = new HashMap<>(); + headers.put("timestamp", List.of(timestamp)); + headers.put("app-key", List.of(config.getAppKey())); + headers.put("biz-type", List.of(config.getBizType())); + headers.put("sign", List.of()); + String signStr = String.format("%s%s%s%s%s", config.getAppKey(), config.getAppSecret(), config.getBizType(), timestamp, body); + String successSignMd5 = DigestUtils.md5Hex(signStr); + headers.put("sign", List.of(successSignMd5)); + return headers; + } + +} diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java index 852f2a37d..99af89d36 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java @@ -124,7 +124,8 @@ public class SysUserController { /** * 根据手机号查询用户 */ - @GetMapping("/user/inner/phone") + @Inner + @GetMapping("/inner/phone") R getInnerByPhone(@RequestParam String phone) { SysUser user = userService.getOne(Wrappers.query().lambda().eq(SysUser::getPhone, phone)); if (user == null) return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERINFO_EMPTY, phone));