diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopActivateController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopActivateController.java index 19b07495..09ce069a 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopActivateController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopActivateController.java @@ -4,6 +4,7 @@ import com.czg.account.dto.ShopActivateDTO; import com.czg.account.service.ShopActivateService; import com.czg.annotation.SaAdminCheckPermission; import com.czg.resp.CzgResult; +import com.czg.sa.StpKit; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -39,6 +40,7 @@ public class ShopActivateController { @SaAdminCheckPermission("activate:add") @PostMapping public CzgResult add(@RequestBody @Validated ShopActivateDTO activateDTO) { + activateDTO.setShopId(StpKit.USER.getShopId()); return CzgResult.success(shopActivateService.add(activateDTO)); } diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopUserController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopUserController.java index 721a8c32..b5533af5 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopUserController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopUserController.java @@ -7,6 +7,7 @@ import com.czg.account.dto.shopuser.ShopUserSummaryDTO; import com.czg.account.entity.ShopUser; import com.czg.account.service.ShopUserService; import com.czg.annotation.SaAdminCheckPermission; +import com.czg.enums.ShopUserFlowBizEnum; import com.czg.resp.CzgResult; import com.czg.sa.StpKit; import com.mybatisflex.core.paginate.Page; @@ -75,6 +76,7 @@ public class ShopUserController { @SaAdminCheckPermission("shopUser:editFlow") @PutMapping("/money") public CzgResult editMoney(@RequestBody @Validated ShopUserMoneyEditDTO shopUserMoneyEditDTO) { + shopUserMoneyEditDTO.setBizEnum(ShopUserFlowBizEnum.ADMIN_IN); return CzgResult.success(shopUserService.updateMoney(StpKit.USER.getShopId(), shopUserMoneyEditDTO)); } diff --git a/cash-api/order-server/src/main/java/com/czg/controller/PayController.java b/cash-api/order-server/src/main/java/com/czg/controller/OrderPayController.java similarity index 98% rename from cash-api/order-server/src/main/java/com/czg/controller/PayController.java rename to cash-api/order-server/src/main/java/com/czg/controller/OrderPayController.java index e2c22989..7ba63d12 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/PayController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/OrderPayController.java @@ -22,7 +22,7 @@ import java.util.Map; */ @RestController @RequestMapping("/pay") -public class PayController { +public class OrderPayController { @Resource private PayService payService; diff --git a/cash-api/order-server/src/main/java/com/czg/controller/VipPayController.java b/cash-api/order-server/src/main/java/com/czg/controller/VipPayController.java new file mode 100644 index 00000000..eb2195d2 --- /dev/null +++ b/cash-api/order-server/src/main/java/com/czg/controller/VipPayController.java @@ -0,0 +1,75 @@ +package com.czg.controller; + +import com.czg.resp.CzgResult; +import com.czg.sa.StpKit; +import com.czg.service.order.dto.VipPayParamDTO; +import com.czg.service.order.service.PayService; +import com.czg.utils.ServletUtil; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.validation.annotation.Validated; +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; + +import java.util.Map; + +/** + * 会员 支付 + * + * @author ww + * @description + */ +@RestController +@RequestMapping("/pay") +public class VipPayController { + @Resource + private PayService payService; + + + /** + * js支付 + * payType 必填 支付方式,aliPay 支付宝,wechatPay 微信 + * openId 必填 + */ + @PostMapping("jsPayVip") + public CzgResult> jsPayVip(HttpServletRequest request, @Validated @RequestBody VipPayParamDTO payParam) { + payParam.setUserId(StpKit.USER.getLoginIdAsLong()); + payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(),"platformType")); + return payService.jsPayVip(ServletUtil.getClientIPByHeader(request), payParam); + } + + /** + * 小程序支付 + * payType 必填 支付方式,aliPay 支付宝,wechatPay 微信 + * openId 必填 + */ + @PostMapping("ltPayVip") + public CzgResult> ltPayVip(HttpServletRequest request, @Validated @RequestBody VipPayParamDTO payParam) { + payParam.setUserId(StpKit.USER.getLoginIdAsLong()); + payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(),"platformType")); + return payService.ltPayVip(ServletUtil.getClientIPByHeader(request), payParam); + } + + /** + * 正扫 + */ + @PostMapping("scanPayVip") + public CzgResult> scanPayVip(HttpServletRequest request, @Validated @RequestBody VipPayParamDTO payParam) { + payParam.setUserId(StpKit.USER.getLoginIdAsLong()); + payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(),"platformType")); + return payService.scanPayVip(ServletUtil.getClientIPByHeader(request), payParam); + } + + /** + * 反扫 + * authCode 必填 扫描码 + */ + @PostMapping("microPayVip") + public CzgResult> microPayVip(@Validated @RequestBody VipPayParamDTO payParam) { + payParam.setUserId(StpKit.USER.getLoginIdAsLong()); + payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(),"platformType")); + return payService.microPayVip(payParam); + } +} diff --git a/cash-api/order-server/src/main/resources/application-dev.yml b/cash-api/order-server/src/main/resources/application-dev.yml index 1512f691..e9b78476 100644 --- a/cash-api/order-server/src/main/resources/application-dev.yml +++ b/cash-api/order-server/src/main/resources/application-dev.yml @@ -30,7 +30,7 @@ dubbo: application: name: order-server qos-port: 22231 - qos-enable: true +# qos-enable: true registry: address: nacos://121.40.109.122:8848 # Nacos 服务地址 group: server diff --git a/cash-api/order-server/src/main/resources/application-test.yml b/cash-api/order-server/src/main/resources/application-test.yml index 07ae8d3a..eb8d30bb 100644 --- a/cash-api/order-server/src/main/resources/application-test.yml +++ b/cash-api/order-server/src/main/resources/application-test.yml @@ -31,7 +31,7 @@ dubbo: application: name: order-server qos-port: 22232 - qos-enable: true +# qos-enable: true registry: address: nacos://121.40.109.122:8848 # Nacos 服务地址 group: server-test diff --git a/cash-common/cash-common-sa-token/src/main/java/com/czg/config/SaTokenConfigure.java b/cash-common/cash-common-sa-token/src/main/java/com/czg/config/SaTokenConfigure.java index f56837de..b2cf4a17 100644 --- a/cash-common/cash-common-sa-token/src/main/java/com/czg/config/SaTokenConfigure.java +++ b/cash-common/cash-common-sa-token/src/main/java/com/czg/config/SaTokenConfigure.java @@ -31,7 +31,7 @@ public class SaTokenConfigure implements WebMvcConfigurer { // admin配置 SaTokenConfig adminConfig = new SaTokenConfig(); adminConfig.setTokenName("token"); - adminConfig.setTimeout(1000); +// adminConfig.setTimeout(1000); adminConfig.setTokenStyle("simple-uuid"); adminConfig.setIsConcurrent(true); adminConfig.setIsShare(false); diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopuser/ShopUserMoneyEditDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopuser/ShopUserMoneyEditDTO.java index dddb13a2..130496d7 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopuser/ShopUserMoneyEditDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopuser/ShopUserMoneyEditDTO.java @@ -1,9 +1,10 @@ package com.czg.account.dto.shopuser; +import com.czg.enums.ShopUserFlowBizEnum; import jakarta.validation.constraints.DecimalMax; import jakarta.validation.constraints.DecimalMin; -import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; +import lombok.Builder; import lombok.Data; import java.math.BigDecimal; @@ -12,6 +13,7 @@ import java.math.BigDecimal; * @author Administrator */ @Data +@Builder public class ShopUserMoneyEditDTO { /** * 对应shopUserid @@ -23,6 +25,12 @@ public class ShopUserMoneyEditDTO { */ @NotNull private Integer type; + /** + * 关联id, + * 霸王餐时 订单id + * 支付/退款 tb_order_payment.id + */ + private Long relationId; /** * 浮动金额 */ @@ -30,6 +38,8 @@ public class ShopUserMoneyEditDTO { @DecimalMin("0.01") @DecimalMax("9999") private BigDecimal money; + + private ShopUserFlowBizEnum bizEnum; /** * 备注 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUserFlow.java b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUserFlow.java index 86257860..e57f97cf 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUserFlow.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUserFlow.java @@ -55,9 +55,11 @@ public class ShopUserFlow implements Serializable { private String remark; /** - * 关联订单编号,支付单号,退款单号 + * 关联id, + * 霸王餐时 订单id + * 支付/退款 tb_order_payment.id */ - private String relationOrderNo; + private Long relationId; @Column(onInsertValue = "now()") private LocalDateTime createTime; diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderPayment.java b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderPayment.java index 7025bbb0..6a4d53f4 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderPayment.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderPayment.java @@ -84,7 +84,7 @@ public class OrderPayment implements Serializable { public OrderPayment() { } - public OrderPayment(@NonNull Long shopId, @NonNull Long sourceId, @NotBlank String payType, @NotBlank String orderNo, + public OrderPayment(@NonNull Long shopId,@NonNull Long sourceId, @NotBlank String payType, @NotBlank String orderNo, String authCode, @NonNull BigDecimal amount) { this.shopId = shopId; this.sourceId = sourceId; diff --git a/cash-common/cash-common-tools/src/main/java/com/czg/utils/CzgStrUtils.java b/cash-common/cash-common-tools/src/main/java/com/czg/utils/CzgStrUtils.java new file mode 100644 index 00000000..3446941f --- /dev/null +++ b/cash-common/cash-common-tools/src/main/java/com/czg/utils/CzgStrUtils.java @@ -0,0 +1,18 @@ +package com.czg.utils; + +import cn.hutool.core.util.StrUtil; + +/** + * @author ww + * @description + */ +public class CzgStrUtils { + + /** + * 如果str为空,返回null,否则返回str + * flex sql查询时 自动忽略null 不忽略'' + */ + public static String getStrOrNull(String str) { + return StrUtil.isNotBlank(str) ? str : null; + } +} diff --git a/cash-sdk/czg-pay/src/main/java/com/czg/entity/resp/CzgBaseResp.java b/cash-sdk/czg-pay/src/main/java/com/czg/entity/resp/CzgBaseResp.java index 74f7a528..625640c5 100644 --- a/cash-sdk/czg-pay/src/main/java/com/czg/entity/resp/CzgBaseResp.java +++ b/cash-sdk/czg-pay/src/main/java/com/czg/entity/resp/CzgBaseResp.java @@ -66,12 +66,7 @@ public class CzgBaseResp { * 微信 / 支付宝订单号 */ private String channelTradeNo; - /** - * 扩展参数 - * { - * "pay_type": "order/vip" - * } - */ + private String extParam; diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopUserMapper.java b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopUserMapper.java index fc72c1a4..aeed3293 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopUserMapper.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopUserMapper.java @@ -19,8 +19,9 @@ import java.time.LocalDateTime; */ public interface ShopUserMapper extends BaseMapper { - Page selectPageByKeyAndIsVip(Page objectPage, @Param("key") String key, @Param("isVip") Integer isVip, - @Param("shopId") Long shopId); + Page selectPageByKeyAndIsVip(); + + long selectPageByKeyAndIsVip_COUNT(); int incrAccount(@Param("shopId") long shopId, @Param("id") Long id, @Param("time") LocalDateTime time, @Param("money") BigDecimal money); int decrAccount(@Param("shopId") long shopId, @Param("id") Long id, @Param("time") LocalDateTime time, @Param("money") BigDecimal money); diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopActivateServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopActivateServiceImpl.java index 7b7e92ba..d869d401 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopActivateServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopActivateServiceImpl.java @@ -23,8 +23,10 @@ public class ShopActivateServiceImpl extends ServiceImpl getList() { - return queryChain().select().eq(ShopActivate::getShopId, StpKit.USER.getShopId()) - .orderBy(ShopActivate::getAmount, true).listAs(ShopActivateDTO.class); + return queryChain().select() + .eq(ShopActivate::getShopId, StpKit.USER.getShopId()) + .orderBy(ShopActivate::getAmount, true) + .listAs(ShopActivateDTO.class); } @Override diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserFlowServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserFlowServiceImpl.java index 9d3b562e..cad26f82 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserFlowServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserFlowServiceImpl.java @@ -4,6 +4,7 @@ import com.mybatisflex.spring.service.impl.ServiceImpl; import com.czg.account.entity.ShopUserFlow; import com.czg.account.service.ShopUserFlowService; import com.czg.service.account.mapper.ShopUserFlowMapper; +import org.apache.dubbo.config.annotation.DubboService; import org.springframework.stereotype.Service; /** @@ -12,7 +13,7 @@ import org.springframework.stereotype.Service; * @author zs * @since 2025-02-13 */ -@Service +@DubboService public class ShopUserFlowServiceImpl extends ServiceImpl implements ShopUserFlowService{ } diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserServiceImpl.java index e82eedd9..ee3dec88 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; import com.czg.account.dto.shopuser.*; import com.czg.account.entity.ShopUser; import com.czg.account.entity.ShopUserFlow; @@ -20,19 +21,24 @@ import com.czg.service.account.mapper.ShopUserMapper; import com.czg.utils.AssertUtil; import com.czg.utils.PageUtil; import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.query.QueryCondition; +import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; import jakarta.annotation.Resource; +import org.apache.dubbo.config.annotation.DubboService; import org.springframework.stereotype.Service; import java.math.RoundingMode; +import static com.mybatisflex.core.query.QueryMethods.column; + /** * 商户储值会员 服务层实现。 * * @author Administrator * @since 2025-02-08 */ -@Service +@DubboService public class ShopUserServiceImpl extends ServiceImpl implements ShopUserService { @Resource private ShopUserFlowService shopUserFlowService; @@ -52,7 +58,15 @@ public class ShopUserServiceImpl extends ServiceImpl i @Override public Page getPage(String key, Integer isVip) { - return mapper.selectPageByKeyAndIsVip(PageUtil.buildPage(), key, isVip, StpKit.USER.getShopId()); + QueryWrapper queryWrapper = new QueryWrapper().eq(ShopUser::getShopId, StpKit.USER.getShopId()); + if (StrUtil.isNotBlank(key)) { + queryWrapper.and(column(UserInfo::getNickName).like(key).or(column(UserInfo::getPhone).like(key))); + } + + if (isVip != null) { + queryWrapper.eq(ShopUser::getIsVip, isVip); + } + return mapper.xmlPaginate("selectPageByKeyAndIsVip", PageUtil.buildPage(), queryWrapper); } @Override @@ -82,9 +96,10 @@ public class ShopUserServiceImpl extends ServiceImpl i userFlow.setShopId(userInfo.getShopId()); userFlow.setAmount(shopUserEditDTO.getMoney()); userFlow.setBalance(shopUserEditDTO.getType() == 0 ? userInfo.getAmount().subtract(shopUserEditDTO.getMoney()) : userInfo.getAmount().add(shopUserEditDTO.getMoney())); - userFlow.setBizCode(ShopUserFlowBizEnum.ADMIN_IN.getCode()); + userFlow.setBizCode(shopUserEditDTO.getBizEnum().getCode()); userFlow.setType(shopUserEditDTO.getType() == 0 ? "-" : "+"); userFlow.setRemark(shopUserEditDTO.getRemark()); + userFlow.setRelationId(shopUserEditDTO.getRelationId()); return shopUserFlowService.save(userFlow); } diff --git a/cash-service/account-service/src/main/resources/mapper/ShopUserMapper.xml b/cash-service/account-service/src/main/resources/mapper/ShopUserMapper.xml index a8e8eb02..4b363035 100644 --- a/cash-service/account-service/src/main/resources/mapper/ShopUserMapper.xml +++ b/cash-service/account-service/src/main/resources/mapper/ShopUserMapper.xml @@ -19,17 +19,7 @@ and amount - #{money} >= 0 - + + + diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/dto/VipPayParamDTO.java b/cash-service/order-service/src/main/java/com/czg/service/order/dto/VipPayParamDTO.java new file mode 100644 index 00000000..4f8c0217 --- /dev/null +++ b/cash-service/order-service/src/main/java/com/czg/service/order/dto/VipPayParamDTO.java @@ -0,0 +1,32 @@ +package com.czg.service.order.dto; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 支付接收参数 实体类 + * + * @author ww + * @description + */ +@Data +public class VipPayParamDTO { + @NotNull(message = "店铺不能为空") + private Long shopId; + private Long shopUserId; + private Long userId; + @NotNull(message = "充值金额不为空") + private BigDecimal amount; + + private String buyerRemark; + private String returnUrl; + /** + * 平台类型 pc 收银机客户端 wechat 微信小程序 alipay 支付宝小程序 admin-pc PC管理端 admin-app APP管理端 + */ + private String platformType; + private String payType; + private String openId; + private String authCode; +} diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/PayService.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/PayService.java index c20d3721..2cdb342c 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/PayService.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/PayService.java @@ -3,6 +3,7 @@ package com.czg.service.order.service; import com.czg.entity.resp.*; import com.czg.resp.CzgResult; import com.czg.service.order.dto.OrderPayParamDTO; +import com.czg.service.order.dto.VipPayParamDTO; import java.math.BigDecimal; import java.util.Map; @@ -38,6 +39,26 @@ public interface PayService { */ CzgResult> microPayOrder(OrderPayParamDTO payParam); + /** + * js支付 + */ + CzgResult> jsPayVip(String clintIp, VipPayParamDTO payParam); + + /** + * 小程序支付 + */ + CzgResult> ltPayVip(String clintIp, VipPayParamDTO payParam); + + /** + * PC扫码支付 + */ + CzgResult> scanPayVip(String clintIp, VipPayParamDTO payParam); + + /** + * 聚合反扫 + */ + CzgResult> microPayVip(VipPayParamDTO payParam); + /** * 订单退款 diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java index a7f9746a..b1fb2f25 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java @@ -3,7 +3,11 @@ package com.czg.service.order.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSONObject; +import com.czg.account.dto.shopuser.ShopUserMoneyEditDTO; +import com.czg.account.entity.ShopUser; +import com.czg.account.service.ShopUserService; import com.czg.entity.notify.CzgPayNotifyDTO; +import com.czg.enums.ShopUserFlowBizEnum; import com.czg.order.dto.OrderInfoQueryDTO; import com.czg.order.entity.OrderDetail; import com.czg.order.entity.OrderInfo; @@ -15,12 +19,15 @@ import com.czg.order.vo.OrderDetailSmallVO; import com.czg.order.vo.OrderInfoVo; import com.czg.service.order.enums.OrderStatusEnums; import com.czg.service.order.mapper.OrderInfoMapper; +import com.czg.utils.CzgStrUtils; import com.czg.utils.PageUtil; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; import jakarta.annotation.Resource; import jakarta.validation.constraints.NotBlank; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -33,6 +40,7 @@ import java.util.List; * @author ww * @since 2025-02-13 */ +@Slf4j @Service public class OrderInfoServiceImpl extends ServiceImpl implements OrderInfoService { @@ -41,6 +49,8 @@ public class OrderInfoServiceImpl extends ServiceImpl getOrderByPage(OrderInfoQueryDTO param) { @@ -56,11 +66,11 @@ public class OrderInfoServiceImpl extends ServiceImpl { List orderDetails = orderDetailService.queryChain().select() .eq(OrderDetail::getShopId, s.getShopId()) - .eq(OrderDetail::getOrderId, s.getId()).listAs(OrderDetailSmallVO.class); + .eq(OrderDetail::getOrderId, s.getId()) + .listAs(OrderDetailSmallVO.class); s.setGoods(orderDetails); }); return orderInfoVoPage; @@ -79,7 +90,7 @@ public class OrderInfoServiceImpl extends ServiceImpl> h5PayOrder(@NonNull String clintIp, OrderPayParamDTO payParam) { @@ -58,7 +62,7 @@ public class PayServiceImpl implements PayService { initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(), "order", payOrderNo, "", orderInfo.getOrderAmount())); upOrderPayInfo(orderInfo.getId(), PayEnums.H5_PAY.getValue(), payOrderNo); return h5Pay(payParam.getShopId(), new CzgH5PayReq(payOrderNo, orderInfo.getOrderAmount().multiply(MONEY_RATE).longValue(), - "点餐支付", clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), payJsonExtParam)); + "点餐支付", clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), "")); } @@ -66,11 +70,13 @@ public class PayServiceImpl implements PayService { public CzgResult> jsPayOrder(@NonNull String clintIp, OrderPayParamDTO payParam) { OrderInfo orderInfo = orderInfoService.getById(payParam.getOrderId()); AssertUtil.isNull(orderInfo, "订单不存在"); + AssertUtil.isBlank(payParam.getOpenId(), "用户小程序ID不能为空"); + AssertUtil.isBlank(payParam.getPayType(), "支付方式不能为空"); String payOrderNo = orderInfo.getPlatformType() + IdUtil.getSnowflakeNextId(); initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(), "order", payOrderNo, "", orderInfo.getOrderAmount())); upOrderPayInfo(orderInfo.getId(), "aliPay".equals(payParam.getPayType()) ? PayEnums.ALIPAY_MINI.getValue() : PayEnums.WECHAT_MINI.getValue(), payOrderNo); return jsPay(payParam.getShopId(), payParam.getPayType(), new CzgJsPayReq(payOrderNo, orderInfo.getOrderAmount().multiply(MONEY_RATE).longValue(), - "点餐支付", payParam.getOpenId(), clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), payJsonExtParam)); + "点餐支付", payParam.getOpenId(), clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), "")); } @Override @@ -81,7 +87,7 @@ public class PayServiceImpl implements PayService { initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(), "order", payOrderNo, "", orderInfo.getOrderAmount())); upOrderPayInfo(orderInfo.getId(), "aliPay".equals(payParam.getPayType()) ? PayEnums.ALIPAY_MINI.getValue() : PayEnums.WECHAT_MINI.getValue(), payOrderNo); return ltPay(payParam.getShopId(), payParam.getPayType(), new CzgLtPayReq(payOrderNo, orderInfo.getOrderAmount().multiply(MONEY_RATE).longValue(), - "点餐支付", payParam.getOpenId(), clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), payJsonExtParam)); + "点餐支付", payParam.getOpenId(), clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), "")); } @Override @@ -92,20 +98,71 @@ public class PayServiceImpl implements PayService { initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(), "order", payOrderNo, "", orderInfo.getOrderAmount())); upOrderPayInfo(orderInfo.getId(), PayEnums.MAIN_SCAN.getValue(), payOrderNo); return scanPay(payParam.getShopId(), new CzgScanPayReq(payOrderNo, orderInfo.getOrderAmount().multiply(MONEY_RATE).longValue(), - "点餐支付", clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), payJsonExtParam)); + "点餐支付", clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), "")); } @Override public CzgResult> microPayOrder(OrderPayParamDTO payParam) { OrderInfo orderInfo = orderInfoService.getById(payParam.getOrderId()); AssertUtil.isNull(orderInfo, "订单不存在"); + AssertUtil.isBlank(payParam.getAuthCode(), "扫描码不能为空"); String payOrderNo = orderInfo.getPlatformType() + IdUtil.getSnowflakeNextId(); initOrderPayment(new OrderPayment(payParam.getShopId(), payParam.getOrderId(), "order", payOrderNo, payParam.getAuthCode(), orderInfo.getOrderAmount())); upOrderPayInfo(orderInfo.getId(), PayEnums.BACK_SCAN.getValue(), payOrderNo); return microPay(payParam.getShopId(), new CzgMicroPayReq(payOrderNo, orderInfo.getOrderAmount().multiply(MONEY_RATE).longValue(), - "点餐支付", payParam.getAuthCode(), payParam.getBuyerRemark(), payJsonExtParam)); + "点餐支付", payParam.getAuthCode(), payParam.getBuyerRemark(), "")); } + @Override + public CzgResult> jsPayVip(String clintIp, VipPayParamDTO payParam) { + ShopUser shopUser = shopUserService.queryChain().eq(ShopUser::getShopId, payParam.getShopId()) + .eq(ShopUser::getUserId, payParam.getShopUserId()).one(); + AssertUtil.isNull(shopUser,"充值失败 该店铺用户不存在"); + AssertUtil.isBlank(payParam.getOpenId(), "用户小程序ID不能为空"); + AssertUtil.isBlank(payParam.getPayType(), "支付方式不能为空"); + String payOrderNo = payParam.getPlatformType() + IdUtil.getSnowflakeNextId(); + initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), "memberIn", payOrderNo, "", payParam.getAmount())); + return jsPay(payParam.getShopId(), payParam.getPayType(), new CzgJsPayReq(payOrderNo, payParam.getAmount().multiply(MONEY_RATE).longValue(), + "会员充值", payParam.getOpenId(), clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), "")); + } + + @Override + public CzgResult> ltPayVip(String clintIp, VipPayParamDTO payParam) { + ShopUser shopUser = shopUserService.queryChain().eq(ShopUser::getShopId, payParam.getShopId()) + .eq(ShopUser::getUserId, payParam.getShopUserId()).one(); + AssertUtil.isNull(shopUser,"充值失败 该店铺用户不存在"); + AssertUtil.isBlank(payParam.getOpenId(), "用户小程序ID不能为空"); + AssertUtil.isBlank(payParam.getPayType(), "支付方式不能为空"); + String payOrderNo = payParam.getPlatformType() + IdUtil.getSnowflakeNextId(); + initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), "memberIn", payOrderNo, "", payParam.getAmount())); + return ltPay(payParam.getShopId(), payParam.getPayType(), new CzgLtPayReq(payOrderNo, payParam.getAmount().multiply(MONEY_RATE).longValue(), + "会员充值", payParam.getOpenId(), clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), "")); + } + + @Override + public CzgResult> scanPayVip(String clintIp, VipPayParamDTO payParam) { + ShopUser shopUser = shopUserService.queryChain().eq(ShopUser::getShopId, payParam.getShopId()) + .eq(ShopUser::getUserId, payParam.getShopUserId()).one(); + AssertUtil.isNull(shopUser,"充值失败 该店铺用户不存在"); + String payOrderNo = payParam.getPlatformType() + IdUtil.getSnowflakeNextId(); + initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), "memberIn", payOrderNo, "", payParam.getAmount())); + return scanPay(payParam.getShopId(), new CzgScanPayReq(payOrderNo, payParam.getAmount().multiply(MONEY_RATE).longValue(), + "会员充值", clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), "")); + } + + @Override + public CzgResult> microPayVip(VipPayParamDTO payParam) { + ShopUser shopUser = shopUserService.queryChain().eq(ShopUser::getShopId, payParam.getShopId()) + .eq(ShopUser::getUserId, payParam.getShopUserId()).one(); + AssertUtil.isNull(shopUser,"充值失败 该店铺用户不存在"); + AssertUtil.isBlank(payParam.getAuthCode(), "扫描码不能为空"); + String payOrderNo = payParam.getPlatformType() + IdUtil.getSnowflakeNextId(); + initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), "memberIn", payOrderNo, payParam.getAuthCode(), payParam.getAmount())); + return microPay(payParam.getShopId(), new CzgMicroPayReq(payOrderNo, payParam.getAmount().multiply(MONEY_RATE).longValue(), + "会员充值", payParam.getAuthCode(), payParam.getBuyerRemark(), "")); + } + + @Override public CzgResult refundOrder(@NonNull Long shopId, @NonNull Long orderId, @NonNull String refundReason, @NonNull BigDecimal refundAmount) { @@ -150,20 +207,20 @@ public class PayServiceImpl implements PayService { private CzgResult> jsPay(@NonNull Long shopId, @NonNull String payType, CzgJsPayReq bizData) { ShopMerchant shopMerchant = shopMerchantService.getById(shopId); + bizData.setSubAppid("aliPay".equals(payType) ? shopMerchant.getAlipaySmallAppid() : shopMerchant.getWechatSmallAppid()); AssertUtil.isBlank(bizData.getSubAppid(), "暂不可用,请联系商家配置" + ("aliPay".equals(payType) ? "支付宝" : "微信") + "小程序"); bizData.assignMerchant(shopMerchant.getStoreId(), shopMerchant.getMerchantName(), sysParamsService.getSysParamValue(SysParamCodeEnum.PAY_CZG_NOTIFY_URL.getCode())); - bizData.setSubAppid("aliPay".equals(payType) ? shopMerchant.getAlipaySmallAppid() : shopMerchant.getWechatSmallAppid()); CzgResult jsPayRespCzgResult = czgPayService.jsPay(shopMerchant.getAppId(), shopMerchant.getAppSecret(), bizData); return execPayResult(jsPayRespCzgResult); } private CzgResult> ltPay(@NonNull Long shopId, String payType, CzgLtPayReq bizData) { ShopMerchant shopMerchant = shopMerchantService.getById(shopId); + bizData.setSubAppid("aliPay".equals(payType) ? shopMerchant.getAlipaySmallAppid() : shopMerchant.getWechatSmallAppid()); AssertUtil.isBlank(bizData.getSubAppid(), "暂不可用,请联系商家配置" + ("aliPay".equals(payType) ? "支付宝" : "微信") + "小程序"); bizData.assignMerchant(shopMerchant.getStoreId(), shopMerchant.getMerchantName(), sysParamsService.getSysParamValue(SysParamCodeEnum.PAY_CZG_NOTIFY_URL.getCode())); - bizData.setSubAppid("aliPay".equals(payType) ? shopMerchant.getAlipaySmallAppid() : shopMerchant.getWechatSmallAppid()); CzgResult ltPayRespCzgResult = czgPayService.ltPay(shopMerchant.getAppId(), shopMerchant.getAppSecret(), bizData); return execPayResult(ltPayRespCzgResult); } @@ -177,10 +234,10 @@ public class PayServiceImpl implements PayService { } private CzgResult> microPay(@NonNull Long shopId, CzgMicroPayReq bizData) { + AssertUtil.isBlank(bizData.getAuthCode(), "扫码失败,请重试"); ShopMerchant shopMerchant = shopMerchantService.getById(shopId); bizData.assignMerchant(shopMerchant.getStoreId(), shopMerchant.getMerchantName(), sysParamsService.getSysParamValue(SysParamCodeEnum.PAY_CZG_NOTIFY_URL.getCode())); - AssertUtil.isBlank(bizData.getAuthCode(), "扫码失败,请重试"); String firstTwoDigitsStr = bizData.getAuthCode().substring(0, 2); // 将截取的字符串转换为整数 @@ -193,6 +250,8 @@ public class PayServiceImpl implements PayService { } else if (firstTwoDigits >= 25 && firstTwoDigits <= 30) { //支付宝支付 bizData.setSubAppid(shopMerchant.getAlipaySmallAppid()); + }else { + throw new ValidateException("扫描码非法或暂不支持"); } CzgResult czgScanPayResult = czgPayService.microPay(shopMerchant.getAppId(), shopMerchant.getAppSecret(), bizData); @@ -224,13 +283,16 @@ public class PayServiceImpl implements PayService { } return result; } - case CzgH5PayResp h5PayResp -> map = JSONObject.parseObject(JSONObject.toJSONString(h5PayResp.getPayInfo())); - case CzgJsPayResp jsPayResp -> map = JSONObject.parseObject(JSONObject.toJSONString(jsPayResp.getPayInfo())); + case CzgH5PayResp h5PayResp -> + map = JSONObject.parseObject(JSONObject.toJSONString(h5PayResp.getPayInfo())); + case CzgJsPayResp jsPayResp -> + map = JSONObject.parseObject(JSONObject.toJSONString(jsPayResp.getPayInfo())); case CzgLtPayResp ltPayResp -> { map.put("payInfo", JSONObject.toJSONString(ltPayResp.getPayInfo())); map.put("liteInfo", JSONObject.toJSONString(ltPayResp.getLiteInfo())); } - case CzgScanPayResp scanPayResp -> map = JSONObject.parseObject(JSONObject.toJSONString(scanPayResp.getPayInfo())); + case CzgScanPayResp scanPayResp -> + map = JSONObject.parseObject(JSONObject.toJSONString(scanPayResp.getPayInfo())); default -> throw new IllegalStateException("Unexpected value: " + data); }