瀏覽代碼

支付宝接口完成

wanghaicheng 5 年之前
父節點
當前提交
bcafd0da69

+ 33 - 29
lift-common/src/main/java/cn.com.ty.lift.common/aliservice/alipay/AlipayUtil.java

@@ -1,19 +1,11 @@
 package cn.com.ty.lift.common.aliservice.alipay;
 
-import com.alibaba.fastjson.JSON;
 import com.alipay.api.*;
-import com.alipay.api.request.AlipayFundTransUniTransferRequest;
-import com.alipay.api.request.AlipaySystemOauthTokenRequest;
-import com.alipay.api.request.AlipayTradeCreateRequest;
-import com.alipay.api.request.AlipayTradeQueryRequest;
-import com.alipay.api.response.AlipayFundTransUniTransferResponse;
-import com.alipay.api.response.AlipaySystemOauthTokenResponse;
-import com.alipay.api.response.AlipayTradeCreateResponse;
-import com.alipay.api.response.AlipayTradeQueryResponse;
-import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.alipay.api.request.*;
+import com.alipay.api.response.*;
 
-import java.io.IOException;
 import java.math.BigDecimal;
+import java.util.HashMap;
 import java.util.Map;
 
 public class AlipayUtil {
@@ -50,8 +42,8 @@ public class AlipayUtil {
         certAlipayRequest.setFormat("json");
         certAlipayRequest.setCharset("utf-8");
         certAlipayRequest.setSignType("RSA2");
-        //String path = "D:/Documents/支付宝开放平台开发助手/CSR/";
-        String path = "C:/Users/admin/Desktop/temp/";
+        String path = "D:/Documents/支付宝开放平台开发助手/CSR/";
+//        String path = "C:/Users/admin/Desktop/temp/";
         certAlipayRequest.setCertPath(path + "appCertPublicKey_2016101500691469.crt");
         certAlipayRequest.setAlipayPublicCertPath(path + "alipayCertPublicKey_RSA2.crt");
         certAlipayRequest.setRootCertPath(path + "alipayRootCert.crt");
@@ -63,7 +55,7 @@ public class AlipayUtil {
         }
     }
 
-    public static String create(String buyerId, String outTradeNo, String subject, String body, BigDecimal totalAmount) throws AlipayApiException {
+    public static String create(String buyerLogonId, String outTradeNo, String subject, String body, BigDecimal totalAmount) throws AlipayApiException {
         AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
         request.setBizContent("{" +
                 "\"method\":\"alipay.trade.app.pay\"," +
@@ -71,12 +63,12 @@ public class AlipayUtil {
                 "\"out_trade_no\":\"" + outTradeNo + "\"," +
                 "\"seller_id\":\"" + sellerId + "\"," +
                 "\"total_amount\":\"" + totalAmount.toString() + "\"," +
-                "\"buyer_id\":\"" + buyerId + "\"," +
+                "\"buyer_logon_id\":\"" + buyerLogonId + "\"," +
                 "\"subject\":\"" + subject + "\"," +
                 "\"body\":\"" + body + "\"" +
                 "  }");
+        //"\"buyer_id\":\"" + buyerId + "\"," +
         client.certificateExecute(request);
-
         AlipayTradeCreateResponse response = client.certificateExecute(request);
         if (response.isSuccess()) {
             return response.getTradeNo();
@@ -85,16 +77,25 @@ public class AlipayUtil {
         }
     }
 
+    public static boolean cancel(String tradeNo) throws AlipayApiException {
+        AlipayTradeCancelRequest request = new AlipayTradeCancelRequest();
+        request.setBizContent("{" +
+                "\"trade_no\":\"" + tradeNo + "\"" +
+                "}");
+        AlipayTradeCancelResponse response = client.certificateExecute(request);
+        return "close".equals(response.getAction());
+    }
+
     /**
-     * @param
      * @return 提现成功返回单号 提现失败返回null
-     * @description 收款人id,自定义提现单号,提现标题,提现总金额,备注
+     * @description
      * @date 2019/12/26 14:51
+     * // @param收款人id,自定义提现单号,提现标题,提现总金额,备注
      */
-    public static String withdraw(String identity, String outBizNo, String orderTitle, BigDecimal transAmount, String remark) throws AlipayApiException {
+    public static String withdraw(String identity, String outTradeNo, String orderTitle, BigDecimal transAmount) throws AlipayApiException {
         AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
         request.setBizContent("{" +
-                "\"out_biz_no\":\"" + outBizNo + "\"," +
+                "\"out_biz_no\":\"" + outTradeNo + "\"," +
                 "\"trans_amount\":" + transAmount.toString() + "," +
                 "\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," +
                 "\"biz_scene\":\"DIRECT_TRANSFER\"," +
@@ -103,7 +104,6 @@ public class AlipayUtil {
                 "\"identity\":\"" + identity + "\"," +
                 "\"identity_type\":\"ALIPAY_USER_ID\"" +
                 "    }," +
-                "\"remark\":\"" + remark + "\"," +
                 "\"business_params\":\"{\\\"payer_show_name\\\":\\\"天域梯业\\\"}\"," +
                 "  }");
         AlipayFundTransUniTransferResponse response = client.certificateExecute(request);
@@ -121,26 +121,30 @@ public class AlipayUtil {
      * @description
      * @date 2019/12/25 11:00
      */
-    public static boolean order(String tradeNo) throws AlipayApiException {
+    public static Map<String, Object> order(String tradeNo) throws AlipayApiException {
         AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
         request.setBizContent("{" +
-                "   \"trade_no\":\"" + tradeNo + "\"" +
-                "  }");
+                "\"trade_no\":\"" + tradeNo + "\"" +
+                "}");
         AlipayTradeQueryResponse response = client.certificateExecute(request);
+        HashMap<String, Object> result = new HashMap<>();
         if (response.getTradeStatus() == null) {
-            return false;
+            result.put("status", false);
+            return result;
         }
-        return response.getTradeStatus().equals("TRADE_SUCCESS");
+        result.put("status", response.getTradeStatus().equals("TRADE_SUCCESS"));
+        result.put("alipayId", response.getBuyerUserId());
+        return result;
     }
 
     public static void main(String[] args) throws AlipayApiException {
-//        if (AlipayUtil.order("2019122822001479571000089922")) {
+//        if ((Boolean) AlipayUtil.order("2019123022001479571000092593").get("status")) {
 //            System.out.println("已支付");
 //        } else {
 //            System.out.println("未支付");
 //        }
-//        String 电梯性能说明 = AlipayUtil.create(buyerId, IdWorker.getIdStr(), "电梯12.28号", "电梯性能说明", new BigDecimal("100.00"));
-//        System.out.println(电梯性能说明);
+//        System.out.println(AlipayUtil.cancel("2019123022001479571000093711"));
+//        System.out.println(AlipayUtil.create(buyerLogonId, IdWorker.getIdStr(), "2019123016001", "电梯性能说明", new BigDecimal("100.00")));
         //        AlipayUtil.withdraw(buyerId, IdWorker.getIdStr(), "电梯5号", new BigDecimal("100.00"), "电梯提现");
 //        AlipayUtil.getUserId();
     }

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

@@ -8,6 +8,7 @@ import cn.com.ty.lift.quan.pay.service.impl.PayServiceImpl;
 import cn.com.xwy.boot.web.dto.RestResponse;
 import com.alipay.api.AlipayApiException;
 import com.alipay.api.internal.util.AlipayUtils;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import lombok.AllArgsConstructor;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -40,7 +41,7 @@ public class PayController {
         return payService.bind(req);
     }
 
-    @PostMapping("/balance")
+    @PostMapping("/info")
     public RestResponse balance(@RequestBody Pay pay) {
         Pay byId = payService.getById(pay.getUserId());
         if (byId == null) {
@@ -50,24 +51,40 @@ public class PayController {
     }
 
     /**
-     * //* @param type 1创建充值订单 2提现审核订单
-     *
      * @return
-     * @description
+     * @description 创建订单
      * @date 2019/12/26 16:05
+     * // @param type 1创建充值订单 2提现审核订单
      */
-    @PostMapping
+    @PostMapping("/create")
     public RestResponse pay(@RequestBody PayReq req) throws AlipayApiException {
         return payService.pay(req);
     }
 
+    /**
+     * @return 操作结果
+     * @description 审核订单
+     * @date 2019/12/30 14:03
+     * // @param 商家自定义订单号
+     */
     @PostMapping("/order")
     public RestResponse order(@RequestBody PayReq req) throws AlipayApiException {
         return payService.order(req);
     }
 
+    /**
+     * @return 操作结果
+     * @description 取消订单
+     * @date 2019/12/30 14:05
+     * //@param 订单号
+     */
+    @PostMapping("/cancel")
+    public RestResponse cancel(@RequestBody PayReq req) throws AlipayApiException {
+        return payService.cancel(req);
+    }
+
     @PostMapping("/order/list")
     public RestResponse orders(@RequestBody PayReq req) {
         return payService.orders(req);
     }
-}
+}

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

@@ -31,7 +31,13 @@ public class Pay implements Serializable {
     private Long userId;
 
     /**
-     * 支付宝Id
+     * 支付宝账号
+     */
+    @TableField("alipay_account")
+    private String alipayAccount;
+
+    /**
+     * 支付宝用户id
      */
     @TableField("alipay_id")
     private String alipayId;

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

@@ -67,10 +67,10 @@ public class PayRecord implements Serializable {
     private Integer status;
 
     /**
-     * 备注说明
+     * 订单标题
      */
-    @TableField("remark")
-    private String remark;
+    @TableField("subject")
+    private String subject;
 
     /**
      * 订单创建时间

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

@@ -21,4 +21,8 @@ public class PayReq extends Pay {
     private BigDecimal totalAmount;
     //支付宝订单号
     private String tradeNo;
+    //商家自定义订单号
+    private String outTradeNo;
+    //订单状态
+    private Integer status;
 }

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

@@ -17,6 +17,6 @@ import java.util.Map;
  */
 public interface PayMapper extends BaseMapper<Pay> {
 
-    @Select("select count(user_id) count from user_info where user_id=${userId}")
+    @Select("select count(user_id) count from user_account where user_id=${userId}")
     Map<String, Long> selectUserByUserId(@Param("userId") Long userId);
 }

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

@@ -9,7 +9,6 @@ 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.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;
@@ -19,8 +18,8 @@ import org.springframework.transaction.annotation.Transactional;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -47,14 +46,13 @@ public class PayServiceImpl extends ServiceImpl<PayMapper, Pay> implements PaySe
         if (byId == null) {
             byId = new Pay();
             byId.setUserId(pay.getUserId());
-            byId.setAlipayId(pay.getAlipayId());
-        } else {
-            byId.setAlipayId(pay.getAlipayId());
         }
+        //获取前端传过来的用户账号
+        byId.setAlipayAccount(pay.getAlipayAccount());
         if (this.saveOrUpdate(byId)) {
             return RestResponse.success(null, "成功");
         }
-        return RestResponse.fail("用户已绑定支付宝账号");
+        return RestResponse.fail();
     }
 
     /**
@@ -62,6 +60,9 @@ public class PayServiceImpl extends ServiceImpl<PayMapper, Pay> implements PaySe
      * @date 2019/12/27 10:35
      */
     public RestResponse pay(PayReq req) throws AlipayApiException {
+        if (req.getTotalAmount().compareTo(BigDecimal.ZERO) < 1) {
+            return RestResponse.fail("金额必须大于0");
+        }
         Pay byId = this.getById(req.getUserId());
         String outTradeNo = IdWorker.getIdStr();
         PayRecord record = new PayRecord();
@@ -71,6 +72,8 @@ public class PayServiceImpl extends ServiceImpl<PayMapper, Pay> implements PaySe
         record.setTotalAmount(req.getTotalAmount());
         //设置订单号
         record.setOutTradeNo(outTradeNo);
+        //设置订单标题
+        record.setSubject(req.getSubject());
         //设置订单创建时间
         record.setCreateDatetime(LocalDateTime.now());
         //设置订单状态
@@ -81,13 +84,14 @@ public class PayServiceImpl extends ServiceImpl<PayMapper, Pay> implements PaySe
         if (req.getType().equals(1)) {
             //向支付宝发创建充值订单请求
             tradeNo = AlipayUtil
-                    .create(byId.getAlipayId(), outTradeNo, req.getSubject(), req.getBody(), req.getTotalAmount());
+                    .create(byId.getAlipayAccount(), outTradeNo, req.getSubject(), req.getBody(), req.getTotalAmount());
             if (tradeNo != null) {
                 record.setType(1);
                 record.setTradeNo(tradeNo);
                 //保存订单信息到数据库
-                recordService.save(record);
-                return RestResponse.success(tradeNo);
+                if (recordService.save(record)) {
+                    return RestResponse.success(outTradeNo);
+                }
             }
             return RestResponse.fail();
         }
@@ -97,28 +101,25 @@ public class PayServiceImpl extends ServiceImpl<PayMapper, Pay> implements PaySe
             if (req.getTotalAmount().compareTo(byId.getMoney()) > 0) {
                 return RestResponse.fail("账号余额不足");
             }
-            PayRecord one = recordService.getOne(new QueryWrapper<PayRecord>()
+            if (recordService.getOne(new QueryWrapper<PayRecord>()
                     .eq("type", 2)
-                    .eq("status", 0)
-            );
-            if (one != null) {
+                    .eq("status", 0)) != null) {
                 return RestResponse.fail("已有提现订单");
             }
             int size = recordService.list(new QueryWrapper<PayRecord>()
                     .eq("user_id", req.getUserId())
+                    .eq("type", 2)
                     .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.success(record.getOutTradeNo(), "成功");
             }
         }
         return RestResponse.fail();
@@ -131,43 +132,56 @@ public class PayServiceImpl extends ServiceImpl<PayMapper, Pay> implements PaySe
      * @date 2019/12/27 14:50
      */
     public RestResponse order(PayReq req) throws AlipayApiException {
-        Pay payById = this.getById(req.getUserId());
-        PayRecord recordById = recordService.getById(req.getId());
+        PayRecord recordByOutTradeNo = recordService.getOne(new QueryWrapper<PayRecord>()
+                .eq(req.getOutTradeNo() != null, "out_trade_no", req.getOutTradeNo()));
+        //如果已经完成的订单
+        if (recordByOutTradeNo.getStatus() == 1) {
+            return RestResponse.fail("订单已完成");
+        }
+        if (recordByOutTradeNo.getStatus() == 2) {
+            return RestResponse.fail("交易已取消");
+        }
         //如果记录是充值
-        if (recordById.getType() == 1) {
+        if (recordByOutTradeNo.getType() == 1) {
+            Pay payById = this.getById(recordByOutTradeNo.getUserId());
             //调用支付宝订单查询接口,查询充值订单是否完成
-            if (AlipayUtil.order(recordById.getTradeNo())) {
+            Map<String, Object> orderInfo = AlipayUtil.order(recordByOutTradeNo.getTradeNo());
+            if ((boolean) orderInfo.get("status")) {
                 //完成就设置用户在平台中的余额
                 payById.setMoney(payById.getMoney()
-                        .add(recordById.getTotalAmount()));
+                        .add(recordByOutTradeNo.getTotalAmount()));
                 //设置订单状态为1完成,订单完成时间为当前
                 if (this.updateById(payById)) {
-                    recordById.setStatus(1);
-                    recordById.setFinishDatetime(LocalDateTime.now());
-                    if (recordService.updateById(recordById)) {
+                    recordByOutTradeNo.setStatus(1);
+                    recordByOutTradeNo.setFinishDatetime(LocalDateTime.now());
+                    payById.setAlipayId(orderInfo.get("alipayId").toString());
+                    if (this.updateById(payById) && recordService.updateById(recordByOutTradeNo)) {
                         //全部保存成功就返回 “成功”
                         return RestResponse.success(null, "成功");
                     }
                 }
-                //如果查询充值订单没有完成,就返回 “订单还未支付”
-                return RestResponse.fail("订单还未支付");
             }
+            //如果查询充值订单没有完成,就返回 “订单还未支付”
+            return RestResponse.fail("订单还未支付");
         }
         //如果记录是提现
-        if (recordById.getType() == 2) {
+        if (recordByOutTradeNo.getType() == 2) {
+            Pay byId = this.getById(recordByOutTradeNo.getUserId());
             //调用支付宝企业转账到个人 接口
             String tradeNo = AlipayUtil.withdraw(
-                    req.getAlipayId(),
-                    recordById.getOutTradeNo(),
-                    recordById.getRemark(),
-                    recordById.getTotalAmount(),
-                    recordById.getRemark());
+                    byId.getAlipayId(),
+                    recordByOutTradeNo.getOutTradeNo(),
+                    recordByOutTradeNo.getSubject(),
+                    recordByOutTradeNo.getTotalAmount());
             //如果有订单码说明转账成功
             if (tradeNo != null) {
-                //设置
-                recordById.setTradeNo(tradeNo);
-                recordById.setStatus(1);
-                if (recordService.updateById(recordById)) {
+                //设置冻结金额为0
+                byId.setFreezeMoney(new BigDecimal(0));
+                //设置支付宝订单id,订单状态,订单完成时间
+                recordByOutTradeNo.setTradeNo(tradeNo);
+                recordByOutTradeNo.setStatus(1);
+                recordByOutTradeNo.setFinishDatetime(LocalDateTime.now());
+                if (this.updateById(byId) && recordService.updateById(recordByOutTradeNo)) {
                     return RestResponse.success(null, "成功");
                 }
             }
@@ -176,13 +190,50 @@ public class PayServiceImpl extends ServiceImpl<PayMapper, Pay> implements PaySe
         return RestResponse.failParam();
     }
 
+    //充值及提现订单列表
     public RestResponse orders(PayReq req) {
         List<PayRecord> payRecords = recordService.list(
                 new QueryWrapper<PayRecord>()
-                        .eq("user_id", req.getUserId()));
+                        .eq("user_id", req.getUserId())
+                        .eq(req.getType() != null, "type", req.getType())
+                        .eq(req.getStatus() != null, "status", req.getStatus()));
         if (payRecords.isEmpty()) {
             return RestResponse.success();
         }
         return RestResponse.success(payRecords);
     }
+
+    //取消订单
+    public RestResponse cancel(PayReq req) throws AlipayApiException {
+        PayRecord recordByOutTradeNo = recordService.getOne(new QueryWrapper<PayRecord>()
+                .eq("out_trade_no", req.getOutTradeNo()));
+        if (recordByOutTradeNo == null) {
+            return RestResponse.fail("订单不存在");
+        }
+
+        recordByOutTradeNo.setFinishDatetime(LocalDateTime.now());
+
+        //如果订单是充值类型
+        if (recordByOutTradeNo.getStatus() == 0) {
+            if (recordByOutTradeNo.getType() == 1) {
+                if (AlipayUtil.cancel(recordByOutTradeNo.getTradeNo())) {
+                    recordByOutTradeNo.setStatus(2);
+                    if (recordService.updateById(recordByOutTradeNo)) {
+                        return RestResponse.success(null, "成功");
+                    }
+                }
+            }
+            //如果订单是提现类型
+            if (recordByOutTradeNo.getType() == 2) {
+                Pay byId = this.getById(recordByOutTradeNo.getUserId());
+                byId.setMoney(byId.getMoney().add(byId.getFreezeMoney()));
+                byId.setFreezeMoney(BigDecimal.ZERO);
+                recordByOutTradeNo.setStatus(2);
+                if (this.updateById(byId) && recordService.updateById(recordByOutTradeNo)) {
+                    return RestResponse.success(null, "成功");
+                }
+            }
+        }
+        return RestResponse.fail();
+    }
 }