Ver código fonte

feat: 完成了支付宝沙箱

DingXiaoYu 2 anos atrás
pai
commit
fac77a6798

+ 54 - 9
src/main/java/com/seecoder/BlueWhale/configure/AlipayTools.java

@@ -1,9 +1,10 @@
 package com.seecoder.BlueWhale.configure;
 
 import com.alibaba.fastjson.JSONObject;
-import com.alipay.api.*;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
 import com.alipay.api.request.AlipayTradePagePayRequest;
-
+import com.seecoder.BlueWhale.exception.BlueWhaleException;
 import lombok.Getter;
 import lombok.Setter;
 import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -34,24 +35,26 @@ public class AlipayTools {
 
     private static String signType="RSA2";
 
-    public void pay(String name , Double price, HttpServletResponse httpResponse){
+    /**
+     * @Author: DingXiaoyu
+     * @Date: 16:02 2024/1/27
+     * 用来测试支付宝沙箱
+    */
+    public void testPay(String name , Double price, HttpServletResponse httpResponse){
         AlipayClient alipayClient = new DefaultAlipayClient(serverUrl,appId,appPrivateKey,format,charset,alipayPublicKey,signType);
-
         AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
-
         request.setNotifyUrl(notifyUrl);
-
         String replace = UUID.randomUUID().toString().replace("-", "");
         JSONObject bizContent = new JSONObject();
-        bizContent.put("out_trade_no", replace); //订单编号
+        bizContent.put("out_trade_no", replace);
         bizContent.put("total_amount", price);
         bizContent.put("subject", name);
         bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
         request.setBizContent(bizContent.toString());
-
-        String form= "" ;
+        String form;
         try  {
             form = alipayClient.pageExecute(request).getBody();
+            System.out.println(form);
             httpResponse.setContentType("text/html;charset=" + charset);
             httpResponse.getWriter().write(form);
             httpResponse.getWriter().flush();
@@ -60,4 +63,46 @@ public class AlipayTools {
             e.printStackTrace();
         }
     }
+
+//    public String pay(String tradeName, String name , Double price){
+//        AlipayClient alipayClient = new DefaultAlipayClient(serverUrl,appId,appPrivateKey,format,charset,alipayPublicKey,signType);
+//        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
+//        request.setNotifyUrl(notifyUrl);
+//        JSONObject bizContent = new JSONObject();
+//        bizContent.put("out_trade_no", tradeName); //订单id-优惠券id
+//        bizContent.put("total_amount", price);
+//        bizContent.put("subject", name);
+//        bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
+//        request.setBizContent(bizContent.toString());
+//        String form;
+//        try  {
+//            form = alipayClient.pageExecute(request).getBody();
+//            System.out.println(form);
+//        }  catch  (Exception e) {
+//            throw BlueWhaleException.payError();
+//        }
+//        return form;
+//    }
+
+    public void pay(String tradeName, String name , Double price, HttpServletResponse httpResponse){
+        AlipayClient alipayClient = new DefaultAlipayClient(serverUrl,appId,appPrivateKey,format,charset,alipayPublicKey,signType);
+        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
+        request.setNotifyUrl(notifyUrl);
+        JSONObject bizContent = new JSONObject();
+        bizContent.put("out_trade_no", tradeName); //订单id-优惠券id
+        bizContent.put("total_amount", price);
+        bizContent.put("subject", name);
+        bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
+        request.setBizContent(bizContent.toString());
+        String form;
+        try  {
+            form = alipayClient.pageExecute(request).getBody();
+            httpResponse.setContentType("text/html;charset=" + charset);
+            httpResponse.getWriter().write(form);
+            httpResponse.getWriter().flush();
+            httpResponse.getWriter().close();
+        }  catch  (Exception e) {
+            throw BlueWhaleException.payError();
+        }
+    }
 }

+ 1 - 2
src/main/java/com/seecoder/BlueWhale/configure/MyWebMvcConfig.java

@@ -27,8 +27,7 @@ public class MyWebMvcConfig implements WebMvcConfigurer {
                 .addPathPatterns("/**")
                 .excludePathPatterns("/api/users/register")
                 .excludePathPatterns("/api/users/login")
-                .excludePathPatterns("/api/orders/notify")
-                .excludePathPatterns("/api/orders/test")
+                .excludePathPatterns("/api/ali/*")
                 .order(1);
     }
 

+ 61 - 0
src/main/java/com/seecoder/BlueWhale/controller/AliPayController.java

@@ -0,0 +1,61 @@
+package com.seecoder.BlueWhale.controller;
+
+import com.seecoder.BlueWhale.configure.AlipayTools;
+import com.seecoder.BlueWhale.enums.OrderStatusEnum;
+import com.seecoder.BlueWhale.po.Coupon;
+import com.seecoder.BlueWhale.po.Order;
+import com.seecoder.BlueWhale.repository.CouponRepository;
+import com.seecoder.BlueWhale.repository.OrderRepository;
+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.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api/ali")
+public class AliPayController {
+
+    @Autowired
+    AlipayTools alipayTools;
+
+    @Autowired
+    OrderRepository orderRepository;
+
+    @Autowired
+    CouponRepository couponRepository;
+
+    @PostMapping("/notify")
+    public void notify(HttpServletRequest httpServletRequest){
+        if (httpServletRequest.getParameter("trade_status").equals("TRADE_SUCCESS")) {
+            System.out.println("=========支付宝异步回调========");
+            Map<String, String> params = new HashMap<>();
+            Map<String, String[]> requestParams = httpServletRequest.getParameterMap();
+            for (String name : requestParams.keySet()) {
+                params.put(name, httpServletRequest.getParameter(name));
+            }
+            String tradeName = params.get("out_trade_no");
+            String[] args=tradeName.split("-");
+            Double paid = Double.parseDouble(params.get("total_amount"));
+            Order order = orderRepository.findById(Integer.parseInt(args[0])).get();
+            order.setPaid(paid);
+            order.setStatus(OrderStatusEnum.UNSEND);
+            orderRepository.save(order);
+            if (!args[1].equals("$")){
+                Coupon coupon=couponRepository.findById(Integer.parseInt(args[1])).get();
+                coupon.setUsed(true);
+                couponRepository.save(coupon);
+            }
+        }
+    }
+
+    @GetMapping("/test")
+    public void test(HttpServletResponse httpServletResponse){
+        alipayTools.testPay("test",666.0,httpServletResponse);
+    }
+}

+ 2 - 18
src/main/java/com/seecoder/BlueWhale/controller/OrderController.java

@@ -7,8 +7,6 @@ import com.seecoder.BlueWhale.vo.ResultVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 
@@ -19,9 +17,6 @@ public class OrderController {
     @Autowired
     OrderService orderService;
 
-    @Autowired
-    AlipayTools alipayTools;
-
     @PostMapping
     public ResultVO<OrderVO> create(@RequestBody OrderVO orderVO){
         return ResultVO.buildSuccess(orderService.create(orderVO));
@@ -38,8 +33,8 @@ public class OrderController {
     }
 
     @PostMapping("/pay")
-    public ResultVO<Boolean> pay(@RequestParam("orderId") Integer orderId,@RequestParam("couponId")Integer couponId){
-        return ResultVO.buildSuccess(orderService.pay(orderId,couponId));
+    public void pay(@RequestParam("orderId") Integer orderId,@RequestParam("couponId")Integer couponId){
+        orderService.pay(orderId,couponId);
     }
 
     @PostMapping("/deliver")
@@ -61,15 +56,4 @@ public class OrderController {
     public ResultVO<Double> calculate(@RequestParam("orderId") Integer orderId,@RequestParam("couponId")Integer couponId){
         return ResultVO.buildSuccess(orderService.calculate(orderId,couponId));
     }
-
-    @PostMapping("/notify")
-    public ResultVO<Boolean> notify(HttpServletRequest httpServletRequest){
-        System.out.println(666);
-        return ResultVO.buildSuccess(true);
-    }
-
-    @GetMapping("/test")
-    public void test(HttpServletResponse httpServletResponse){
-        alipayTools.pay("nihao",666.0,httpServletResponse);
-    }
 }

+ 5 - 0
src/main/java/com/seecoder/BlueWhale/exception/BlueWhaleException.java

@@ -53,6 +53,7 @@ public class BlueWhaleException extends RuntimeException{
     public static BlueWhaleException fullReductionCouponError(){
         return new BlueWhaleException("满减券设置错误!");
     }
+
     public static BlueWhaleException couponNotAllowed(){
         return new BlueWhaleException("该优惠券不支持使用!");
     }
@@ -60,4 +61,8 @@ public class BlueWhaleException extends RuntimeException{
     public static BlueWhaleException couponGroupNotEnough(){
         return new BlueWhaleException("优惠券数量不足!");
     }
+
+    public static BlueWhaleException payError(){
+        return new BlueWhaleException("支付失败!");
+    }
 }

+ 1 - 1
src/main/java/com/seecoder/BlueWhale/po/Order.java

@@ -16,7 +16,7 @@ import javax.persistence.*;
 @Setter
 @NoArgsConstructor
 @Entity
-@Table(name = "`order`")
+@Table(name = "`order`") //order是数据库保留字段,使用要加引号
 public class Order {
         
     @GeneratedValue(strategy = GenerationType.IDENTITY)

+ 1 - 1
src/main/java/com/seecoder/BlueWhale/service/OrderService.java

@@ -8,7 +8,7 @@ public interface OrderService {
     OrderVO create(OrderVO orderVO);
     List<OrderVO> getAllOrders();
     OrderVO getOrder(Integer id);
-    Boolean pay(Integer orderId,Integer couponId);
+    void pay(Integer orderId,Integer couponId);
     Boolean deliver(Integer orderId);
     Boolean get(Integer orderId);
     Boolean comment(Integer orderId, String comment, Integer rating);

+ 17 - 9
src/main/java/com/seecoder/BlueWhale/serviceImpl/OrderServiceImpl.java

@@ -1,5 +1,6 @@
 package com.seecoder.BlueWhale.serviceImpl;
 
+import com.seecoder.BlueWhale.configure.AlipayTools;
 import com.seecoder.BlueWhale.enums.OrderStatusEnum;
 import com.seecoder.BlueWhale.enums.RoleEnum;
 import com.seecoder.BlueWhale.exception.BlueWhaleException;
@@ -12,6 +13,8 @@ import com.seecoder.BlueWhale.vo.OrderVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -37,6 +40,12 @@ public class OrderServiceImpl implements OrderService {
     @Autowired
     CouponGroupRepository couponGroupRepository;
 
+    @Autowired
+    AlipayTools alipayTools;
+
+    @Autowired
+    HttpServletResponse httpServletResponse;
+
     @Override
     public OrderVO create(OrderVO orderVO) {
         Order order = orderVO.toPO();
@@ -60,8 +69,7 @@ public class OrderServiceImpl implements OrderService {
                         .filter(x-> storeId.equals(productRepository.findById(x.getProductId()).get().getStoreId()))
                         .collect(Collectors.toList());
             }else {
-                orders = orderRepository.findAll().stream()
-                        .collect(Collectors.toList());
+                orders = new ArrayList<>(orderRepository.findAll());
             }
         }
         return orders.stream().map(x->wrapWithProductId(x.toVO())).collect(Collectors.toList());
@@ -73,7 +81,7 @@ public class OrderServiceImpl implements OrderService {
     }
 
     @Override
-    public Boolean pay(Integer orderId,Integer couponId) {
+    public void pay(Integer orderId,Integer couponId) {
         User user=securityUtil.getCurrentUser();
         Order order = orderRepository.findById(orderId).orElse(null);
         if(order == null){
@@ -82,6 +90,7 @@ public class OrderServiceImpl implements OrderService {
         if(order.getStatus() != OrderStatusEnum.UNPAID){
             throw BlueWhaleException.orderStatusError();
         }
+        String tradeName=String.valueOf(order.getId()).concat("-");
         if (couponId!=0){
             Coupon coupon = couponRepository.findById(couponId).get();
             CouponGroup couponGroup=couponGroupRepository.findById(coupon.getGroupId()).get();
@@ -90,13 +99,12 @@ public class OrderServiceImpl implements OrderService {
             couponGroup.getStoreId()>0 && !couponGroup.getStoreId().equals(product.getStoreId())){
                 throw BlueWhaleException.couponNotAllowed();
             }
-            coupon.setUsed(true);
-            couponRepository.save(coupon);
+            tradeName=tradeName.concat(String.valueOf(coupon.getId()));
+        }else {
+            tradeName=tradeName.concat("$");
         }
-        order.setStatus(OrderStatusEnum.UNSEND);
-        order.setPaid(calculate(orderId,couponId));
-        orderRepository.save(order);
-        return true;
+        String name=productRepository.findById(order.getProductId()).get().getName();
+        alipayTools.pay(tradeName,name,calculate(orderId,couponId),httpServletResponse);
     }
 
     @Override

+ 1 - 1
src/main/resources/application.yml

@@ -21,5 +21,5 @@ alipay:
   appId: 9021000134634835
   appPrivateKey: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCb6f5ANvvjb9fGNLZIjy1APbXSAgwAFdu5YNgsA11VE0erxyN8doYX/nslKxcz79C8hM8cpFzpfe6LCK7hX2WiKcYQjMrJcXkfwqVhjyKy6wNEZBOryq4JEo8dMBmLqFpNRx2RYFXjFZRYKVTcGjvWtLEwmXd33rKBmORe+HLx6Kc1E5lLBsKCvtIbdcs12F1Dk9LIjQL+qq6MkO9fZEA3UayIOvW9BqkZcImIBHeH49TeFtY5xPeDhG/rI2ik4VEcO9HP8SNjomE2o+iYVHwJLfdDdVC1tABJVcj4MNiafmW8YzLGs9FLnF5q9DVxBh49X6NkKI9iSlVuGwKbRVshAgMBAAECggEANNwJGiZKEdraUdWPM1xvYAdL/G47OVAv1VKzF4DwhKZrtx5lto3MepgJkhlg3Xfh0fhI65IB+ht642JHQBuCro7xGq1RFyjEgvMP9Np9TiGFUwuG68hkZqkHIkMrdgDW1LpWmPILTFkFmToyDglK3kkWhb6SFW7IIE4Apv4eokrOG0FnlugKZYj4E/a+GTVGFvpe57Bb+n4I0ZiCYE1FNipJM0PfjFZxVItdLgp2heHjOkiXtPYUfFe2DooJwy3C/xtJywz8evWP1KJx/T9awrynjvuM7wbnSOc18o+8IQi/xgtWAw5ySzwL/Ja8iiEWe5aFu9b1idkB/NJMucfAAQKBgQD8+HDxZmGpVfRroy3dpiU5e9LWKZYm3HL9LyMUXubtj5i8HhjHn7cyz3Syg6FmjwdWpLAeT3UCdbogQDYYG8qKt0q7rqfkCIhQxdRxOcBGXdQSAN3O5a1o4inS8mbShaUfGnuQNchw5QV28Gdrw9RzNLaxj5molPU7MBMwkkSZIQKBgQCdx/7gh7QwMEn78+kamaCNSATxZe3RuEOdOrXmmz29iWRDHFyEOZuT+wGXp6FPtxRQdUr/VOzAIUVqaBa1XuP8RWpIt8AKk2J697/BS8h7vjr6wJGKMZfXbmDqlY9qpS6ef8PNTpV6fU5oRasuNGTCeP8E871IkNB3iQWUNX6CAQKBgG8JJZnv1GIdZmFwiItHiANJRGvYaR25mYdkD0O7vCT96I55r2q/wgu9X32TpV583T28n8lOGw/vWLkbNiMy354vgdALg4nl7N93Vh40uR6pxJH6a2GLEqh8zNrYpyU0oBuc5iuQT+Ctxc5FC0AT/sZqlt4tJ8cFSvalzWZ+bTnBAoGBAJXU5TIdTDxyrt9HObab6v4fRSpkDBoa7IJzzWdHRrMltIOSfDzIY/h75YA5nJMRnYXmTKj54bV2IvAwFlh32vKmjI6vh/vDCEMT4BHUQHdaJ7IVil/8RmA7HmfGTSIN6J51X+AoXwSp1/pnJm7DLGgM9MekGry9YGoTQawDvLYBAoGBAPrdP7mIIypubwnDmgbX8Ke5qZb4gYlqL1/geKLZWlJiSUOhuJqxdB18m7fynqWUIenN/L3ilRzhyAuKw/6kl7d3C5F3xTr+5lA5Klh+EUPY/GbY/IUPpXQPqLwOuTQTZKOit8c0wRMvbx7fTxzHSsHdQSwwdKQ6yrmXOLwTWmMS
   alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjMaVjki3OlqoBGZDRPPcP3CsR0Ge9ni1YI/uwRiOMXlqdx69K+/O9nnfRTf9Lbwxz0dhgyMzd4sYkidcCMawmb8Ex2GWHDHJxKVWtq/III3HIRKCYeicqRxLmMV75CduwfFVRUyWU3F5PxKEVwc4HqF9cVB8WAK8pONAer21UiG+Ca4gbZR7HLgeVjWBZrVsrVl3zVSc+DqXGTiZPNj65P29N498tMwvy5wNxLWGle7hlA31UK5Q1boREsuvPJoTIc6rggD1Nb8etFVUq50sVe6SyfyQTJN532VVTJ8KUo2pqgA1iDbMO6aX/dGo5ZpBnAPZqUudmxeA9Yh6BQMgxwIDAQAB
-  notifyUrl: http://97isx5.natappfree.cc/api/orders/notify
+  notifyUrl: http://xg2j6q.natappfree.cc/api/ali/notify
   serverUrl: https://openapi-sandbox.dl.alipaydev.com/gateway.do