From 0814fc36c5d0001888b4e372308ceb0c95c49e32 Mon Sep 17 00:00:00 2001 From: dute7liang <383200134@qq.com> Date: Sun, 21 Jan 2024 01:20:07 +0800 Subject: [PATCH] init --- .../cai/controller/PayConfigController.java | 6 +- .../cai/controller/app/ConsumeController.java | 36 ++++ .../cai/controller/app/PayController.java | 174 ++++++++++++++++++ .../app/UserMemberAppController.java | 13 -- .../controller/test/TestPayController.java | 4 +- .../com/ruoyi/cai/domain/RechargeOrder.java | 2 + .../java/com/ruoyi/cai/domain/VipOrder.java | 1 + .../ruoyi/cai/dto/AddRechargeOrderDto.java | 16 -- .../java/com/ruoyi/cai/dto/ConsumeResp.java | 3 + .../app/query/order/AddRechargeOrderDto.java | 19 ++ .../dto/app/query/order/AddVipOrderDto.java | 12 ++ .../cai/dto/app/vo/order/OrderCreateVo.java | 16 ++ .../com/ruoyi/cai/dto/dto/AddVipOrderDto.java | 10 - .../ruoyi/cai/manager/ConsumerManager.java | 7 +- .../com/ruoyi/cai/pay/PayConfigManager.java | 106 +++++++++++ .../com/ruoyi/cai/pay/PayControllerDTO.java | 12 ++ .../java/com/ruoyi/cai/pay/PayManager.java | 15 +- .../java/com/ruoyi/cai/pay/PayReturnResp.java | 8 + .../java/com/ruoyi/cai/pay/PayTypeEnum.java | 16 ++ .../ruoyi/cai/service/PayConfigService.java | 5 + .../cai/service/RechargeOrderService.java | 8 +- .../ruoyi/cai/service/VipOrderService.java | 8 +- .../service/impl/PayConfigServiceImpl.java | 45 ++++- .../impl/RechargeOrderServiceImpl.java | 17 +- .../cai/service/impl/VipOrderServiceImpl.java | 19 +- 25 files changed, 513 insertions(+), 65 deletions(-) create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/PayController.java delete mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/UserMemberAppController.java delete mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/dto/AddRechargeOrderDto.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/query/order/AddRechargeOrderDto.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/query/order/AddVipOrderDto.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/order/OrderCreateVo.java delete mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/dto/dto/AddVipOrderDto.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayConfigManager.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayControllerDTO.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayReturnResp.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayTypeEnum.java diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/PayConfigController.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/PayConfigController.java index ef872a89..eb9f6bef 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/PayConfigController.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/PayConfigController.java @@ -65,7 +65,7 @@ public class PayConfigController extends BaseController { @RepeatSubmit() @PostMapping() public R add(@Validated(AddGroup.class) @RequestBody PayConfig bo) { - return toAjax(payConfigService.save(bo)); + return toAjax(payConfigService.addPayConfig(bo)); } /** @@ -76,7 +76,7 @@ public class PayConfigController extends BaseController { @RepeatSubmit() @PutMapping() public R edit(@Validated(EditGroup.class) @RequestBody PayConfig bo) { - return toAjax(payConfigService.updateById(bo)); + return toAjax(payConfigService.updatePayConfig(bo)); } @SaCheckPermission("cai:payConfig:remove") @@ -84,6 +84,6 @@ public class PayConfigController extends BaseController { @DeleteMapping("/{id}") public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long id) { - return toAjax(payConfigService.removeById(id)); + return toAjax(payConfigService.deletePayConfig(id)); } } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/ConsumeController.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/ConsumeController.java index 3e834acf..db5961b5 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/ConsumeController.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/ConsumeController.java @@ -1,9 +1,16 @@ package com.ruoyi.cai.controller.app; +import com.ruoyi.cai.domain.RechargeOrder; +import com.ruoyi.cai.domain.VipOrder; import com.ruoyi.cai.dto.ConsumeResp; import com.ruoyi.cai.dto.app.query.GiveGiftRes; import com.ruoyi.cai.dto.app.query.GiveGuardReq; +import com.ruoyi.cai.dto.app.query.order.AddRechargeOrderDto; +import com.ruoyi.cai.dto.app.query.order.AddVipOrderDto; +import com.ruoyi.cai.dto.app.vo.order.OrderCreateVo; import com.ruoyi.cai.manager.ConsumerManager; +import com.ruoyi.cai.service.RechargeOrderService; +import com.ruoyi.cai.service.VipOrderService; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.enums.BusinessType; @@ -22,6 +29,10 @@ public class ConsumeController { @Autowired private ConsumerManager consumerManager; + @Autowired + private RechargeOrderService rechargeOrderService; + @Autowired + private VipOrderService vipOrderService; @PostMapping("/give/guard") @Operation(summary = "赠送主播守护") @@ -38,4 +49,29 @@ public class ConsumeController { ConsumeResp resp = consumerManager.sendGift(query); return R.ok(resp.isSuccess()); } + + @PostMapping("/order/vip/create") + @Operation(summary = "创建VIP订单") + @Log(title = "创建VIP订单", businessType = BusinessType.OTHER, isSaveDb = false) + public R vipOrderCreate(@RequestBody AddRechargeOrderDto dto){ + RechargeOrder order = rechargeOrderService.addRechargeOrder(dto); + OrderCreateVo vo = new OrderCreateVo(); + vo.setPrice(order.getPrice()); + vo.setOrderNo(order.getOrderNo()); + vo.setOrderName(order.getRechargeName()); + return R.ok(vo); + } + + + @PostMapping("/order/recharge/create") + @Operation(summary = "创建充值订单") + @Log(title = "创建充值订单", businessType = BusinessType.OTHER, isSaveDb = false) + public R giveGift(@RequestBody AddVipOrderDto dto){ + VipOrder order = vipOrderService.addVipOrder(dto); + OrderCreateVo vo = new OrderCreateVo(); + vo.setPrice(order.getPrice()); + vo.setOrderNo(order.getOrderNo()); + vo.setOrderName(order.getVipName()); + return R.ok(vo); + } } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/PayController.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/PayController.java new file mode 100644 index 00000000..eda9da3f --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/PayController.java @@ -0,0 +1,174 @@ +package com.ruoyi.cai.controller.app; + +import com.alibaba.fastjson2.JSON; +import com.alipay.api.AlipayApiException; +import com.alipay.api.domain.AlipayTradeAppPayModel; +import com.alipay.api.internal.util.AlipaySignature; +import com.ijpay.alipay.AliPayApi; +import com.ijpay.alipay.AliPayApiConfigKit; +import com.ijpay.core.enums.SignType; +import com.ijpay.core.enums.TradeType; +import com.ijpay.core.kit.HttpKit; +import com.ijpay.core.kit.WxPayKit; +import com.ijpay.wxpay.WxPayApi; +import com.ijpay.wxpay.model.UnifiedOrderModel; +import com.ruoyi.cai.domain.PayConfig; +import com.ruoyi.cai.pay.*; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.ServletUtils; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +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 javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/api/pay") +@Tag(name = "支付相关的接口") +@Validated +@Slf4j +public class PayController { + + @Autowired + private PayConfigManager payConfigManager; + @Autowired + private PayManager payManager; + + @PostMapping(value = "/wx") + @Operation(summary = "微信支付") + @Log(title = "微信支付", businessType = BusinessType.OTHER, isSaveDb = false) + public R appPay(@RequestBody PayControllerDTO dto) { + PayConfig payConfig = payConfigManager.getWxConfig(); + String ip = ServletUtils.getClientIP(); + Map params = UnifiedOrderModel + .builder() + .appid(dto.getWxAppId()) + .mch_id(payConfig.getWxMcid()) + .nonce_str(WxPayKit.generateStr()) + .body("微信支付") + .out_trade_no(WxPayKit.generateStr()) + .total_fee("1000") + .spbill_create_ip(ip) + .notify_url(payConfig.getNotifyUrl()) + .trade_type(TradeType.APP.getTradeType()) + .build() + .createSign(payConfig.getWxKey(), SignType.HMACSHA256); + String xmlResult = WxPayApi.pushOrder(false, params); + log.info(xmlResult); + Map result = WxPayKit.xmlToMap(xmlResult); + String returnCode = result.get("return_code"); + String returnMsg = result.get("return_msg"); + if (!WxPayKit.codeIsOk(returnCode)) { + log.error("微信支付失败 returnMsg={}",returnMsg); + return R.fail("微信支付失败,请联系客服"); + } + String resultCode = result.get("result_code"); + if (!WxPayKit.codeIsOk(resultCode)) { + log.error("微信支付失败 returnMsg={}",returnMsg); + return R.fail("微信支付失败,请联系客服"); + } + // 以下字段在 return_code 和 result_code 都为 SUCCESS 的时候有返回 + String prepayId = result.get("prepay_id"); + Map packageParams = WxPayKit.appPrepayIdCreateSign(payConfig.getAppid(), payConfig.getWxMcid(), prepayId, + payConfig.getWxKey(), SignType.HMACSHA256); + String jsonStr = JSON.toJSONString(packageParams); + log.info("返回apk的参数:" + jsonStr); + PayReturnResp resp = new PayReturnResp(); + resp.setData(jsonStr); + return R.ok(resp); + } + + @PostMapping(value = "/ali") + @Operation(summary = "支付宝支付") + @Log(title = "支付宝支付", businessType = BusinessType.OTHER, isSaveDb = false) + public R aliPay(@RequestBody PayControllerDTO dto) { + try { + boolean b = payConfigManager.initAliPay(); + if(!b){ + return R.fail("支付宝支付失败!请联系管理员"); + } + AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); + model.setBody("我是测试数据-By Javen"); + model.setSubject("App支付测试-By Javen"); + model.setOutTradeNo(WxPayKit.generateStr()); + model.setTimeoutExpress("30m"); + model.setTotalAmount("0.01"); + String notifyUrl = AliPayApiConfigKit.getAliPayApiConfig().getServiceUrl(); + String orderInfo = AliPayApi.appPayToResponse(model, notifyUrl).getBody(); + PayReturnResp resp = new PayReturnResp(); + resp.setData(orderInfo); + return R.ok(resp); + } catch (AlipayApiException e) { + log.error("支付宝支付失败",e); + return R.fail("支付宝支付失败,请联系客服"); + } + } + + @PostMapping(value = "/wx/notify") + @Operation(hidden = true) + @Log(title = "微信回调", businessType = BusinessType.OTHER, isSaveDb = false) + public String payNotify(HttpServletRequest request) { + String xmlMsg = HttpKit.readData(request); + log.info("支付通知=" + xmlMsg); + Map params = WxPayKit.xmlToMap(xmlMsg); + String returnCode = params.get("return_code"); + String mchId = params.get("mch_id"); + PayConfig payConfig = payConfigManager.getWxConfigByMchId(mchId); + if(payConfig == null){ + log.error("未找到微信配置 mchId={}",mchId); + return null; + } + // 注意重复通知的情况,同一订单号可能收到多次通知,请注意一定先判断订单状态 + // 注意此处签名方式需与统一下单的签名类型一致 + if (WxPayKit.verifyNotify(params, payConfig.getWxKey(), SignType.HMACSHA256)) { + if (WxPayKit.codeIsOk(returnCode)) { + String outTradeNo = params.get("out_trade_no"); + String transactionId = params.get("transaction_id"); +// String appId = params.get("appid"); + payManager.callBack(outTradeNo,transactionId,params,mchId, PayTypeEnum.WX); + Map xml = new HashMap<>(2); + xml.put("return_code", "SUCCESS"); + xml.put("return_msg", "OK"); + return WxPayKit.toXml(xml); + } + } + return null; + } + + + + @PostMapping(value = "/ali/notify") + @Operation(hidden = true) + @Log(title = "支付宝回调", businessType = BusinessType.OTHER, isSaveDb = false) + public String notifyUrl(HttpServletRequest request) { + try { + Map params = AliPayApi.toMap(request); + log.info("支付宝回调信息:{}",JSON.toJSONString(params)); + String appId = params.get("auth_app_id"); + PayConfig aliConfig = payConfigManager.getAliConfigByAppId(appId); + boolean verifyResult = AlipaySignature.rsaCheckV1(params, aliConfig.getPublicKey(), "UTF-8", "RSA2"); + if (verifyResult) { + String outTradeNo = params.get("out_trade_no"); + String transactionId = params.get("trade_no"); + payManager.callBack(outTradeNo,transactionId,params,appId, PayTypeEnum.ALI); + return "success"; + } else { + log.error("notify_url 验证失败"); + return "failure"; + } + } catch (AlipayApiException e) { + e.printStackTrace(); + return "failure"; + } + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/UserMemberAppController.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/UserMemberAppController.java deleted file mode 100644 index 1b585a10..00000000 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/UserMemberAppController.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.ruoyi.cai.controller.app; - -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/user/member") -@Slf4j -@Tag(name = "用户会员接口") -public class UserMemberAppController { -} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/test/TestPayController.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/test/TestPayController.java index 2abf4674..797ebe69 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/test/TestPayController.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/test/TestPayController.java @@ -2,8 +2,8 @@ package com.ruoyi.cai.controller.test; import com.ruoyi.cai.domain.RechargeOrder; import com.ruoyi.cai.domain.VipOrder; -import com.ruoyi.cai.dto.AddRechargeOrderDto; -import com.ruoyi.cai.dto.dto.AddVipOrderDto; +import com.ruoyi.cai.dto.app.query.order.AddRechargeOrderDto; +import com.ruoyi.cai.dto.app.query.order.AddVipOrderDto; import com.ruoyi.cai.pay.PayManager; import com.ruoyi.cai.service.RechargeOrderService; import com.ruoyi.cai.service.VipOrderService; diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/RechargeOrder.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/RechargeOrder.java index 12fb3535..859d6271 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/RechargeOrder.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/RechargeOrder.java @@ -63,6 +63,8 @@ public class RechargeOrder implements Serializable { * 状态 0-待支付 1-已支付 2-已退款 10-无需支付 */ private Integer payStatus; + + private LocalDateTime payTime; /** * appId */ diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/VipOrder.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/VipOrder.java index 9d386d4e..0c8c5ada 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/VipOrder.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/VipOrder.java @@ -66,6 +66,7 @@ public class VipOrder implements Serializable { * 状态 0-待支付 1-已支付 2-已退款 */ private Integer payStatus; + private LocalDateTime payTime; /** * appId */ diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/AddRechargeOrderDto.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/AddRechargeOrderDto.java deleted file mode 100644 index 933a0a97..00000000 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/AddRechargeOrderDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.ruoyi.cai.dto; - -import lombok.Data; - -@Data -public class AddRechargeOrderDto { - /** - * 员工ID - */ - private Long userId; - /** - * 商品ID - */ - private Long goodId; - -} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/ConsumeResp.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/ConsumeResp.java index 9d361df0..a3eeed2a 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/ConsumeResp.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/ConsumeResp.java @@ -2,8 +2,11 @@ package com.ruoyi.cai.dto; import lombok.Data; +import java.math.BigDecimal; + @Data public class ConsumeResp { + private BigDecimal price; private Long userId; private Long consumeLogId; private Long traceId; diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/query/order/AddRechargeOrderDto.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/query/order/AddRechargeOrderDto.java new file mode 100644 index 00000000..20c87335 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/query/order/AddRechargeOrderDto.java @@ -0,0 +1,19 @@ +package com.ruoyi.cai.dto.app.query.order; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class AddRechargeOrderDto { + /** + * 员工ID + */ + @Schema(description = "用户ID",hidden = true) + private Long userId; + /** + * 商品ID + */ + @Schema(description = "商品ID") + private Long goodId; + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/query/order/AddVipOrderDto.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/query/order/AddVipOrderDto.java new file mode 100644 index 00000000..694d6850 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/query/order/AddVipOrderDto.java @@ -0,0 +1,12 @@ +package com.ruoyi.cai.dto.app.query.order; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class AddVipOrderDto { + @Schema(description = "用户ID",hidden = true) + private Long userId; + @Schema(description = "VIP价格ID") + private Long memberPriceId; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/order/OrderCreateVo.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/order/OrderCreateVo.java new file mode 100644 index 00000000..43d83137 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/order/OrderCreateVo.java @@ -0,0 +1,16 @@ +package com.ruoyi.cai.dto.app.vo.order; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class OrderCreateVo { + @Schema(description = "订单号") + private String orderNo; + @Schema(description = "支付金额") + private BigDecimal price; + @Schema(description = "订单名称") + private String orderName; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/dto/AddVipOrderDto.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/dto/AddVipOrderDto.java deleted file mode 100644 index a0eb207d..00000000 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/dto/AddVipOrderDto.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.ruoyi.cai.dto.dto; - -import lombok.Data; - -@Data -public class AddVipOrderDto { - - private Long userId; - private Long memberPriceId; -} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ConsumerManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ConsumerManager.java index 29a69bef..c41018be 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ConsumerManager.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ConsumerManager.java @@ -6,6 +6,7 @@ import com.ruoyi.cai.dto.app.query.GiveGiftRes; import com.ruoyi.cai.dto.app.query.GiveGuardReq; import com.ruoyi.cai.dto.video.VideoSettleResp; import com.ruoyi.cai.mq.AmqpProducer; +import com.ruoyi.cai.pay.PayTypeEnum; import com.ruoyi.cai.rank.RankManager; import com.ruoyi.cai.service.AccountService; import com.ruoyi.cai.service.GuardTotalService; @@ -16,6 +17,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.Map; + @Component @Slf4j public class ConsumerManager { @@ -68,8 +71,8 @@ public class ConsumerManager { return resp; } - public ConsumeResp rechargeOrderSuccess(String tradeNo){ - ConsumeResp resp = rechargeOrderService.orderSuccess(tradeNo); + public ConsumeResp rechargeOrderSuccess(String tradeNo, Map params, String appId, PayTypeEnum payTypeEnum){ + ConsumeResp resp = rechargeOrderService.orderSuccess(tradeNo,params,appId,payTypeEnum); if(resp.isSuccess()){ try { amqpProducer.sendCalculateSales(resp.getConsumeLogId()+""); diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayConfigManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayConfigManager.java new file mode 100644 index 00000000..6e3421f2 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayConfigManager.java @@ -0,0 +1,106 @@ +package com.ruoyi.cai.pay; + +import com.alipay.api.domain.AppItemDataDiffVO; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.ijpay.alipay.AliPayApiConfig; +import com.ijpay.alipay.AliPayApiConfigKit; +import com.ruoyi.cai.domain.PayConfig; +import com.ruoyi.cai.service.PayConfigService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Component +@Slf4j +public class PayConfigManager { + private static final Map PAY_CONFIGS_MAP = new HashMap<>(); + @Autowired + private PayConfigService payConfigService; + + @PostConstruct + public void init(){ + List list = payConfigService.list(Wrappers.lambdaQuery(PayConfig.class)); + for (PayConfig payConfig : list) { + PAY_CONFIGS_MAP.put(payConfig.getId(), payConfig); + } + } + + // 1支付宝2微信 + public void addPayConfig(PayConfig payConfig) { + PAY_CONFIGS_MAP.put(payConfig.getId(),payConfig); + } + + public void updatePayConfig(PayConfig payConfig) { + PAY_CONFIGS_MAP.put(payConfig.getId(),payConfig); + if(PayTypeEnum.ALI.getCode().equals(payConfig.getPayType())){ + AliPayApiConfigKit.removeApiConfig(payConfig.getAppid()); + } + } + + public void deletePayConfig(PayConfig payConfig) { + PAY_CONFIGS_MAP.remove(payConfig.getId()); + if(PayTypeEnum.ALI.getCode().equals(payConfig.getPayType())){ + AliPayApiConfigKit.removeApiConfig(payConfig.getAppid()); + } + } + + public PayConfig getWxConfig(){ + Collection values = PAY_CONFIGS_MAP.values(); + for (PayConfig value : values) { + if(PayTypeEnum.WX.getCode().equals(value.getPayType())){ + return value; + } + } + return null; + } + + public PayConfig getAliConfig(){ + Collection values = PAY_CONFIGS_MAP.values(); + for (PayConfig value : values) { + if(PayTypeEnum.ALI.getCode().equals(value.getPayType())){ + return value; + } + } + return null; + } + + + public boolean initAliPay() { + PayConfig payConfig = this.getAliConfig(); + if(payConfig == null){ + return false; + } + AliPayApiConfig aliPayApiConfig; + try { + aliPayApiConfig = AliPayApiConfigKit.getApiConfig(payConfig.getAppid()); + } catch (Exception e) { + log.error("实例化AliPayApiConfig..."); + // 如果Map中没有当前支付宝的实例就初始化并添加到Map中 + aliPayApiConfig = AliPayApiConfig.builder() + .setAppId(payConfig.getAppid()) + .setAliPayPublicKey(payConfig.getPublicKey()) + .setCharset("UTF-8") + .setPrivateKey(payConfig.getPrivateKey()) + .setServiceUrl(payConfig.getNotifyUrl()) + .setSignType("RSA2") + .build(); + } + AliPayApiConfigKit.setThreadLocalAliPayApiConfig(aliPayApiConfig); + return true; + } + + public PayConfig getAliConfigByAppId(String appId) { + this.getWxConfigByMchId(appId); + return null; + } + + public PayConfig getWxConfigByMchId(String mchId) { + return null; + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayControllerDTO.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayControllerDTO.java new file mode 100644 index 00000000..f9369087 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayControllerDTO.java @@ -0,0 +1,12 @@ +package com.ruoyi.cai.pay; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class PayControllerDTO { + @Schema(description = "订单号") + private String tradeNo; + @Schema(description = "微信支付的时候需要传") + private String wxAppId; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayManager.java index 8216c31a..c49e158e 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayManager.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayManager.java @@ -8,6 +8,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.Map; + @Component @Slf4j public class PayManager { @@ -20,6 +22,10 @@ public class PayManager { private AwardManager awardManager; public void callBack(String orderNo){ + callBack(orderNo,null,null,null,null); + } + + public void callBack(String orderNo, String transId, Map params, String appId,PayTypeEnum payTypeEnum){ OrderTypeEnum orderTypeEnum = OrderNoUtil.getType(orderNo); if(orderTypeEnum == null){ log.error("订单类型有误!orderNo={}",orderNo); @@ -27,17 +33,20 @@ public class PayManager { } switch (orderTypeEnum){ case VIP_ORDER_SUB: - vipOrderService.orderSuccess(orderNo); + ConsumeResp vipResp = vipOrderService.orderSuccess(orderNo,params,appId,payTypeEnum); + if(vipResp.isSuccess()){ + // 记录数据 TODO + } break; case RECHARGE_ORDER_SUB: - ConsumeResp resp = consumerManager.rechargeOrderSuccess(orderNo); + ConsumeResp resp = consumerManager.rechargeOrderSuccess(orderNo,params,appId,payTypeEnum); if(resp.isSuccess()){ awardManager.giveFastPayAsync(resp.getUserId(), resp.getTraceId()); + // 记录数据 TODO } break; default: break; } - } } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayReturnResp.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayReturnResp.java new file mode 100644 index 00000000..9548b59a --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayReturnResp.java @@ -0,0 +1,8 @@ +package com.ruoyi.cai.pay; + +import lombok.Data; + +@Data +public class PayReturnResp { + private String data; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayTypeEnum.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayTypeEnum.java new file mode 100644 index 00000000..4f4e5c32 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayTypeEnum.java @@ -0,0 +1,16 @@ +package com.ruoyi.cai.pay; + +public enum PayTypeEnum { + ALI(1), + WX(2), + ; + private final Integer code; + + PayTypeEnum(Integer code) { + this.code = code; + } + + public Integer getCode() { + return code; + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/PayConfigService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/PayConfigService.java index 84f58f8a..7f5505b3 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/PayConfigService.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/PayConfigService.java @@ -11,4 +11,9 @@ import com.ruoyi.cai.domain.PayConfig; */ public interface PayConfigService extends IService { + boolean addPayConfig(PayConfig payConfig); + + boolean updatePayConfig(PayConfig payConfig); + + boolean deletePayConfig(Long id); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/RechargeOrderService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/RechargeOrderService.java index e1920616..1778af83 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/RechargeOrderService.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/RechargeOrderService.java @@ -4,11 +4,13 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.cai.domain.RechargeOrder; import com.ruoyi.cai.dto.AddRechargeOrderAdminDto; -import com.ruoyi.cai.dto.AddRechargeOrderDto; +import com.ruoyi.cai.dto.app.query.order.AddRechargeOrderDto; import com.ruoyi.cai.dto.ConsumeResp; import com.ruoyi.cai.dto.admin.vo.RechargeOrderAdminVo; +import com.ruoyi.cai.pay.PayTypeEnum; import com.ruoyi.common.core.domain.PageQuery; -import org.springframework.transaction.annotation.Transactional; + +import java.util.Map; /** * 充值订单Service接口 @@ -24,7 +26,7 @@ public interface RechargeOrderService extends IService { RechargeOrder addRechargeOrder(AddRechargeOrderDto addRechargeOrderDto); - ConsumeResp orderSuccess(String orderNo); + ConsumeResp orderSuccess(String orderNo, Map params, String appId, PayTypeEnum payTypeEnum); RechargeOrder updateAdminRechargeOrder(AddRechargeOrderAdminDto dto); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/VipOrderService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/VipOrderService.java index f2065c3d..46b884de 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/VipOrderService.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/VipOrderService.java @@ -3,10 +3,14 @@ package com.ruoyi.cai.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.cai.domain.VipOrder; +import com.ruoyi.cai.dto.ConsumeResp; import com.ruoyi.cai.dto.admin.vo.VipOrderAdminVo; -import com.ruoyi.cai.dto.dto.AddVipOrderDto; +import com.ruoyi.cai.dto.app.query.order.AddVipOrderDto; +import com.ruoyi.cai.pay.PayTypeEnum; import com.ruoyi.common.core.domain.PageQuery; +import java.util.Map; + /** * VIP订单Service接口 * @@ -21,7 +25,7 @@ public interface VipOrderService extends IService { VipOrder getByOrderNo(String orderNo); - void orderSuccess(String orderNo); + ConsumeResp orderSuccess(String orderNo, Map params, String appId, PayTypeEnum payTypeEnum); Page pageAdmin(PageQuery pageQuery, VipOrderAdminVo bo); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/PayConfigServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/PayConfigServiceImpl.java index 4cb402dc..8e13f00f 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/PayConfigServiceImpl.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/PayConfigServiceImpl.java @@ -3,9 +3,11 @@ package com.ruoyi.cai.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.cai.domain.PayConfig; import com.ruoyi.cai.mapper.PayConfigMapper; +import com.ruoyi.cai.pay.PayConfigManager; import com.ruoyi.cai.service.PayConfigService; -import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** * 支付配置Service业务层处理 @@ -13,7 +15,46 @@ import org.springframework.stereotype.Service; * @author 77 * @date 2024-01-20 */ -@RequiredArgsConstructor @Service public class PayConfigServiceImpl extends ServiceImpl implements PayConfigService { + + @Autowired + private PayConfigManager payConfigManager; + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean addPayConfig(PayConfig payConfig){ + boolean save = this.save(payConfig); + if(save){ + payConfigManager.addPayConfig(payConfig); + } + return save; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updatePayConfig(PayConfig payConfig){ + boolean update = this.updateById(payConfig); + if(update){ + payConfig = this.getById(payConfig.getId()); + payConfigManager.updatePayConfig(payConfig); + } + return update; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deletePayConfig(Long id){ + PayConfig payConfig = this.getById(id); + if(payConfig == null){ + return false; + } + boolean b = this.removeById(id); + if(b){ + payConfigManager.deletePayConfig(payConfig); + } + return b; + } + + } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/RechargeOrderServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/RechargeOrderServiceImpl.java index b6b94b37..60f15538 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/RechargeOrderServiceImpl.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/RechargeOrderServiceImpl.java @@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.cai.domain.*; import com.ruoyi.cai.dto.AddRechargeOrderAdminDto; -import com.ruoyi.cai.dto.AddRechargeOrderDto; +import com.ruoyi.cai.dto.app.query.order.AddRechargeOrderDto; import com.ruoyi.cai.dto.ConsumeResp; import com.ruoyi.cai.dto.admin.vo.RechargeOrderAdminVo; import com.ruoyi.cai.enums.ConsumeLogType; @@ -15,10 +15,7 @@ import com.ruoyi.cai.enums.account.AccountTypeEnum; import com.ruoyi.cai.manager.IdManager; import com.ruoyi.cai.mapper.AccountMapper; import com.ruoyi.cai.mapper.RechargeOrderMapper; -import com.ruoyi.cai.pay.OrderNoUtil; -import com.ruoyi.cai.pay.OrderTypeEnum; -import com.ruoyi.cai.pay.PayStatusEnum; -import com.ruoyi.cai.pay.PlatformTypeEnum; +import com.ruoyi.cai.pay.*; import com.ruoyi.cai.service.*; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.exception.ServiceException; @@ -31,6 +28,8 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Map; /** * 充值订单Service业务层处理 @@ -93,7 +92,7 @@ public class RechargeOrderServiceImpl extends ServiceImpl params, String appId, PayTypeEnum payTypeEnum){ RechargeOrder rechargeOrder = this.getByOrderNo(orderNo); if(rechargeOrder == null){ throw new ServiceException("订单不存在"); @@ -103,10 +102,15 @@ public class RechargeOrderServiceImpl extends ServiceImpl im @Override @Transactional(rollbackFor = Exception.class) - public void orderSuccess(String orderNo){ + public ConsumeResp orderSuccess(String orderNo, Map params, String appId, PayTypeEnum payTypeEnum){ VipOrder vipOrder = this.getByOrderNo(orderNo); if(vipOrder == null){ throw new ServiceException("订单不存在"); @@ -127,16 +129,27 @@ public class VipOrderServiceImpl extends ServiceImpl im log.error("订单支付状态错误!vipOrder={}", JSON.toJSONString(vipOrder)); throw new ServiceException("订单支付状态错误!"); } + Integer payType = payTypeEnum == null ? null : payTypeEnum.getCode(); boolean update = this.update(Wrappers.lambdaUpdate(VipOrder.class) .eq(VipOrder::getOrderNo, vipOrder.getOrderNo()) .eq(VipOrder::getPayStatus, PayStatusEnum.READY_PAY.getCode()) - .set(VipOrder::getPayStatus, PayStatusEnum.PAY.getCode())); + .set(VipOrder::getPayStatus, PayStatusEnum.PAY.getCode()) + .set(VipOrder::getPayTime, LocalDateTime.now()) + .set(VipOrder::getAppid,appId) + .set(payType != null, VipOrder::getPlatformType,payType) + .set(VipOrder::getReturnContent,JSON.toJSONString(params)) + ); if(!update){ log.error("订单支付状态错误!vipOrder={}", JSON.toJSONString(vipOrder)); throw new ServiceException("订单支付状态错误!"); } // 新增会员 incVip(vipOrder.getUserId(),vipOrder.getVipType(),vipOrder.getVipExpire(),vipOrder.getVipLongs()); + ConsumeResp consumeResp = new ConsumeResp(); + consumeResp.setPrice(vipOrder.getPrice()); + consumeResp.setUserId(vipOrder.getUserId()); + consumeResp.setSuccess(true); + return consumeResp; } public boolean incVip(Long userId,Integer memberType,Integer expire,Integer longs){