haha 2 years ago
parent
commit
59876906a7

+ 1 - 1
config.yml

@@ -7,7 +7,7 @@ pay:
     appid: 9021000133688986
     appPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7JurPkMO5If5q277CaoTtUvD9K1xu370PnyTTEE2hFGabrg7Fiy1j0kLYocktMXADlvVj8juLIR+m9+Wbx9Mc0tfdYCtoOqNPEQA57RmHgSt/ihiEqnxgq2IIgQZH16BdgLlkG2oOE3fTQ++qmUDgZ6+Bd4+eDOq28WnlyZkjIRj9/RXow7W/mt8w+Y7/AAJSiXNx972043Wgl+E+f6UxMYBT048Ic+T1L2TR9mtZrc45ArT6kxpnO0YAO4Lpt7SP8vvTR0LB0qwMsNmulZAUtu3DG6NErDP3jgAvEOsExDufNIGZSty2CeitxvGYDn/eTifaT1bLOYakksnBrhXdAgMBAAECggEAZJi/oICE5A9krNWfTOtqthJeHQdgsOwsuKfnaFgcEhhgKxA9OmvcIwrTCZS1CUjIl/Vdw7Jh1SAh3mLjlX+sd5LRm1nlGyphu888muZaUZ7Z3b1B/pWRM3kLwdxwns9FkNzvSeL+d8B5KSMcQUwNNlIlYWb92IvC4kETlgNuABYNLCag+JzFcdwIxEsBZscvlCevwEI5EVIToI9P0zIj7q866bhM/Y70HEb2kveqMT6Kes5eEDSIF074kScVByhkLi9XrJNoRCirHBkGyfzMJyMiiTncsVEa74DI7EElib9Qj2W1gX65haLpOm7DbzjEWeKiaEAVMA//mDk9gIPWVQKBgQD/qrFX0b2bA/YUPFDqUQ8ClhFtjiZlGykKhxK8Qv/HAkeNqVtV70GAN/FEmxFgs3e3+Sw+Efa3JdbbgMVW6YIGUBNtJPJvqu4YzyEiPwzwWodTZx23cJwervxPD9HMHqPZPZUoskvtd5bpbBeW5zjDz/BpJ889lfVGXUlpfXWfQwKBgQC7ZV0LdEy0U7K6BVaqLMzBTTbNDczf2lFOf7JbntYVoCn7UknWwqU9HfXvXXlp9WkgSkCwfUkGKDfn1WXzRYzA09JJ3nB2c27rAfDQVTUyLOkQJman7/Sj+hQgfasN0ItL4mMeKRMK6iWnXXmBcHfgCc9OfGon30QJGsilzsJUXwKBgGL2l57+uP4AEojSsB+DMOQ3Ypedpo8MbF5+2mm1JXzLDRdwrsIc0qXnAaUkwR1FWtoDwXRlT7KlGv3sYna5/HKlHF/rJUzERVWlF5ZCAagn4qoOCBqxpDzcTx3rabIxSgsVI1+VZH6PBANmq9rltbtWCiEqH7YfDcom4fvLbHQxAoGAPLXqHvvenc0/6eQw35EEBNvvFR+TcDJahQP51JTw5rCs6S8PnPQSdGpwcsvlud434K4tpv/v2H7PHdyU2ut9XjtBtYzLApUDKj/GtLfmNAs4tnK6b03eBAHQ43XTJPabKkp9she8g5y39jDiXH0DWSHUd6j2+1PpxslWl+EUNCECgYEAsYvG+IJoqJ7luzG34M01t+DUzY4sSp1iJQIf+/rSe/3sd0nYBZbdasASUsKjsIk7QAyCLPiehB6uqq7GH9CH2XilxYi6AHHax5ZvIisd8nbXrtByZcPEu1X7hbTaRbnBy6HepDEPtOyap2UTlANSd6EtPb2jA5Jfh9oz3czRmz4=
     alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjkh962aaFtsZN81RNmfmc4RON3d2BD2069xQjWfX/PjfUHHsgz0kbura22hJkcvUMsBt3MCki5VPywxH1VZrEFCY20fDB66arUl3RP9xwzLa+9LENXes/R7dcmymlDbtd1Ta/6tvnm9XvxUz6IDFwvlUeGbn5zpZKcl/GWByeVX4R7iIx1yRlTgtA1zl1b8gDPc/cfSunR+Kc3OekvMJd3895hdylpPWGjlBC95D2YbPwKt2a+J/lzo8HIcZ5hKZVzy4VfO+omG9qQjdS762Z7Z/BfUjaBYRyA0Bqw5fYTDEOXo9Hi7Pn+glC9TBAMX5MFGcavOY31fnKruiEMrD8QIDAQAB
