feat 适配支付宝支付模块

This commit is contained in:
damonyuan 2024-10-24 00:28:54 +08:00
parent 5b2ae7c83b
commit 29f516aa6d
5 changed files with 158 additions and 5 deletions

View File

@ -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 {

View File

@ -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<String, String> params = new HashMap<>(8);
Map<String, String[]> requestParams = request.getParameterMap();
for (Map.Entry<String, String[]> 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");
}
}

View File

@ -42,4 +42,13 @@ public interface IRechargeService {
*/
Map<String, Object> 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);
}

View File

@ -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<UserAuth>()
.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());

View File

@ -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<RechargeOrder>().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);
}
}