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