-    notifyUrl: http://pay2.seec.seecoder.cn/alipay/notify
+    notifyUrl: http://pay4.seec.seecoder.cn/alipay/notify
     sellerId: 2088102180140519
 
 spring:

+ 14 - 2
pom.xml

@@ -13,7 +13,7 @@
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
-        <version>2.0.2.RELEASE</version>
+        <version>2.7.3</version>
         <relativePath/> <!-- lookup parent from repository -->
     </parent>
 
@@ -111,6 +111,18 @@
             <artifactId>javassist</artifactId>
             <version>3.23.1-GA</version>
         </dependency>
+        <!--        内部依赖-->
+        <dependency>
+            <groupId>com.seecoder</groupId>
+            <artifactId>common-core</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.seecoder</groupId>
+            <artifactId>user-common</artifactId>
+            <version>1.0.7</version>
+        </dependency>
 
     </dependencies>
 
@@ -126,7 +138,7 @@
     <distributionManagement>
         <repository>
             <id>nexus</id>
-            <url>${nexus.repo}</url>
+            <url>http://nexus.seecoder.cn/repository/maven-releases</url>
         </repository>
     </distributionManagement>
 </project>

+ 2 - 0
src/main/java/com/nju/edu/pay/Application.java

@@ -2,12 +2,14 @@ package com.nju.edu.pay;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
 import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
 
 @SpringBootApplication
 @EnableJpaRepositories(basePackages = "com.nju.edu.pay.data.dao")
 @EnableJpaAuditing
