From c78b73181684c446c9cffca07d65a22526e04738 Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Wed, 12 Feb 2025 10:49:37 +0800 Subject: [PATCH] =?UTF-8?q?feat(pay):=20=E9=87=91=E5=B8=81=E5=85=85?= =?UTF-8?q?=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pay/AliPay/AliPayController.java | 9 ++++ .../com/mcwl/pay/domain/OrderTradeDto.java | 4 +- .../com/mcwl/pay/service/AliPayService.java | 4 ++ .../pay/service/impl/AliPayServiceImpl.java | 40 +++++++++++++++++- .../service/impl/OrderTradeServiceImpl.java | 41 ++++++++++++++++++- .../resource/domain/enums/OrderTypeEnum.java | 1 + 6 files changed, 94 insertions(+), 5 deletions(-) diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/AliPayController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/AliPayController.java index 5e27192..1b20de3 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/AliPayController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/AliPayController.java @@ -136,6 +136,15 @@ public class AliPayController extends BaseController { } else if ("points".equalsIgnoreCase(type)) { payVo = aliPayService.pointsPay(orderTradeDto.getAmount()); // QrCodeUtil.generate(payVo.getUrl(), 300, 300, "png", response.getOutputStream()); + } else if ("wallet".equalsIgnoreCase(type)) { + // 充值金额只能是整数 + if (orderTradeDto.getAmount() % 1 != 0) { + return AjaxResult.error("充值金额只能是整数"); + } + payVo = aliPayService.walletPay(orderTradeDto.getAmount()); +// QrCodeUtil.generate(payVo.getUrl(), 300, 300, "png", response.getOutputStream()); + } else { + return AjaxResult.error("订单类型错误"); } return AjaxResult.success(payVo); diff --git a/mcwl-pay/src/main/java/com/mcwl/pay/domain/OrderTradeDto.java b/mcwl-pay/src/main/java/com/mcwl/pay/domain/OrderTradeDto.java index 07b979b..c69669e 100644 --- a/mcwl-pay/src/main/java/com/mcwl/pay/domain/OrderTradeDto.java +++ b/mcwl-pay/src/main/java/com/mcwl/pay/domain/OrderTradeDto.java @@ -14,7 +14,7 @@ public class OrderTradeDto { /** * 商品ID */ - @ApiModelProperty(value = "商品ID 如果订单类型是points,可以不传") + @ApiModelProperty(value = "商品ID 如果订单类型是points 或者 wallet,可以不传") private Integer productId; /** @@ -27,7 +27,7 @@ public class OrderTradeDto { /** * 订单类型 会员member 积分points */ - @ApiModelProperty(value = "订单类型 会员member 积分points", required = true) + @ApiModelProperty(value = "订单类型 会员member 积分points 金币 wallet", required = true) @NotBlank(message = "订单类型不能为空") private String type; diff --git a/mcwl-pay/src/main/java/com/mcwl/pay/service/AliPayService.java b/mcwl-pay/src/main/java/com/mcwl/pay/service/AliPayService.java index 14f38b1..d380390 100644 --- a/mcwl-pay/src/main/java/com/mcwl/pay/service/AliPayService.java +++ b/mcwl-pay/src/main/java/com/mcwl/pay/service/AliPayService.java @@ -5,6 +5,8 @@ import com.mcwl.common.core.domain.AjaxResult; import com.mcwl.pay.domain.OrderTradeDto; import com.mcwl.pay.domain.vo.PayVo; +import javax.validation.constraints.NotNull; + public interface AliPayService { String bindingCallback(String authCode, String state); @@ -18,4 +20,6 @@ public interface AliPayService { AjaxResult queryTradeStatus(String outTradeNo) throws Exception; String balance() throws AlipayApiException; + + PayVo walletPay(Double amount) throws Exception; } diff --git a/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/AliPayServiceImpl.java b/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/AliPayServiceImpl.java index 90c3f57..bb56934 100644 --- a/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/AliPayServiceImpl.java +++ b/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/AliPayServiceImpl.java @@ -198,7 +198,7 @@ public class AliPayServiceImpl implements AliPayService { /** * 调用支付宝预下订单接口 * - * @param paymentAmount 充值金额 + * @param paymentAmount 充值积分 * @return 二维码url * @throws Exception */ @@ -232,6 +232,44 @@ public class AliPayServiceImpl implements AliPayService { return payVo; } + + /** + * 调用支付宝预下订单接口 + * + * @param paymentAmount 充值金币 + * @return 二维码url + * @throws Exception + */ + @Override + public PayVo walletPay(Double paymentAmount) throws Exception { + // 设置orderTrade信息 + OrderTrade tradeEntity = new OrderTrade(); + tradeEntity.setCode(UUID.randomUUID().toString(true).substring(0, 30) + "_wallet"); + tradeEntity.setUserId(SecurityUtils.getUserId()); + tradeEntity.setProductId(-1); + tradeEntity.setProductName("金币充值"); + tradeEntity.setUserName(SecurityUtils.getUsername()); + tradeEntity.setTotalAmount(paymentAmount); + tradeEntity.setOrderStatus(1); + tradeEntity.setPayStatus(1); + orderTradeService.save(tradeEntity); + //调用支付宝的接口 + AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace() + .preCreate(tradeEntity.getProductName(), + tradeEntity.getCode(), + paymentAmount.toString()); + //参照官方文档响应示例,解析返回结果 + String httpBodyStr = payResponse.getHttpBody(); + JSONObject jsonObject = JSONObject.parseObject(httpBodyStr); + + String url = jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString(); + PayVo payVo = new PayVo(); + payVo.setOrderNo(tradeEntity.getCode()); + payVo.setUrl(url); + + return payVo; + } + /** * 支付宝转账方法 * diff --git a/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/OrderTradeServiceImpl.java b/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/OrderTradeServiceImpl.java index 683f1cc..70e423e 100644 --- a/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/OrderTradeServiceImpl.java +++ b/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/OrderTradeServiceImpl.java @@ -125,14 +125,20 @@ public class OrderTradeServiceImpl extends ServiceImpl params) { - this.orderHandler(orderTrade, params); + + // 根据订单类型进行处理 if (OrderTypeEnum.POINTS.getName().equals(suffix)) { pointsHandler(orderTrade, params); } else if (OrderTypeEnum.MEMBER.getName().equals(suffix)) { Long promotionId = redisCache.getCacheObject(params.get("out_trade_no") + "promotionId"); memberHandler(orderTrade, promotionId); + } else if (OrderTypeEnum.WALLET.getName().equals(suffix)) { + walletHandler(orderTrade, params); + } else { + throw new RuntimeException("订单类型错误"); } - + // 处理订单 + this.orderHandler(orderTrade, params); // 删除redis缓存 redisCache.deleteObject(orderTrade.getCode()); redisCache.deleteObject(params.get("out_trade_no") + "promotionId"); @@ -161,6 +167,37 @@ public class OrderTradeServiceImpl extends ServiceImpl params) { + + // 获取支付金额 + String amount = params.get("buyer_pay_amount"); + + BigDecimal amountBigDecimal = new BigDecimal(amount); + + Long userId = orderTrade.getUserId(); + SysUser user = sysUserService.selectUserById(userId); + + BigDecimal wallet = new BigDecimal(user.getWallet().toString()); + + BigDecimal walletDecimal = wallet.add(amountBigDecimal); + + user.setFreePoints(walletDecimal.doubleValue()); + sysUserService.updateUser(user); + + // 添加充值记录 +// RechargeRecord rechargeRecord = new RechargeRecord(); +// rechargeRecord.setUserId(userId); +// rechargeRecord.setCode(orderTrade.getCode()); +// rechargeRecord.setAmount(Double.parseDouble(amount)); +// rechargeRecord.setPoints(points); +// rechargeRecord.setCreateBy(user.getUserName()); +// rechargeRecord.setUpdateBy(user.getUserName()); +// rechargeRecord.setUpdateTime(new Date()); +// rechargeRecordService.save(rechargeRecord); + + } private void memberHandler(OrderTrade orderTrade, Long promotionId) { diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/domain/enums/OrderTypeEnum.java b/mcwl-resource/src/main/java/com/mcwl/resource/domain/enums/OrderTypeEnum.java index 4a4dd8e..6f92f4f 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/domain/enums/OrderTypeEnum.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/domain/enums/OrderTypeEnum.java @@ -12,6 +12,7 @@ public enum OrderTypeEnum { TIME("time"), NUM("num"), POINTS("points"), + WALLET("wallet"), MEMBER("member"); private final String name;