Browse Source

更新支付宝功能

wanghaicheng 5 years ago
parent
commit
e774ecfcfa

File diff suppressed because it is too large
+ 50 - 40
lift-common/src/main/java/cn.com.ty.lift.common/aliservice/alipay/AlipayUtil.java


+ 16 - 10
lift-quan-service/src/main/java/cn/com/ty/lift/quan/pay/controller/PayController.java

@@ -32,24 +32,25 @@ public class PayController {
     /**
      * @param
      * @return
-     * @description 绑定支付宝账号
+     * @description 绑定/换绑支付宝账号
      * @date 2019/12/26 14:28
      */
     @PostMapping("/bind")
     public RestResponse bind(@RequestBody Pay req) {
-        if (payService.save(req)) {
-            return RestResponse.success(null, "成功");
-        }
-        return RestResponse.fail();
+        return payService.bind(req);
     }
 
-    @PostMapping("/bind/modify")
-    public RestResponse modify(@RequestBody Pay req) {
-        return payService.updateAlipayId(req);
+    @PostMapping("/balance")
+    public RestResponse balance(@RequestBody Pay pay) {
+        Pay byId = payService.getById(pay.getUserId());
+        if (byId == null) {
+            return RestResponse.fail("用户未绑定支付宝账号");
+        }
+        return RestResponse.success(byId);
     }
 
     /**
-     * //* @param type 1创建充值订单 2提现
+     * //* @param type 1创建充值订单 2提现审核订单
      *
      * @return
      * @description
@@ -61,7 +62,12 @@ public class PayController {
     }
 
     @PostMapping("/order")
-    public RestResponse order(@RequestBody PayReq req) {
+    public RestResponse order(@RequestBody PayReq req) throws AlipayApiException {
         return payService.order(req);
     }
+
+    @PostMapping("/order/list")
+    public RestResponse orders(@RequestBody PayReq req) {
+        return payService.orders(req);
+    }
 }

+ 2 - 2
lift-quan-service/src/main/java/cn/com/ty/lift/quan/pay/controller/PayRecordController.java

@@ -4,6 +4,7 @@ package cn.com.ty.lift.quan.pay.controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+
 /**
  * <p>
  * 用户资金操作记录表 前端控制器
@@ -13,7 +14,6 @@ import org.springframework.web.bind.annotation.RestController;
  * @since 2019-12-26
  */
 @RestController
-@RequestMapping("/quan.pay/pay-record")
+@RequestMapping("/pay-record")
 public class PayRecordController {
-
 }

+ 5 - 1
lift-quan-service/src/main/java/cn/com/ty/lift/quan/pay/dao/entity/Pay.java

@@ -42,5 +42,9 @@ public class Pay implements Serializable {
     @TableField("money")
     private BigDecimal money;
 
-
+    /**
+     * 用户提现时,冻结的余额
+     */
+    @TableField("freeze_money")
+    private BigDecimal freezeMoney;
 }

+ 27 - 15
lift-quan-service/src/main/java/cn/com/ty/lift/quan/pay/dao/entity/PayRecord.java

@@ -43,22 +43,10 @@ public class PayRecord implements Serializable {
     private Integer type;
 
     /**
-     * 用户操作前余
+     * 用户操作增减的金
      */
-    @TableField("old_money")
-    private BigDecimal oldMoney;
-
-    /**
-     * 用户操作后余额
-     */
-    @TableField("new_money")
-    private BigDecimal newMoney;
-
-    /**
-     * 操作时间
-     */
-    @TableField("create_datetime")
-    private LocalDateTime createDatetime;
+    @TableField("total_amount")
+    private BigDecimal totalAmount;
 
     /**
      * 支付宝订单号
@@ -71,4 +59,28 @@ public class PayRecord implements Serializable {
      */
     @TableField("out_trade_no")
     private String outTradeNo;
+
+    /**
+     * 订单完成状态  1完成 0未完成 2取消交易
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 备注说明
+     */
+    @TableField("remark")
+    private String remark;
+
+    /**
+     * 订单创建时间
+     */
+    @TableField("create_datetime")
+    private LocalDateTime createDatetime;
+
+    /**
+     * 订单完成时间
+     */
+    @TableField("finish_datetime")
+    private LocalDateTime finishDatetime;
 }

+ 3 - 1
lift-quan-service/src/main/java/cn/com/ty/lift/quan/pay/dao/entity/model/PayReq.java

@@ -7,7 +7,9 @@ import java.math.BigDecimal;
 
 @Data
 public class PayReq extends Pay {
-    //1.充值 2提现
+    //金额操作记录表id
+    private Long id;
+    //1充值 2提现
     private Integer type;
     //买家账号
     private String buyerId;

+ 6 - 0
lift-quan-service/src/main/java/cn/com/ty/lift/quan/pay/dao/mapper/PayMapper.java

@@ -2,6 +2,10 @@ package cn.com.ty.lift.quan.pay.dao.mapper;
 
 import cn.com.ty.lift.quan.pay.dao.entity.Pay;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.Map;
 
 /**
  * <p>
@@ -13,4 +17,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface PayMapper extends BaseMapper<Pay> {
 
+    @Select("select count(user_id) count from user_info where user_id=${userId}")
+    Map<String, Long> selectUserByUserId(@Param("userId") Long userId);
 }

+ 122 - 54
lift-quan-service/src/main/java/cn/com/ty/lift/quan/pay/service/impl/PayServiceImpl.java

@@ -8,15 +8,19 @@ import cn.com.ty.lift.quan.pay.dao.mapper.PayMapper;
 import cn.com.ty.lift.quan.pay.service.PayService;
 import cn.com.xwy.boot.web.dto.RestResponse;
 import com.alipay.api.AlipayApiException;
-import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * <p>
@@ -33,88 +37,152 @@ public class PayServiceImpl extends ServiceImpl<PayMapper, Pay> implements PaySe
 
     private final PayRecordServiceImpl recordService;
 
-    //更新用户的支付宝id
-    public RestResponse updateAlipayId(Pay req) {
-        Pay byId = this.getById(req.getUserId());
+    public RestResponse bind(Pay pay) {
+        //查询用户表,如果用户不存在就返回 "用户不存在"
+        if (this.getBaseMapper().selectUserByUserId(pay.getUserId()).get("count") < 1L) {
+            return RestResponse.fail("用户不存在");
+        }
+        //如果用户资金表不存在这个记录,就新增一个记录
+        Pay byId = this.getById(pay.getUserId());
         if (byId == null) {
-            return RestResponse.failParam();
+            byId = new Pay();
+            byId.setUserId(pay.getUserId());
+            byId.setAlipayId(pay.getAlipayId());
+        } else {
+            byId.setAlipayId(pay.getAlipayId());
         }
-
-        byId.setAlipayId(req.getAlipayId());
-        if (this.updateById(byId)) {
+        if (this.saveOrUpdate(byId)) {
             return RestResponse.success(null, "成功");
         }
-        return RestResponse.fail();
+        return RestResponse.fail("用户已绑定支付宝账号");
     }
 
-    //创建充值订单,创建提现待审核订单
+    /**
+     * @description 创建充值订单,创建提现待审核订单
+     * @date 2019/12/27 10:35
+     */
     public RestResponse pay(PayReq req) throws AlipayApiException {
         Pay byId = this.getById(req.getUserId());
         String outTradeNo = IdWorker.getIdStr();
         PayRecord record = new PayRecord();
+        //设置用户id
+        record.setUserId(req.getUserId());
+        //设置操作金额
+        record.setTotalAmount(req.getTotalAmount());
+        //设置订单号
+        record.setOutTradeNo(outTradeNo);
+        //设置订单创建时间
+        record.setCreateDatetime(LocalDateTime.now());
+        //设置订单状态
+        record.setStatus(0);
+        //设置支付宝订单号
+        String tradeNo;
         //type 1 创建充值订单
         if (req.getType().equals(1)) {
-            String tradeNo = AlipayUtil
+            //向支付宝发创建充值订单请求
+            tradeNo = AlipayUtil
                     .create(byId.getAlipayId(), outTradeNo, req.getSubject(), req.getBody(), req.getTotalAmount());
             if (tradeNo != null) {
-                record.setUserId(req.getUserId());
                 record.setType(1);
                 record.setTradeNo(tradeNo);
-                record.setOutTradeNo(outTradeNo);
-                record.setCreateDatetime(LocalDateTime.now());
-                recordService.save();
+                //保存订单信息到数据库
+                recordService.save(record);
                 return RestResponse.success(tradeNo);
             }
             return RestResponse.fail();
         }
 
-        //type 2 提现
+        //type 2 创建提现审核订单
         if (req.getType().equals(2)) {
-            //如果提现成功,更新用户金额,及金额操作记录表
-            if (AlipayUtil
-                    .withdraw(byId.getAlipayId(), outTradeNo, "提现业务", req.getTotalAmount(), "备注")) {
-
-                PayRecord record = new PayRecord();
-                //设置原金额
-                record.setOldMoney(byId.getMoney());
-                //设置新金额
-                record.setNewMoney(byId.getMoney().subtract(req.getTotalAmount()));
-                record.setCreateDatetime(LocalDateTime.now());
-                record.setType(2);
-                record.setUserId(byId.getUserId());
-                recordService.save(record);
+            if (req.getTotalAmount().compareTo(byId.getMoney()) > 0) {
+                return RestResponse.fail("账号余额不足");
+            }
+            PayRecord one = recordService.getOne(new QueryWrapper<PayRecord>()
+                    .eq("type", 2)
+                    .eq("status", 0)
+            );
+            if (one != null) {
+                return RestResponse.fail("已有提现订单");
+            }
+            int size = recordService.list(new QueryWrapper<PayRecord>()
+                    .eq("user_id", req.getUserId())
+                    .gt("create_datetime", LocalDate.now() + " 00:00:00")).size();
+            if (size >= 3) {
+                return RestResponse.fail("每天仅支持提现3次");
+            }
+            //创建提现订单
+            outTradeNo = IdWorker.getIdStr();
+            byId.setFreezeMoney(req.getTotalAmount());
+            byId.setMoney(byId.getMoney().subtract(req.getTotalAmount()));
+            record.setType(2);
+            record.setOutTradeNo(outTradeNo);
+            //保存订单信息到数据库
+            if (this.updateById(byId) && recordService.save(record)) {
                 return RestResponse.success(null, "成功");
             }
-            return RestResponse.fail();
         }
-
         return RestResponse.fail();
     }
 
-    //获取订单状态,type 1已支付 2未支付
+    /**
+     * @param //用户id,资金操作记录id
+     * @return status 1完成 0未完成
+     * @description 审核订单
+     * @date 2019/12/27 14:50
+     */
     public RestResponse order(PayReq req) throws AlipayApiException {
-        Pay byId = this.getById(req.getUserId());
-        HashMap<Object, Object> result = new HashMap<>();
-        //如果订单已支付,更新用户金额,及金额操作记录表
-        if (AlipayUtil.order(req.getTradeNo())) {
-            PayRecord record = new PayRecord();
-            //设置原金额
-            record.setOldMoney(byId.getMoney());
-            //设置新金额
-            record.setNewMoney(byId.getMoney().subtract(req.getTotalAmount()));
-            record.setCreateDatetime(LocalDateTime.now());
-            record.setType(2);
-            record.setUserId(byId.getUserId());
-
-            this.save(byId);
-            result.put("type", 1);
-            return RestResponse.success(result);
+        Pay payById = this.getById(req.getUserId());
+        PayRecord recordById = recordService.getById(req.getId());
+        //如果记录是充值
+        if (recordById.getType() == 1) {
+            //调用支付宝订单查询接口,查询充值订单是否完成
+            if (AlipayUtil.order(recordById.getTradeNo())) {
+                //完成就设置用户在平台中的余额
+                payById.setMoney(payById.getMoney()
+                        .add(recordById.getTotalAmount()));
+                //设置订单状态为1完成,订单完成时间为当前
+                if (this.updateById(payById)) {
+                    recordById.setStatus(1);
+                    recordById.setFinishDatetime(LocalDateTime.now());
+                    if (recordService.updateById(recordById)) {
+                        //全部保存成功就返回 “成功”
+                        return RestResponse.success(null, "成功");
+                    }
+                }
+                //如果查询充值订单没有完成,就返回 “订单还未支付”
+                return RestResponse.fail("订单还未支付");
+            }
         }
-        result.put("type", 2);
-        return RestResponse.success(result);
+        //如果记录是提现
+        if (recordById.getType() == 2) {
+            //调用支付宝企业转账到个人 接口
+            String tradeNo = AlipayUtil.withdraw(
+                    req.getAlipayId(),
+                    recordById.getOutTradeNo(),
+                    recordById.getRemark(),
+                    recordById.getTotalAmount(),
+                    recordById.getRemark());
+            //如果有订单码说明转账成功
+            if (tradeNo != null) {
+                //设置
+                recordById.setTradeNo(tradeNo);
+                recordById.setStatus(1);
+                if (recordService.updateById(recordById)) {
+                    return RestResponse.success(null, "成功");
+                }
+            }
+            return RestResponse.fail();
+        }
+        return RestResponse.failParam();
     }
 
-    public RestResponse audit() {
-
+    public RestResponse orders(PayReq req) {
+        List<PayRecord> payRecords = recordService.list(
+                new QueryWrapper<PayRecord>()
+                        .eq("user_id", req.getUserId()));
+        if (payRecords.isEmpty()) {
+            return RestResponse.success();
+        }
+        return RestResponse.success(payRecords);
     }
-}
+}