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 07d533bc1..b19729746 100644 Binary files a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/doc/第三方支付文档.wps and b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/doc/第三方支付文档.wps differ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/PayTest.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/PayTest.java new file mode 100644 index 000000000..1c30accf9 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/PayTest.java @@ -0,0 +1,69 @@ +package com.bsd.pjcloud.admin; + +import cn.hutool.http.HttpRequest; +import cn.hutool.json.JSONUtil; +import com.bsd.pjcloud.thirdparty.ThirdPartyApp; +import com.bsd.pjcloud.thirdparty.constant.ThirdKeyTypeEnum; +import com.bsd.pjcloud.thirdparty.entity.ThirdKeyManageEntity; +import com.bsd.pjcloud.thirdparty.service.ThirdKeyManageService; +import com.bsd.pjcloud.thirdparty.utils.lb.tool.LbRetailSignUtils; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import java.time.Instant; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +@SpringBootTest(classes = ThirdPartyApp.class) +public class PayTest { + + private final String baseUrl = "127.0.0.1:9999"; + + private final String walletInfoUrl = "/third/third-pay-api/user-wallet"; + + private final String walletPayUrl = "/third/third-pay-api/wallet-pay"; + + private final String walletRefundUrl = "/third/third-pay-api/wallet-refund"; + + @Resource + private ThirdKeyManageService keyManageService; + + @Test + public void walletInfo() throws Exception { + ThirdKeyManageEntity config = getLbConfig(); + Map 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 6fed39f1e..054a6c223 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));