diff --git a/server/like-front/src/main/java/com/mdd/front/LikeFrontInterceptor.java b/server/like-front/src/main/java/com/mdd/front/LikeFrontInterceptor.java index 0d94a225..42e3f040 100644 --- a/server/like-front/src/main/java/com/mdd/front/LikeFrontInterceptor.java +++ b/server/like-front/src/main/java/com/mdd/front/LikeFrontInterceptor.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.mdd.common.aop.NotLogin; import com.mdd.common.core.AjaxResult; import com.mdd.common.entity.user.User; +import com.mdd.common.enums.ClientEnum; import com.mdd.common.enums.ErrorEnum; import com.mdd.common.exception.LoginException; import com.mdd.common.mapper.user.UserMapper; @@ -53,7 +54,7 @@ public class LikeFrontInterceptor implements HandlerInterceptor { // 记录当前平台 String terminal = request.getHeader("terminal"); - LikeFrontThreadLocal.put("terminal", StringUtils.isEmpty(terminal) ? "1" : terminal); + LikeFrontThreadLocal.put("terminal", StringUtils.isEmpty(terminal) ? ClientEnum.H5.getCode() : terminal); // 登录权限校验 try { diff --git a/server/like-front/src/main/java/com/mdd/front/controller/AliPayController.java b/server/like-front/src/main/java/com/mdd/front/controller/AliPayController.java new file mode 100644 index 00000000..6b030e8c --- /dev/null +++ b/server/like-front/src/main/java/com/mdd/front/controller/AliPayController.java @@ -0,0 +1,109 @@ +package com.mdd.front.controller; + +import com.alibaba.fastjson2.JSONObject; +import com.alipay.api.internal.util.AlipaySignature; +import com.mdd.common.aop.NotLogin; +import com.mdd.common.config.AlipayConfig; +import com.mdd.common.util.ConfigUtils; +import com.mdd.front.service.IRechargeService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + + +/** + * @author panweiliang + */ +@Slf4j +@RestController +@RequestMapping("/api/pay/ali") +public class AliPayController { + @Resource + IRechargeService iRechargeService; + // 支付回调通知处理 + @PostMapping("/notify/order") + @NotLogin + public void notifyUrl(HttpServletRequest request, HttpServletResponse response) throws Exception { + //log.info("异步通知"); + PrintWriter out = response.getWriter(); + try { + //乱码解决,这段代码在出现乱码时使用 + request.setCharacterEncoding("utf-8"); + //获取支付宝POST过来反馈信息 + Map params = new HashMap<>(8); + Map requestParams = request.getParameterMap(); + for (Map.Entry stringEntry : requestParams.entrySet()) { + String[] values = stringEntry.getValue(); + String valueStr = ""; + for (int i = 0; i < values.length; i++) { + valueStr = (i == values.length - 1) ? valueStr + values[i] + : valueStr + values[i] + ","; + } + params.put(stringEntry.getKey(), valueStr); + } + + //调用SDK验证签名 + boolean signVerified = AlipaySignature.rsaCheckV1(params, ConfigUtils.getAliDevPay("ali_public_key"), AlipayConfig.CHARSET, AlipayConfig.SIGN_TYPE); + + if (!signVerified) { + log.error("验签失败"); + out.print("fail"); + return; + } + // 通知ID + String notifyId = new String(params.get("notify_id").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + // 通知时间 + String notifyTime = new String(params.get("notify_time").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + //商户订单号,之前生成的带用户ID的订单号 + String outTradeNo = new String(params.get("out_trade_no").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + //支付宝交易号 + String tradeNo = new String(params.get("trade_no").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + //付款金额 + String totalAmount = new String(params.get("total_amount").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + //交易状态 + String tradeStatus = new String(params.get("trade_status").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + + //自定义参数 + JSONObject passbackParams = JSONObject.parseObject(new String(params.get("passback_params").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)); + String from = passbackParams.getString("from"); + /* + * 交易状态 + * TRADE_SUCCESS 交易完成 + * TRADE_FINISHED 支付成功 + * WAIT_BUYER_PAY 交易创建 + * TRADE_CLOSED 交易关闭 + */ + //log.info("tradeStatus:" + tradeStatus); + + if ("TRADE_FINISHED".equals(tradeStatus)) { + /*此处可自由发挥*/ + //判断该笔订单是否在商户网站中已经做过处理 + //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 + //如果有做过处理,不执行商户的业务程序 + //注意: + //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知 + } else if ("TRADE_SUCCESS".equals(tradeStatus)) { + if (from.equals("recharge")) { + iRechargeService.updatePayOrderStatusToPaid(outTradeNo, tradeNo); + } + + if (from.equals("member")) { + return; + } + } + } finally { + out.print("fail"); + } + //out.print("success"); + } +} + diff --git a/server/like-front/src/main/java/com/mdd/front/service/IRechargeService.java b/server/like-front/src/main/java/com/mdd/front/service/IRechargeService.java index ad768987..8c9f89b5 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/IRechargeService.java +++ b/server/like-front/src/main/java/com/mdd/front/service/IRechargeService.java @@ -42,4 +42,13 @@ public interface IRechargeService { */ Map placeOrder(Integer userId, Integer terminal, RechargeValidate rechargeValidate); + /** + * @notes 阿里支付后更新状态 + * @return array + * @throws @\think\db\exception\DataNotFoundException + * @throws @\think\db\exception\DbException + * @throws @\think\db\exception\ModelNotFoundException + * @author damonyuan + */ + void updatePayOrderStatusToPaid(String outTradeNo, String tradeNo); } diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/PayServiceImpl.java b/server/like-front/src/main/java/com/mdd/front/service/impl/PayServiceImpl.java index 96fde7a6..9e6f492a 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/impl/PayServiceImpl.java +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/PayServiceImpl.java @@ -165,6 +165,7 @@ public class PayServiceImpl implements IPayService { */ public Object prepay(PaymentValidate params, Integer terminal) { try { + params.setTerminal(terminal); String openId = null; UserAuth userAuth = userAuthMapper.selectOne(new QueryWrapper() .eq("user_id", params.getUserId()) @@ -276,10 +277,8 @@ public class PayServiceImpl implements IPayService { }})); if (params.getTerminal().equals(ClientEnum.H5.getCode())) { AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest(); - - //alipayRequest.setNotifyUrl("hhttp://bq93pv.natappfree.cc" + aliPayNotifyUrl); + //alipayRequest.setNotifyUrl("http://y4f8ud.natappfree.cc" + aliPayNotifyUrl); alipayRequest.setNotifyUrl(UrlUtils.getRequestUrl() + aliPayNotifyUrl); - alipayRequest.setReturnUrl(payReturnUrl); alipayRequest.setBizContent(bizContent.toString()); @@ -293,7 +292,7 @@ public class PayServiceImpl implements IPayService { } } else { AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); - //alipayRequest.setNotifyUrl("http://bq93pv.natappfree.cc" + aliPayNotifyUrl); + //alipayRequest.setNotifyUrl("http://y4f8ud.natappfree.cc" + aliPayNotifyUrl); alipayRequest.setNotifyUrl(UrlUtils.getRequestUrl() + aliPayNotifyUrl); alipayRequest.setReturnUrl(payReturnUrl); alipayRequest.setBizContent(bizContent.toString()); diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/RechargeServiceImpl.java b/server/like-front/src/main/java/com/mdd/front/service/impl/RechargeServiceImpl.java index 30a6f4f2..d5c3a3d8 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/impl/RechargeServiceImpl.java +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/RechargeServiceImpl.java @@ -1,23 +1,29 @@ package com.mdd.front.service.impl; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.mdd.common.core.PageResult; import com.mdd.common.entity.RechargeOrder; import com.mdd.common.entity.user.User; +import com.mdd.common.enums.AccountLogEnum; import com.mdd.common.enums.PaymentEnum; import com.mdd.common.exception.OperateException; import com.mdd.common.mapper.RechargeOrderMapper; +import com.mdd.common.mapper.log.UserAccountLogMapper; import com.mdd.common.mapper.user.UserMapper; import com.mdd.common.util.ConfigUtils; +import com.mdd.common.util.StringUtils; import com.mdd.common.util.TimeUtils; import com.mdd.front.service.IRechargeService; +import com.mdd.front.service.IUserAccountLogService; import com.mdd.front.validate.RechargeValidate; import com.mdd.front.validate.common.PageValidate; import com.mdd.front.vo.RechargeConfigVo; import com.mdd.front.vo.RechargeRecordVo; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; @@ -32,6 +38,8 @@ import java.util.Map; @Service public class RechargeServiceImpl implements IRechargeService { + @Resource + UserAccountLogMapper userAccountLogMapper; @Resource RechargeOrderMapper rechargeOrderMapper; @@ -128,4 +136,31 @@ public class RechargeServiceImpl implements IRechargeService { return response; } + @Override + @Transactional + public void updatePayOrderStatusToPaid(String outTradeNo, String tradeNo) { + RechargeOrder order = rechargeOrderMapper.selectOne(new QueryWrapper().eq("sn", outTradeNo).isNull("delete_time")); + if (StringUtils.isNull(order)) { + return; + } + + if (order.getPayStatus().equals(PaymentEnum.OK_PAID.getCode())) { //如果是已支付的状态,则不会再更新 + return; + } + Integer userId = order.getUserId(); + String orderSn = outTradeNo; + + User user = userMapper.selectById(order.getUserId()); + user.setUserMoney(user.getUserMoney().add(order.getOrderAmount())); + user.setTotalRechargeAmount(user.getTotalRechargeAmount().add(order.getOrderAmount())); + userMapper.updateById(user); + + //add account log + userAccountLogMapper.add(userId, AccountLogEnum.UM_INC_RECHARGE.getCode(), order.getOrderAmount(), order.getId(), order.getSn(), "", ""); + + order.setTransactionId(tradeNo); + order.setPayStatus(PaymentEnum.OK_PAID.getCode()); + order.setPayTime(System.currentTimeMillis() / 1000); + rechargeOrderMapper.updateById(order); + } }