feat 适配支付宝支付模块
This commit is contained in:
parent
5b2ae7c83b
commit
29f516aa6d
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue