dcs před 3 týdny
rodič
revize
c8ff8cfc9c

+ 6 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/controller/AccountBalanceController.java

@@ -23,4 +23,10 @@ public class AccountBalanceController {
         return Response.ok(accountBalanceService.get());
     }
 
+    @ApiOperation("获取提现记录")
+    @RequestMapping(value = "/transferInfo", method = RequestMethod.GET)
+    public Response getTransferInfo() {
+        return Response.ok(accountBalanceService.getTransferInfo());
+    }
+
 }

+ 49 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/controller/WxPayController.java

@@ -242,4 +242,53 @@ public class WxPayController {
         }
     }
 
+    /**
+     * 转账结果通知
+     * 转账状态改变后,微信会把相关退款结果发送给商户。
+     */
+    @ApiOperation("转账结果通知")
+    @PostMapping("/transfer/notify")
+    public String transferNotify(HttpServletRequest request, HttpServletResponse response) {
+        log.info("转账通知执行");
+        Gson gson = new Gson();
+        Map<String, String> map = new HashMap<>();//应答对象
+
+        try {
+            //处理通知参数
+            String body = HttpUtils.readData(request);
+            Map<String, Object> bodyMap = gson.fromJson(body, HashMap.class);
+            String requestId = (String) bodyMap.get("id");
+            log.info("转账通知的id ===>" + requestId);
+
+            //签名的验证
+            if(false){
+
+                log.error("通知验签失败");
+                //失败应答
+                response.setStatus(500);
+                map.put("code", "ERROR");
+                map.put("message", "通知验签失败");
+                return gson.toJson(map);
+            }
+            log.info("通知验签成功");
+
+            //处理转账单
+            wxPayService.processTransfer(bodyMap);
+
+            //成功应答
+            response.setStatus(200);
+            map.put("code", "SUCCESS");
+            map.put("message", "成功");
+            return gson.toJson(map);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            //失败应答
+            response.setStatus(500);
+            map.put("code", "ERROR");
+            map.put("message", "失败");
+            return gson.toJson(map);
+        }
+    }
+
 }

+ 6 - 1
virgo.api/src/main/java/com/bosshand/virgo/api/workark/enums/wxpay/WxNotifyType.java

@@ -10,7 +10,12 @@ public enum WxNotifyType {
 	/**
 	 * 退款结果通知
 	 */
-	REFUND_NOTIFY("/api/workarkWxPay/refunds/notify");
+	REFUND_NOTIFY("/api/workarkWxPay/refunds/notify"),
+
+	/**
+	 * 转账结果通知
+	 */
+	TRANSFER_NOTIFY("/api/workarkWxPay/transfer/notify");
 
 	/**
 	 * 类型

+ 34 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/enums/wxpay/WxTransferState.java

@@ -0,0 +1,34 @@
+package com.bosshand.virgo.api.workark.enums.wxpay;
+
+public enum WxTransferState {
+
+    ACCEPTED("转账已受理"),
+
+    PROCESSING("转账锁定资金中"),
+
+    WAIT_USER_CONFIRM("待收款用户确认"),
+
+    TRANSFERING("转账中"),
+
+    SUCCESS("转账成功"),
+
+    FAIL("转账失败"),
+
+    CANCELING("撤销中"),
+
+    CANCELLED("撤销完成");
+
+    /**
+     * 类型
+     */
+    private final String type;
+
+    WxTransferState(String type) {
+        this.type = type;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+}

+ 1 - 1
virgo.api/src/main/java/com/bosshand/virgo/api/workark/model/AccountBalanceDetails.java

@@ -6,7 +6,7 @@ import java.math.BigDecimal;
 import java.util.Date;
 
 /**
- * 账户金明细
+ * 账户金明细
  */
 public class AccountBalanceDetails {
 

+ 11 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/service/AccountBalanceService.java

@@ -3,9 +3,11 @@ package com.bosshand.virgo.api.workark.service;
 import com.bosshand.virgo.api.workark.dao.AccountBalanceDao;
 import com.bosshand.virgo.api.workark.dao.AccountBalanceDetailsDao;
 import com.bosshand.virgo.api.workark.dao.OrderInfoDao;
+import com.bosshand.virgo.api.workark.dao.TransferInfoDao;
 import com.bosshand.virgo.api.workark.model.AccountBalance;
 import com.bosshand.virgo.api.workark.model.AccountBalanceDetails;
 import com.bosshand.virgo.api.workark.model.OrderInfo;
+import com.bosshand.virgo.api.workark.model.TransferInfo;
 import com.bosshand.virgo.core.dao.InviteDao;
 import com.bosshand.virgo.core.model.Invite;
 import com.bosshand.virgo.core.utils.ContextUtils;
@@ -15,6 +17,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.util.List;
 
 @Service
 public class AccountBalanceService {
@@ -31,6 +34,9 @@ public class AccountBalanceService {
     @Autowired
     InviteDao inviteDao;
 
+    @Autowired
+    TransferInfoDao transferInfoDao;
+
     public AccountBalance get() {
         long userId = ContextUtils.getUserContext().getUserId();
         AccountBalance accountBalance = accountBalanceDao.getUserId(userId);
@@ -96,4 +102,9 @@ public class AccountBalanceService {
         return false;
     }
 
+    public List<TransferInfo> getTransferInfo() {
+        long userId = ContextUtils.getUserContext().getUserId();
+        return transferInfoDao.getUserId(userId);
+    }
+
 }

+ 38 - 2
virgo.api/src/main/java/com/bosshand/virgo/api/workark/service/WxPayService.java

@@ -3,12 +3,14 @@ package com.bosshand.virgo.api.workark.service;
 import com.alibaba.fastjson.JSONObject;
 import com.bosshand.virgo.api.service.QuartzService;
 import com.bosshand.virgo.api.workark.config.WxPayConfig;
+import com.bosshand.virgo.api.workark.dao.TransferInfoDao;
 import com.bosshand.virgo.api.workark.enums.OrderStatus;
 import com.bosshand.virgo.api.workark.enums.wxpay.WxNotifyType;
 import com.bosshand.virgo.api.workark.enums.wxpay.WxRefundStatus;
 import com.bosshand.virgo.api.workark.enums.wxpay.WxTradeState;
 import com.bosshand.virgo.api.workark.model.OrderInfo;
 import com.bosshand.virgo.api.workark.model.RefundInfo;
+import com.bosshand.virgo.api.workark.model.TransferInfo;
 import com.bosshand.virgo.api.workark.util.AesUtil;
 import com.bosshand.virgo.api.workark.util.QrRcodeGenUtil;
 import com.google.gson.Gson;
@@ -64,6 +66,10 @@ public class WxPayService {
     @Autowired
     private AccountBalanceService accountBalanceService;
 
+    @Autowired
+    private TransferInfoDao transferInfoDao;
+
+
     private final ReentrantLock lock = new ReentrantLock();
 
     private final static Log log = LogFactory.getLog(WxPayService.class);
@@ -421,8 +427,6 @@ public class WxPayService {
         //解密报文
         String plainText = decryptFromResource(bodyMap);
 
-        log.info("处理订单");
-
         //将明文转换成map
         Gson gson = new Gson();
         HashMap plainTextMap = gson.fromJson(plainText, HashMap.class);
@@ -463,5 +467,37 @@ public class WxPayService {
     }
 
 
+    @Transactional(rollbackFor = Exception.class)
+    public void processTransfer(Map<String, Object> bodyMap) throws Exception{
+
+        log.info("处理转账订单");
+
+        //解密报文
+        String plainText = decryptFromResource(bodyMap);
+
+        //将明文转换成map
+        Gson gson = new Gson();
+        HashMap plainTextMap = gson.fromJson(plainText, HashMap.class);
+        String outBillNo = (String)plainTextMap.get("out_bill_no");
+
+        String state = (String)plainTextMap.get("state");
 
+        if(lock.tryLock()){
+            try {
+                TransferInfo outBillNo1 = transferInfoDao.getOutBillNo(outBillNo);
+                if (state.equals(outBillNo1.getState())) {
+                    return;
+                }
+
+                outBillNo1.setState(state);
+                //更新订单状态
+                transferInfoDao.update(outBillNo1);
+
+            } finally {
+                //要主动释放锁
+                lock.unlock();
+            }
+        }
+
+    }
 }

+ 23 - 9
virgo.api/src/main/java/com/bosshand/virgo/api/workark/service/WxTransferService.java

@@ -4,8 +4,11 @@ import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.bosshand.virgo.api.workark.config.WxPayConfig;
-import com.bosshand.virgo.api.workark.dao.ProceDao;
+import com.bosshand.virgo.api.workark.dao.AccountBalanceDao;
 import com.bosshand.virgo.api.workark.dao.TransferInfoDao;
+import com.bosshand.virgo.api.workark.enums.wxpay.WxNotifyType;
+import com.bosshand.virgo.api.workark.enums.wxpay.WxTransferState;
+import com.bosshand.virgo.api.workark.model.AccountBalance;
 import com.bosshand.virgo.api.workark.model.TransferInfo;
 import com.bosshand.virgo.api.workark.util.OrderNoUtils;
 import com.bosshand.virgo.core.utils.ContextUtils;
@@ -15,6 +18,7 @@ import com.wechat.pay.java.core.http.*;
 import okhttp3.OkHttpClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
@@ -27,7 +31,7 @@ public class WxTransferService {
     private WxPayConfig wxPayConfig;
 
     @Autowired
-    ProceDao proceDao;
+    AccountBalanceDao accountBalanceDao;
 
     @Autowired
     TransferInfoDao transferInfoDao;
@@ -75,7 +79,7 @@ public class WxTransferService {
         // 转账备注
         map.put("transfer_remark", "佣金提现: " + orderNo);
         //回调地址: 商家转账回调地址
-        map.put("notify_url", "");
+        map.put("notify_url", wxPayConfig.getNotifyDomain().concat(WxNotifyType.TRANSFER_NOTIFY.getType()));
         // 用户收款感知
         map.put("user_recv_perception", "佣金奖励");
         // 转账场景报备信息
@@ -102,6 +106,7 @@ public class WxTransferService {
 
             transferInfo.setTransferBillNo(transferBillNo);
             transferInfo.setPackageInfo(packageInfo);
+            transferInfo.setState(WxTransferState.ACCEPTED.getType());
             transferInfoDao.save(transferInfo);
 
             return packageInfo;
@@ -122,6 +127,7 @@ public class WxTransferService {
                 .build();
     }
 
+    @Transactional
     public String transferOutBillNo(String outBillNo) {
         OkHttpClient okHttpClient = new OkHttpClient();
         HttpClient httpClient = new DefaultHttpClientBuilder()
@@ -141,13 +147,12 @@ public class WxTransferService {
         try {
             HttpResponse<JSONObject> execute = httpClient.execute(executeSendGetHttpRequest, JSONObject.class);
             JSONObject responseBody = execute.getServiceResponse();
-
             String state = responseBody.getString("state");
-
-            if("SUCCESS".equals(state)){
-                TransferInfo outBillNo1 = transferInfoDao.getOutBillNo(outBillNo);
-                outBillNo1.setState(state);
-                transferInfoDao.update(outBillNo1);
+            TransferInfo outBillNo1 = transferInfoDao.getOutBillNo(outBillNo);
+            outBillNo1.setState(state);
+            transferInfoDao.update(outBillNo1);
+            if(WxTransferState.SUCCESS.equals(state)){
+                updateAccountBalance(outBillNo1);
             }
             return state;
         } catch (ServiceException e) {
@@ -162,4 +167,13 @@ public class WxTransferService {
         transferInfoDao.update(transferInfo);
     }
 
+    public void updateAccountBalance(TransferInfo outBillNo){
+        AccountBalance accountBalance = accountBalanceDao.getUserId(outBillNo.getUserId());
+        BigDecimal totalFee = accountBalance.getTotalFee();
+        BigDecimal result = totalFee.subtract(outBillNo.getMoney());
+        accountBalance.setTotalFee(result);
+        accountBalanceDao.updateTotalFee(accountBalance);
+    }
+    
+
 }

+ 1 - 0
virgo.core/src/main/java/com/bosshand/virgo/core/config/ShiroConfig.java

@@ -66,6 +66,7 @@ public class ShiroConfig {
 
 		filterChainDefinitionMap.put("/workarkWxPay/native/notify", "anon");
 		filterChainDefinitionMap.put("/workarkWxPay/refunds/notify", "anon");
+		filterChainDefinitionMap.put("/workarkWxPay/transfer/notify", "anon");
 
 		filterChainDefinitionMap.put("/workarkProductLevel/list", "anon");
 		filterChainDefinitionMap.put("/workarkProductLevel/getParentId/**", "anon");