From d8fb82111f08f7f3be1d9cff9e7a11dfc120ad77 Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Mon, 27 Sep 2021 19:06:20 +0800 Subject: [PATCH] fix alipay callback --- src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java | 11 ++++- src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImpl.java | 40 ++++++++++++++++++++ src/main/java/cc/mrbird/febs/pay/controller/PayCallBackController.java | 40 +++++++++++++++++--- sql/xc_mall.sql | 5 ++ src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java | 2 + src/main/java/cc/mrbird/febs/pay/service/IPayService.java | 4 ++ 6 files changed, 92 insertions(+), 10 deletions(-) diff --git a/sql/xc_mall.sql b/sql/xc_mall.sql index c044606..04fa050 100644 --- a/sql/xc_mall.sql +++ b/sql/xc_mall.sql @@ -350,4 +350,7 @@ createtime datetime null comment '更新时间', address varchar(255) null comment '下载地址', type tinyint null comment '类型:1安卓,2苹果' -)comment '版本表'; \ No newline at end of file +)comment '版本表'; + +alter table mall_order_info add pay_trade_no text null comment '支付交易单号'; + diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java b/src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java index 28e19fa..2dc801e 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java @@ -71,4 +71,6 @@ private List<MallOrderItem> items; private String payImage; + + private String payTradeNo; } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java index 5cfa585..91b7378 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java @@ -174,27 +174,32 @@ orderInfo.setPayMethod("微信支付"); break; case "2": - payResultStr = payService.aliPay(orderInfo); + if (StrUtil.isNotBlank(orderInfo.getPayOrderNo())) { + payResultStr = orderInfo.getPayOrderNo(); + } else { + payResultStr = payService.aliPay(orderInfo); + } orderInfo.setPayOrderNo(payResultStr); orderInfo.setPayMethod("支付宝支付"); + break; case "3": payResultStr = balancePay(orderInfo, payOrderDto.getTradePwd()); orderInfo.setPayOrderNo(orderInfo.getOrderNo()); orderInfo.setPayMethod("积分支付"); - orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); orderInfo.setPayTime(new Date()); orderInfo.setPayResult("1"); - this.baseMapper.updateById(orderInfo); memberService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), null, null, null, null); default: } + this.baseMapper.updateById(orderInfo); + Map<String, Object> map = new HashMap<>(); map.put("orderInfo", payResultStr); map.put("orderNo", orderInfo.getOrderNo()); diff --git a/src/main/java/cc/mrbird/febs/pay/controller/PayCallBackController.java b/src/main/java/cc/mrbird/febs/pay/controller/PayCallBackController.java index b9655e0..ea26df0 100644 --- a/src/main/java/cc/mrbird/febs/pay/controller/PayCallBackController.java +++ b/src/main/java/cc/mrbird/febs/pay/controller/PayCallBackController.java @@ -1,14 +1,20 @@ package cc.mrbird.febs.pay.controller; import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.pay.properties.AliPayProperties; +import cc.mrbird.febs.pay.service.IPayService; import com.alibaba.fastjson.JSONObject; +import com.alipay.api.AlipayApiException; +import com.alipay.api.internal.util.AlipaySignature; import com.ijpay.alipay.AliPayApi; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; 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 java.util.Map; @@ -21,14 +27,36 @@ @RequestMapping(value = "/api/pay") public class PayCallBackController { + @Autowired + private IPayService payService; + + @Resource + private AliPayProperties aliPayProperties; + @RequestMapping("/aliCallBack") - public FebsResponse aliPayCallBack(HttpServletRequest request) { - log.info("进入回调"); + public String aliPayCallBack(HttpServletRequest request){ + log.info("进入支付宝回调"); Map<String, String> params = AliPayApi.toMap(request); - log.info("回调参数:{}", JSONObject.toJSONString(params)); - for (Map.Entry<String, String> entry : params.entrySet()) { - log.info("支付宝回调:{}===={}", entry.getKey(), entry.getValue()); + + boolean verifyResult = false; + try { + verifyResult = AlipaySignature.verifyV1(params, aliPayProperties.getPublicKey(), "UTF-8", "RSA2"); + } catch (AlipayApiException e) { + log.info("验证失败=="); + return "failure"; } - return new FebsResponse().success(); + + if (verifyResult) { + if ("TRADE_SUCCESS".equals(params.get("trade_status")) || "TRADE_FINISHED".equals(params.get("trade_status"))) { + payService.aliCallback(params); + return "success"; + } else { + log.info("支付失败"); + return "failure"; + } + } else { + log.info("验证失败"); + return "failure"; + } } } diff --git a/src/main/java/cc/mrbird/febs/pay/service/IPayService.java b/src/main/java/cc/mrbird/febs/pay/service/IPayService.java index cd10f45..155cfb7 100644 --- a/src/main/java/cc/mrbird/febs/pay/service/IPayService.java +++ b/src/main/java/cc/mrbird/febs/pay/service/IPayService.java @@ -2,6 +2,8 @@ import cc.mrbird.febs.mall.entity.MallOrderInfo; +import java.util.Map; + /** * @author wzy * @date 2021-09-27 @@ -9,4 +11,6 @@ public interface IPayService { String aliPay(MallOrderInfo orderInfo); + + void aliCallback(Map<String, String> params); } diff --git a/src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImpl.java b/src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImpl.java index e940f38..68d7505 100644 --- a/src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImpl.java @@ -1,20 +1,30 @@ package cc.mrbird.febs.pay.service.impl; +import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; +import cc.mrbird.febs.common.enumerates.OrderStatusEnum; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.mall.entity.MallOrderInfo; +import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; +import cc.mrbird.febs.mall.service.IApiMallMemberService; +import cc.mrbird.febs.mall.service.IApiMallOrderInfoService; import cc.mrbird.febs.pay.model.AliPayPassbackModel; import cc.mrbird.febs.pay.properties.AliPayProperties; import cc.mrbird.febs.pay.service.IPayService; +import cc.mrbird.febs.rabbit.producter.AgentProducer; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayApiException; import com.alipay.api.domain.AlipayTradeAppPayModel; import com.alipay.api.response.AlipayTradeAppPayResponse; import com.ijpay.alipay.AliPayApi; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.Date; +import java.util.Map; /** * @author wzy @@ -26,6 +36,13 @@ @Resource private AliPayProperties aliPayProperties; + + @Autowired + private IApiMallMemberService memberService; + @Autowired + private MallOrderInfoMapper orderInfoMapper; + @Autowired + private AgentProducer agentProducer; @Value("${spring.profiles.active}") private String active; @@ -59,4 +76,27 @@ } return resp.getBody(); } + + @Override + public void aliCallback(Map<String, String> params) { + String modelStr = params.get("passback_params"); + + AliPayPassbackModel passback = JSONObject.parseObject(modelStr, AliPayPassbackModel.class); + + MallOrderInfo orderInfo = orderInfoMapper.selectById(passback.getOrderId()); + if ("1".equals(orderInfo.getPayResult())) { + return; + } + + orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); + orderInfo.setPayResult("1"); + orderInfo.setPayTime(new Date()); + orderInfo.setPayTradeNo(params.get("trade_no")); + orderInfoMapper.updateById(orderInfo); + + agentProducer.sendReturnMoneyMsg(orderInfo.getId()); + agentProducer.sendAutoLevelUpMsg(orderInfo.getMemberId()); + + memberService.addMoneyFlow(orderInfo.getMemberId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), null, null, null, null); + } } -- Gitblit v1.9.1