+@EnableConfigurationProperties
 public class Application {
     public static void main(String[] args) {
         SpringApplication.run(Application.class, args);

+ 9 - 0
src/main/java/com/nju/edu/pay/configuration/AuthConfig.java

@@ -0,0 +1,9 @@
+package com.nju.edu.pay.configuration;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ComponentScan("com.seecoder.satoken")
+public class AuthConfig {
+}

+ 9 - 2
src/main/java/com/nju/edu/pay/controller/api/AlipayController.java

@@ -1,5 +1,6 @@
 package com.nju.edu.pay.controller.api;
 
+import com.alibaba.fastjson.JSON;
 import com.alipay.api.AlipayApiException;
 import com.alipay.api.AlipayClient;
 import com.alipay.api.DefaultAlipayClient;
@@ -32,7 +33,7 @@ import java.util.Map;
 
 @Slf4j
 @RestController
-@RequestMapping("/api/alipay")
+@RequestMapping("/alipay")
 public class AlipayController {
 
     private final AlipayProperties alipayProperties;
@@ -78,6 +79,9 @@ public class AlipayController {
         model.setBody(payModelDTO.getSubject()+", 共"+payModelDTO.getPrice()+"元");
         // 销售产品码
         model.setProductCode(productCode);
+//        跳转模式/嵌入模式
+//        model.setQrPayMode("4");
+//        model.setQrcodeWidth(300L);
 
         AlipayTradePagePayRequest pagePayRequest =new AlipayTradePagePayRequest();
         // 交易成功后,返回的页面
@@ -88,8 +92,11 @@ public class AlipayController {
 
         AlipayClient alipayClient=new DefaultAlipayClient(alipayProperties.getGatewayUrl(),alipayProperties.getAppid(),alipayProperties.getAppPrivateKey(),alipayProperties.getFormate(),alipayProperties.getCharset(),alipayProperties.getAlipayPublicKey(),alipayProperties.getSignType());
         // 调用SDK生成表单, 并直接将完整的表单html输出到页面
-        AlipayTradePagePayResponse alipayTradePagePayResponse=alipayClient.pageExecute(pagePayRequest);
+        AlipayTradePagePayResponse alipayTradePagePayResponse=alipayClient.pageExecute(pagePayRequest,"GET");
+        System.out.println(JSON.toJSONString(pagePayRequest));
         if (alipayTradePagePayResponse.isSuccess()){
+            order.setPayHtml(alipayTradePagePayResponse.getBody());
+            orderService.updateOrder(order);
             System.out.println(alipayTradePagePayResponse.getBody());
             return new SuccessResponse(alipayTradePagePayResponse.getBody());
         }else {

+ 1 - 1
src/main/java/com/nju/edu/pay/controller/api/AuthController.java

@@ -10,7 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 @RestController
-@RequestMapping("/api/auth")
+@RequestMapping("/auth")
 public class AuthController {
 
     private final RootProperties rootProperties;

+ 15 - 7
src/main/java/com/nju/edu/pay/controller/api/OrderController.java

@@ -1,5 +1,8 @@
 package com.nju.edu.pay.controller.api;
 
+import cn.dev33.satoken.annotation.SaCheckLogin;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.stp.StpUtil;
 import com.nju.edu.pay.controller.dto.CheckOrderDTO;
 import com.nju.edu.pay.service.OrderService;
 import com.nju.edu.pay.web.annotation.RootAllowed;
@@ -10,23 +13,28 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 @RestController
-@RequestMapping("/api/order")
+@RequestMapping("/order")
 public class OrderController {
 
     @Autowired
     private OrderService orderService;
 
     @PostMapping("/check")
-    public Response checkOrder(@RequestBody CheckOrderDTO checkOrderDTO){
-        if(orderService.hasOrder(checkOrderDTO.getUserId(),checkOrderDTO.getProductId(),checkOrderDTO.getPlatformType())){
+    public Response checkOrder(@RequestBody CheckOrderDTO checkOrderDTO) {
+        if (orderService.hasOrder(checkOrderDTO.getUserId(), checkOrderDTO.getProductId(), checkOrderDTO.getPlatformType())) {
             return new SuccessResponse("success");
-        }else
-            return new ErrorResponse(500,"failed");
+        } else
+            return new ErrorResponse(500, "failed");
     }
 
     @GetMapping("/orderList")
+    @SaCheckLogin()
     @RootAllowed
-    public Response getOrderList(){
-        return new SuccessResponse(orderService.retrieveAll());
+    public Response getOrderList() {
+        System.out.println(StpUtil.getLoginId());
+        if (StpUtil.hasPermission("PAY_MANAGE")) {
+            return new SuccessResponse(orderService.retrieveAll());
+        }
+        return new SuccessResponse(orderService.getByUserId(Long.parseLong((String) StpUtil.getLoginId())));
     }
 }

+ 1 - 1
src/main/java/com/nju/edu/pay/controller/api/TradeController.java

@@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 @RestController
-@RequestMapping("/api/trade")
+@RequestMapping("/trade")
 public class TradeController {
 
     @Autowired

+ 19 - 1
src/main/java/com/nju/edu/pay/controller/dto/PayModelDTO.java

@@ -9,10 +9,28 @@ import lombok.NoArgsConstructor;
 @NoArgsConstructor
 @AllArgsConstructor
 public class PayModelDTO {
-    private int userId;
+    /**
+     * 用户ID
+     */
+    private long userId;
+    /**
+     * 商品ID
+     */
     private int productId;
+    /**
+     * 支付订单标题
+     */
     private String subject;
+    /**
+     * 平台,如SEEC-I,SEEC-II
+     */
     private PlatformType platformType;
+    /**
+     * 价格
+     */
     private double price;
+    /**
+     * 支付成功的返回URL
+     */
     private String returnUrl;
 }

+ 3 - 0
src/main/java/com/nju/edu/pay/data/dao/OrderRepository.java

@@ -6,8 +6,11 @@ import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Component
 public interface OrderRepository extends JpaRepository<Order,Integer> {
     public Order findByOutTradeNo(int outTradeNo);
     public Order findByUserIdAndProductIdAndPlatformType(int userId, int productId, PlatformType platformType);
+    public List<Order> findByUserId(Long userId);
 }

+ 8 - 2
src/main/java/com/nju/edu/pay/data/entity/Order.java

@@ -21,6 +21,9 @@ import java.time.LocalDateTime;
 @Table(name = "entity_order")
 @EntityListeners(AuditingEntityListener.class)
 public class Order {
+    /**
+     * 商家订单号,须保持唯一性
+     */
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "out_trade_no")
@@ -36,7 +39,7 @@ public class Order {
 
     @Basic
     @Column(name = "user_id", nullable = false)
-    private Integer userId;
+    private Long userId;
 
     @Basic
     @Column(name = "product_id", nullable = false)
@@ -51,7 +54,10 @@ public class Order {
     @CreatedDate
     private LocalDateTime date;
 
-    public Order(double price, PlatformType platformType, Integer userId, Integer productId, OrderStatus status, LocalDateTime date) {
+    @Column(name="pay_html")
+    private String payHtml;
+
+    public Order(double price, PlatformType platformType, Long userId, Integer productId, OrderStatus status, LocalDateTime date) {
         this.price = price;
         this.platformType = platformType;
         this.userId = userId;

+ 18 - 0
src/main/java/com/nju/edu/pay/handler/GlobalExceptionHandler.java

@@ -0,0 +1,18 @@
+package com.nju.edu.pay.handler;
+
+import cn.dev33.satoken.exception.SaTokenException;
+import com.seecoder.commoncore.util.Response;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+    @ExceptionHandler(SaTokenException.class)
+    @ResponseStatus(HttpStatus.FORBIDDEN)
+    public Response<String> handleException(Exception e){
+        e.printStackTrace();
+        return Response.failed(e.getMessage());
+    }
+}

+ 3 - 1
src/main/java/com/nju/edu/pay/service/OrderService.java

@@ -7,7 +7,7 @@ import java.util.List;
 
 public interface OrderService {
 
-    public Order createOrder(int userId, int productId, PlatformType platformType, double price);
+    Order createOrder(Long userId, int productId, PlatformType platformType, double price);
 
     public boolean hasOrder(int userId, int productId, PlatformType platformType);
 
@@ -16,4 +16,6 @@ public interface OrderService {
     public Order updateOrder(Order order);
 
     public List<Order> retrieveAll();
+
+    public List<Order> getByUserId(Long userId);
 }

+ 9 - 4
src/main/java/com/nju/edu/pay/service/impl/OrderServiceImpl.java

@@ -18,18 +18,18 @@ public class OrderServiceImpl implements OrderService {
     private OrderRepository orderRepository;
 
     @Override
-    public Order createOrder(int userId, int productId, PlatformType platformType, double price) {
+    public Order createOrder(Long userId, int productId, PlatformType platformType, double price) {
 //        Order existOrder=orderRepository.findByUserIdAndProductIdAndPlatformType(userId,productId,platformType);
 //        if (existOrder !=null)
 //            return null;
-        Order order=new Order(price,platformType,userId,productId, OrderStatus.PROCESSING, LocalDateTime.now());
-        order=orderRepository.saveAndFlush(order);
+        Order order = new Order(price, platformType, userId, productId, OrderStatus.PROCESSING, LocalDateTime.now());
+        order = orderRepository.saveAndFlush(order);
         return order;
     }
 
     @Override
     public boolean hasOrder(int userId, int productId, PlatformType platformType) {
-        if (orderRepository.findByUserIdAndProductIdAndPlatformType(userId,productId,platformType) !=null)
+        if (orderRepository.findByUserIdAndProductIdAndPlatformType(userId, productId, platformType) != null)
             return true;
         return false;
     }
@@ -49,5 +49,10 @@ public class OrderServiceImpl implements OrderService {
         return orderRepository.findAll();
     }
 
+    @Override
+    public List<Order> getByUserId(Long userId) {
+        return orderRepository.findByUserId(userId);
+    }
+
 
 }

+ 44 - 3
src/main/resources/application.yml

@@ -1,5 +1,5 @@
 server:
-  port: 8080
+  port: 8280
 
 #pay:
 #  alipay:
@@ -16,8 +16,9 @@ pay:
     appid: 9021000133688986
     appPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7JurPkMO5If5q277CaoTtUvD9K1xu370PnyTTEE2hFGabrg7Fiy1j0kLYocktMXADlvVj8juLIR+m9+Wbx9Mc0tfdYCtoOqNPEQA57RmHgSt/ihiEqnxgq2IIgQZH16BdgLlkG2oOE3fTQ++qmUDgZ6+Bd4+eDOq28WnlyZkjIRj9/RXow7W/mt8w+Y7/AAJSiXNx972043Wgl+E+f6UxMYBT048Ic+T1L2TR9mtZrc45ArT6kxpnO0YAO4Lpt7SP8vvTR0LB0qwMsNmulZAUtu3DG6NErDP3jgAvEOsExDufNIGZSty2CeitxvGYDn/eTifaT1bLOYakksnBrhXdAgMBAAECggEAZJi/oICE5A9krNWfTOtqthJeHQdgsOwsuKfnaFgcEhhgKxA9OmvcIwrTCZS1CUjIl/Vdw7Jh1SAh3mLjlX+sd5LRm1nlGyphu888muZaUZ7Z3b1B/pWRM3kLwdxwns9FkNzvSeL+d8B5KSMcQUwNNlIlYWb92IvC4kETlgNuABYNLCag+JzFcdwIxEsBZscvlCevwEI5EVIToI9P0zIj7q866bhM/Y70HEb2kveqMT6Kes5eEDSIF074kScVByhkLi9XrJNoRCirHBkGyfzMJyMiiTncsVEa74DI7EElib9Qj2W1gX65haLpOm7DbzjEWeKiaEAVMA//mDk9gIPWVQKBgQD/qrFX0b2bA/YUPFDqUQ8ClhFtjiZlGykKhxK8Qv/HAkeNqVtV70GAN/FEmxFgs3e3+Sw+Efa3JdbbgMVW6YIGUBNtJPJvqu4YzyEiPwzwWodTZx23cJwervxPD9HMHqPZPZUoskvtd5bpbBeW5zjDz/BpJ889lfVGXUlpfXWfQwKBgQC7ZV0LdEy0U7K6BVaqLMzBTTbNDczf2lFOf7JbntYVoCn7UknWwqU9HfXvXXlp9WkgSkCwfUkGKDfn1WXzRYzA09JJ3nB2c27rAfDQVTUyLOkQJman7/Sj+hQgfasN0ItL4mMeKRMK6iWnXXmBcHfgCc9OfGon30QJGsilzsJUXwKBgGL2l57+uP4AEojSsB+DMOQ3Ypedpo8MbF5+2mm1JXzLDRdwrsIc0qXnAaUkwR1FWtoDwXRlT7KlGv3sYna5/HKlHF/rJUzERVWlF5ZCAagn4qoOCBqxpDzcTx3rabIxSgsVI1+VZH6PBANmq9rltbtWCiEqH7YfDcom4fvLbHQxAoGAPLXqHvvenc0/6eQw35EEBNvvFR+TcDJahQP51JTw5rCs6S8PnPQSdGpwcsvlud434K4tpv/v2H7PHdyU2ut9XjtBtYzLApUDKj/GtLfmNAs4tnK6b03eBAHQ43XTJPabKkp9she8g5y39jDiXH0DWSHUd6j2+1PpxslWl+EUNCECgYEAsYvG+IJoqJ7luzG34M01t+DUzY4sSp1iJQIf+/rSe/3sd0nYBZbdasASUsKjsIk7QAyCLPiehB6uqq7GH9CH2XilxYi6AHHax5ZvIisd8nbXrtByZcPEu1X7hbTaRbnBy6HepDEPtOyap2UTlANSd6EtPb2jA5Jfh9oz3czRmz4=
     alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjkh962aaFtsZN81RNmfmc4RON3d2BD2069xQjWfX/PjfUHHsgz0kbura22hJkcvUMsBt3MCki5VPywxH1VZrEFCY20fDB66arUl3RP9xwzLa+9LENXes/R7dcmymlDbtd1Ta/6tvnm9XvxUz6IDFwvlUeGbn5zpZKcl/GWByeVX4R7iIx1yRlTgtA1zl1b8gDPc/cfSunR+Kc3OekvMJd3895hdylpPWGjlBC95D2YbPwKt2a+J/lzo8HIcZ5hKZVzy4VfO+omG9qQjdS762Z7Z/BfUjaBYRyA0Bqw5fYTDEOXo9Hi7Pn+glC9TBAMX5MFGcavOY31fnKruiEMrD8QIDAQAB
-    notifyUrl: http://pay.seec.seecoder.cn/alipay/notify
-    sellerId: 2088102180140519
+    notifyUrl: http://localhost:8280/alipay/notify
+#    sellerId: 2088102180140519
+    sellerId: 2088721027936360
 
 spring:
   datasource:
@@ -38,4 +39,44 @@ root:
   password: SEEC2020
   phone: 17301585267
 
+############### Sa-Token 配置 (文档: https://sa-token.cc) ##############
+sa-token:
+  # token 名称(同时也是 cookie 名称)
+  token-name: Authorization
+  # token 有效期(单位:秒) 默认30天,-1 代表永久有效
+  timeout: 2592000
+  # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
+  active-timeout: -1
+  # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
+  is-concurrent: true
+  # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
+  is-share: true
+  # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
+  token-style: uuid
+  # 是否输出操作日志
+  is-log: true
+
+  alone-redis:
+    # Redis数据库索引
+    database: 1
+    # Redis服务器地址
+    host: 101.133.232.246
+    # Redis服务器连接端口
+    port: 6379
+    # Redis服务器连接密码(默认为空)
+    password: NJU67redis
+    # 连接超时时间
+    timeout: 10s
+    lettuce:
+      pool:
+        # 连接池最大连接数
+        max-active: 200
+        # 连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-wait: -1ms
+        # 连接池中的最大空闲连接
+        max-idle: 10
+        # 连接池中的最小空闲连接
+        min-idle: 0
+
+