Blumonilr пре 6 година
комит
cd6958d770
34 измењених фајлова са 1220 додато и 0 уклоњено
  1. 119 0
      pom.xml
  2. 15 0
      src/main/java/com/nju/edu/pay/Application.java
  3. 86 0
      src/main/java/com/nju/edu/pay/configuration/AlipayProperties.java
  4. 18 0
      src/main/java/com/nju/edu/pay/configuration/RootProperties.java
  5. 119 0
      src/main/java/com/nju/edu/pay/configuration/WebMvcConfiguration.java
  6. 187 0
      src/main/java/com/nju/edu/pay/controller/api/AlipayController.java
  7. 39 0
      src/main/java/com/nju/edu/pay/controller/api/AuthController.java
  8. 25 0
      src/main/java/com/nju/edu/pay/controller/api/HelloWorldController.java
  9. 30 0
      src/main/java/com/nju/edu/pay/controller/api/OrderController.java
  10. 4 0
      src/main/java/com/nju/edu/pay/controller/api/TradeController.java
  11. 15 0
      src/main/java/com/nju/edu/pay/controller/dto/CheckOrderDTO.java
  12. 13 0
      src/main/java/com/nju/edu/pay/controller/dto/LoginDTO.java
  13. 18 0
      src/main/java/com/nju/edu/pay/controller/dto/PayModelDTO.java
  14. 11 0
      src/main/java/com/nju/edu/pay/data/dao/OrderRepository.java
  15. 11 0
      src/main/java/com/nju/edu/pay/data/dao/TradeRepository.java
  16. 62 0
      src/main/java/com/nju/edu/pay/data/entity/Order.java
  17. 29 0
      src/main/java/com/nju/edu/pay/data/entity/Trade.java
  18. 12 0
      src/main/java/com/nju/edu/pay/service/AlipayService.java
  19. 19 0
      src/main/java/com/nju/edu/pay/service/OrderService.java
  20. 14 0
      src/main/java/com/nju/edu/pay/service/TradeService.java
  21. 50 0
      src/main/java/com/nju/edu/pay/service/impl/AlipayServiceImpl.java
  22. 48 0
      src/main/java/com/nju/edu/pay/service/impl/OrderServiceImpl.java
  23. 34 0
      src/main/java/com/nju/edu/pay/service/impl/TradeServiceImpl.java
  24. 8 0
      src/main/java/com/nju/edu/pay/util/enums/OrderStatus.java
  25. 34 0
      src/main/java/com/nju/edu/pay/util/enums/PlatformType.java
  26. 8 0
      src/main/java/com/nju/edu/pay/util/jwt/JWTUtil.java
  27. 25 0
      src/main/java/com/nju/edu/pay/util/jwt/JWTUtilImpl.java
  28. 42 0
      src/main/java/com/nju/edu/pay/web/AuthenticationInterceptor.java
  29. 12 0
      src/main/java/com/nju/edu/pay/web/annotation/RootAllowed.java
  30. 18 0
      src/main/java/com/nju/edu/pay/web/response/ErrorResponse.java
  31. 6 0
      src/main/java/com/nju/edu/pay/web/response/Response.java
  32. 26 0
      src/main/java/com/nju/edu/pay/web/response/SuccessResponse.java
  33. 32 0
      src/main/resources/application.yml
  34. 31 0
      src/test/com/nju/edu/pay/TestCase.java

+ 119 - 0
pom.xml

@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.nju.edu</groupId>
+    <artifactId>pay</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <name>springboot-pay-example</name>
+    <description>Demo project for Spring Boot</description>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.0.2.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-thymeleaf</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
+        <dependency>
+            <groupId>com.alipay.sdk</groupId>
+            <artifactId>alipay-sdk-java</artifactId>
+            <version>4.9.124.ALL</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-configuration</groupId>
+            <artifactId>commons-configuration</artifactId>
+            <version>1.10</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <version>3.2.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.6</version>
+        </dependency>
+        <!-- alipay end -->
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.4.0</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

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

@@ -0,0 +1,15 @@
+package com.nju.edu.pay;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+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
+public class Application {
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+}

+ 86 - 0
src/main/java/com/nju/edu/pay/configuration/AlipayProperties.java

@@ -0,0 +1,86 @@
+package com.nju.edu.pay.configuration;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+
+/**
+ * 支付宝支付的参数配置
+ */
+@Data
+@Slf4j
+@Configuration
+@AllArgsConstructor
+@NoArgsConstructor
+@ConfigurationProperties(prefix = "pay.alipay")
+public class AlipayProperties {
+
+	/** 支付宝gatewayUrl */
+	private String gatewayUrl;
+	/** 商户应用id */
+	private String appid;
+	/** RSA私钥,用于对商户请求报文加签 */
+	private String appPrivateKey;
+	/** 支付宝RSA公钥,用于验签支付宝应答 */
+	private String alipayPublicKey;
+	/** 签名类型 */
+	private String signType = "RSA2";
+
+	/** 格式 */
+	private String formate = "json";
+	/** 编码 */
+	private String charset = "UTF-8";
+
+	/** 异步地址 */
+	private String notifyUrl;
+
+	/** 商家id */
+	private String sellerId;
+
+	/** 最大查询次数 */
+	private static int maxQueryRetry = 5;
+	/** 查询间隔(毫秒) */
+	private static long queryDuration = 5000;
+	/** 最大撤销次数 */
+	private static int maxCancelRetry = 3;
+	/** 撤销间隔(毫秒) */
+	private static long cancelDuration = 3000;
+
+
+	@PostConstruct
+	public void init() {
+		log.info(description());
+	}
+
+	public String description() {
+		StringBuilder sb = new StringBuilder("\nConfigs{");
+		sb.append("支付宝网关: ").append(gatewayUrl).append("\n");
+		sb.append("appid: ").append(appid).append("\n");
+		sb.append("商户RSA私钥: ").append(getKeyDescription(appPrivateKey)).append("\n");
+		sb.append("支付宝RSA公钥: ").append(getKeyDescription(alipayPublicKey)).append("\n");
+		sb.append("签名类型: ").append(signType).append("\n");
+		sb.append("商家ID:").append(sellerId).append("\n");
+
+		sb.append("查询重试次数: ").append(maxQueryRetry).append("\n");
+		sb.append("查询间隔(毫秒): ").append(queryDuration).append("\n");
+		sb.append("撤销尝试次数: ").append(maxCancelRetry).append("\n");
+		sb.append("撤销重试间隔(毫秒): ").append(cancelDuration).append("\n");
+		sb.append("}");
+		return sb.toString();
+	}
+
+	private String getKeyDescription(String key) {
+		int showLength = 6;
+		if (StringUtils.isNotEmpty(key) && key.length() > showLength) {
+			return new StringBuilder(key.substring(0, showLength)).append("******")
+					.append(key.substring(key.length() - showLength)).toString();
+		}
+		return null;
+	}
+}

+ 18 - 0
src/main/java/com/nju/edu/pay/configuration/RootProperties.java

@@ -0,0 +1,18 @@
+package com.nju.edu.pay.configuration;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ConfigurationProperties(prefix = "root")
+public class RootProperties {
+    private String name;
+    private String password;
+    private String phone;
+}

+ 119 - 0
src/main/java/com/nju/edu/pay/configuration/WebMvcConfiguration.java

@@ -0,0 +1,119 @@
+package com.nju.edu.pay.configuration;
+
+import com.nju.edu.pay.web.AuthenticationInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.format.FormatterRegistry;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.validation.MessageCodesResolver;
+import org.springframework.validation.Validator;
+import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
+import org.springframework.web.servlet.HandlerExceptionResolver;
+import org.springframework.web.servlet.config.annotation.*;
+
+import java.util.List;
+
+/**
+ * WebMVC 配置.
+ *
+ */
+@Configuration
+public class WebMvcConfiguration extends WebMvcConfigurationSupport implements WebMvcConfigurer {
+
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+        registry.addMapping("/api/**").allowedMethods("POST", "GET", "PUT", "DELETE");
+    }
+
+    @Override
+    public void addViewControllers(ViewControllerRegistry registry) {
+
+    }
+
+    @Override
+    public void configureViewResolvers(ViewResolverRegistry registry) {
+
+    }
+
+    @Override
+    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
+
+    }
+
+    @Override
+    public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
+
+    }
+
+    @Override
+    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+
+    }
+
+    @Override
+    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
+
+    }
+
+    @Override
+    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
+
+    }
+
+    @Override
+    public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
+
+    }
+
+    @Override
+    public Validator getValidator() {
+        return null;
+    }
+
+    @Override
+    public MessageCodesResolver getMessageCodesResolver() {
+        return null;
+    }
+
+    @Override
+    public void configurePathMatch(PathMatchConfigurer configurer) {
+        configurer.setUseSuffixPatternMatch(false).setUseTrailingSlashMatch(false);
+    }
+
+    @Override
+    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
+
+    }
+
+    @Override
+    public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
+
+    }
+
+    @Override
+    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
+
+    }
+
+    @Override
+    public void addFormatters(FormatterRegistry registry) {
+
+    }
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(authenticationInterceptor())
+                .addPathPatterns("/api/**");
+    }
+
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+
+    }
+
+    @Bean
+    public AuthenticationInterceptor authenticationInterceptor() {
+        return new AuthenticationInterceptor();
+    }
+}

+ 187 - 0
src/main/java/com/nju/edu/pay/controller/api/AlipayController.java

@@ -0,0 +1,187 @@
+package com.nju.edu.pay.controller.api;
+
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.domain.AlipayTradePagePayModel;
+import com.alipay.api.domain.AlipayTradeRefundModel;
+import com.alipay.api.request.AlipayTradePagePayRequest;
+import com.alipay.api.request.AlipayTradeRefundRequest;
+import com.alipay.api.response.AlipayTradePagePayResponse;
+import com.alipay.api.response.AlipayTradeRefundResponse;
+import com.nju.edu.pay.configuration.AlipayProperties;
+import com.nju.edu.pay.controller.dto.PayModelDTO;
+import com.nju.edu.pay.data.entity.Order;
+import com.nju.edu.pay.data.entity.Trade;
+import com.nju.edu.pay.service.AlipayService;
+import com.nju.edu.pay.service.OrderService;
+import com.nju.edu.pay.service.TradeService;
+import com.nju.edu.pay.util.enums.OrderStatus;
+import com.nju.edu.pay.web.response.ErrorResponse;
+import com.nju.edu.pay.web.response.Response;
+import com.nju.edu.pay.web.response.SuccessResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.Map;
+
+@Slf4j
+@RestController
+@RequestMapping("/pay/alipay")
+public class AlipayController {
+
+    private final AlipayProperties alipayProperties;
+    private final AlipayService alipayService;
+    private final OrderService orderService;
+    private final TradeService tradeService;
+
+    @Autowired
+    public AlipayController(AlipayProperties alipayProperties, AlipayService alipayService, OrderService orderService, TradeService tradeService) {
+        this.alipayProperties = alipayProperties;
+        this.alipayService = alipayService;
+        this.orderService = orderService;
+        this.tradeService = tradeService;
+    }
+
+    @PostMapping("/pay")
+    public Response pay(@RequestBody PayModelDTO payModelDTO) throws AlipayApiException, IOException {
+        Order order=orderService.createOrder(payModelDTO.getUserId(),payModelDTO.getProductId(),payModelDTO.getPlatformType(),payModelDTO.getPrice());
+        if (order==null)
+            return new ErrorResponse(500,"订单创建失败");
+        // 订单模型
+        String productCode = "FAST_INSTANT_TRADE_PAY";
+        AlipayTradePagePayModel model = new AlipayTradePagePayModel();
+        model.setOutTradeNo(order.getOutTradeNo().toString());
+        model.setSubject(payModelDTO.getSubject());
+        model.setTotalAmount(String.valueOf(order.getPrice()));
+        model.setBody(payModelDTO.getSubject()+", 共"+payModelDTO.getPrice()+"元");
+        model.setProductCode(productCode);
+
+        AlipayTradePagePayRequest pagePayRequest =new AlipayTradePagePayRequest();
+        pagePayRequest.setReturnUrl(payModelDTO.getReturnUrl());
+        pagePayRequest.setNotifyUrl(alipayProperties.getNotifyUrl());
+        pagePayRequest.setBizModel(model);
+
+        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);
+        if (alipayTradePagePayResponse.isSuccess()){
+            return new SuccessResponse(alipayTradePagePayResponse.getBody());
+        }else {
+            order.setStatus(OrderStatus.FAILED);
+            orderService.updateOrder(order);
+            return new ErrorResponse(500,"调用支付失败");
+        }
+    }
+
+    @RequestMapping("/notify")
+    public String notify(HttpServletRequest request) throws AlipayApiException, UnsupportedEncodingException {
+        // 一定要验签,防止黑客篡改参数
+        Map<String, String[]> parameterMap = request.getParameterMap();
+        StringBuilder notifyBuild = new StringBuilder("/****************************** alipay notify ******************************/\n");
+        parameterMap.forEach((key, value) -> notifyBuild.append(key + "=" + value[0] + "\n") );
+        log.info(notifyBuild.toString());
+
+        boolean flag = alipayService.verifySign(request);
+        if (flag) {
+            /**
+             * 需要严格按照如下描述校验通知数据的正确性
+             *
+             * 商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
+             * 并判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
+             * 同时需要校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email),
+             *
+             * 上述有任何一个验证不通过,则表明本次通知是异常通知,务必忽略。
+             * 在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。
+             * 在支付宝的业务通知中,只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。
+             */
+
+            //交易状态
+            String tradeStatus = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");
+            // 商户订单号
+            String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
+            //支付宝交易号
+            String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
+            //付款金额
+            String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8");
+            //商户ID
+            String seller_id = new String(request.getParameter("seller_id").getBytes("ISO-8859-1"),"UTF-8");
+
+            Order order=orderService.retrieveOrder(Integer.parseInt(out_trade_no));
+            if (order==null)
+                return "failed";
+
+            if (order.getPrice() == Double.parseDouble(total_amount)&& alipayProperties.getSellerId().equals(seller_id)) {
+                tradeService.createTrade(Integer.parseInt(out_trade_no), Integer.parseInt(trade_no));
+            }
+
+            if (tradeStatus.equals("TRADE_SUCCESS")||tradeStatus.equals("TRADE_FINISHED") ){
+
+                System.out.println("notify trade success called");
+                order.setStatus(OrderStatus.SUCCESS);
+                orderService.updateOrder(order);
+                return "success";
+            }else {
+                order.setStatus(OrderStatus.FAILED);
+                orderService.updateOrder(order);
+            }
+        }
+
+        return "fail";
+    }
+
+    @RequestMapping("/return")
+    public String returnUrl(HttpServletRequest request) throws UnsupportedEncodingException {
+
+        boolean verifyResult = alipayService.verifySign(request);
+        if(verifyResult){
+            //验证成功
+            //请在这里加上商户的业务逻辑程序代码,如保存支付宝交易号
+            //商户订单号
+            String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
+            //支付宝交易号
+            String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
+
+            System.out.println("returnUrl called");
+            return "PaySuccess";
+
+        }else{
+            return "PayFail";
+
+        }
+    }
+
+    @PostMapping("/refund/{outTradeNo}")
+    public Response refund(@PathVariable Integer outTradeNo) throws AlipayApiException {
+        AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();
+
+        Order order=orderService.retrieveOrder(outTradeNo);
+        Trade trade=tradeService.retrieveTrade(outTradeNo);
+        AlipayTradeRefundModel model=new AlipayTradeRefundModel();
+        // 商户订单号
+        model.setOutTradeNo(outTradeNo.toString());
+        //支付宝订单号
+        model.setTradeNo(String.valueOf(trade.getTradeNo()));
+        // 退款金额
+        model.setRefundAmount(String.valueOf(order.getPrice()));
+        // 退款原因
+        model.setRefundReason("无理由退款");
+        // 退款订单号(同一个订单可以分多次部分退款,当分多次时必传)
+//        model.setOutRequestNo(UUID.randomUUID().toString());
+        alipayRequest.setBizModel(model);
+
+        AlipayClient alipayClient=new DefaultAlipayClient(alipayProperties.getGatewayUrl(),alipayProperties.getAppid(),alipayProperties.getAppPrivateKey(),alipayProperties.getFormate(),alipayProperties.getCharset(),alipayProperties.getAlipayPublicKey(),alipayProperties.getSignType());
+        AlipayTradeRefundResponse alipayResponse = alipayClient.execute(alipayRequest);
+        if (alipayResponse.isSuccess()) {
+            order.setStatus(OrderStatus.REFUND);
+            orderService.updateOrder(order);
+            return new SuccessResponse(alipayResponse.getBody());
+        }
+
+        return new ErrorResponse(500,"退款失败");
+    }
+}

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

@@ -0,0 +1,39 @@
+package com.nju.edu.pay.controller.api;
+
+import com.nju.edu.pay.configuration.RootProperties;
+import com.nju.edu.pay.controller.dto.LoginDTO;
+import com.nju.edu.pay.util.jwt.JWTUtil;
+import com.nju.edu.pay.web.response.ErrorResponse;
+import com.nju.edu.pay.web.response.Response;
+import com.nju.edu.pay.web.response.SuccessResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/auth")
+public class AuthController {
+
+    private final RootProperties rootProperties;
+    private final JWTUtil jwtUtil;
+
+    @Autowired
+    public AuthController(RootProperties rootProperties, JWTUtil jwtUtil) {
+        this.rootProperties = rootProperties;
+        this.jwtUtil = jwtUtil;
+    }
+
+    @PostMapping("/login")
+    public Response login(@RequestBody LoginDTO loginDTO){
+        String phone= loginDTO.getPhone();
+        String password=loginDTO.getPassword();
+        if (phone.equals(rootProperties.getPhone())&& password.equals(rootProperties.getPassword())){
+            return new SuccessResponse(jwtUtil.createToken(rootProperties.getName()));
+        }else {
+            return new ErrorResponse(500,"登录失败");
+        }
+
+    }
+}

+ 25 - 0
src/main/java/com/nju/edu/pay/controller/api/HelloWorldController.java

@@ -0,0 +1,25 @@
+package com.nju.edu.pay.controller.api;
+
+import com.nju.edu.pay.web.response.Response;
+import com.nju.edu.pay.web.response.SuccessResponse;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/index")
+public class HelloWorldController {
+
+    @PostMapping("/hello")
+    public Response hello(@RequestBody Msg msg){
+        return new SuccessResponse(msg);
+    }
+
+    @Data
+    @AllArgsConstructor
+    @NoArgsConstructor
+    public static class Msg{
+        private String msg;
+    }
+}

+ 30 - 0
src/main/java/com/nju/edu/pay/controller/api/OrderController.java

@@ -0,0 +1,30 @@
+package com.nju.edu.pay.controller.api;
+
+import com.nju.edu.pay.controller.dto.CheckOrderDTO;
+import com.nju.edu.pay.service.OrderService;
+import com.nju.edu.pay.web.response.ErrorResponse;
+import com.nju.edu.pay.web.response.Response;
+import com.nju.edu.pay.web.response.SuccessResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/api/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())){
+            return new SuccessResponse("success");
+        }else
+            return new ErrorResponse(500,"failed");
+    }
+
+    @GetMapping("/orderList")
+    public Response getOrderList(){
+        return new SuccessResponse(orderService.retrieveAll());
+    }
+}

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

@@ -0,0 +1,4 @@
+package com.nju.edu.pay.controller.api;
+
+public class TradeController {
+}

+ 15 - 0
src/main/java/com/nju/edu/pay/controller/dto/CheckOrderDTO.java

@@ -0,0 +1,15 @@
+package com.nju.edu.pay.controller.dto;
+
+import com.nju.edu.pay.util.enums.PlatformType;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class CheckOrderDTO {
+    private int userId;
+    private int productId;
+    private PlatformType platformType;
+}

+ 13 - 0
src/main/java/com/nju/edu/pay/controller/dto/LoginDTO.java

@@ -0,0 +1,13 @@
+package com.nju.edu.pay.controller.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class LoginDTO {
+    private String phone;
+    private String password;
+}

+ 18 - 0
src/main/java/com/nju/edu/pay/controller/dto/PayModelDTO.java

@@ -0,0 +1,18 @@
+package com.nju.edu.pay.controller.dto;
+
+import com.nju.edu.pay.util.enums.PlatformType;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class PayModelDTO {
+    private int userId;
+    private int productId;
+    private String subject;
+    private PlatformType platformType;
+    private double price;
+    private String returnUrl;
+}

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

@@ -0,0 +1,11 @@
+package com.nju.edu.pay.data.dao;
+
+import com.nju.edu.pay.data.entity.Order;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Repository;
+
+@Component
+public interface OrderRepository extends JpaRepository<Order,Integer> {
+    public Order findByOutTradeNo(int outTradeNo);
+}

+ 11 - 0
src/main/java/com/nju/edu/pay/data/dao/TradeRepository.java

@@ -0,0 +1,11 @@
+package com.nju.edu.pay.data.dao;
+
+import com.nju.edu.pay.data.entity.Trade;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Repository;
+
+@Component
+public interface TradeRepository extends JpaRepository<Trade,Integer> {
+    public Trade findByOutOrderNo(Integer outOrderNo);
+}

+ 62 - 0
src/main/java/com/nju/edu/pay/data/entity/Order.java

@@ -0,0 +1,62 @@
+package com.nju.edu.pay.data.entity;
+
+import com.nju.edu.pay.util.enums.OrderStatus;
+import com.nju.edu.pay.util.enums.PlatformType;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.*;
+import java.time.LocalDateTime;
+
+/**
+ * 订单
+ */
+@Entity
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(name = "ENTITY_ORDER")
+@EntityListeners(AuditingEntityListener.class)
+public class Order {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "out_trade_no")
+    private Integer outTradeNo;
+
+    @Basic
+    @Column(name = "price", nullable = false)
+    private double price;
+
+    @Enumerated(value = EnumType.STRING)
+    @Column(name = "platform_type", columnDefinition = "VARCHAR(255) NOT NULL DEFAULT 'SEEC-I'")
+    private PlatformType platformType = PlatformType.SEEC_I;
+
+    @Basic
+    @Column(name = "user_id", nullable = false)
+    private Integer userId;
+
+    @Basic
+    @Column(name = "product_id", nullable = false)
+    private Integer productId;
+
+    @Enumerated(value = EnumType.STRING)
+    @Column(name = "order_status", columnDefinition = "VARCHAR(255) NOT NULL DEFAULT 'PROCESSING'")
+    private OrderStatus status;
+
+    @Basic
+    @Column(name = "date", nullable = false)
+    @CreatedDate
+    private LocalDateTime date;
+
+    public Order(double price, PlatformType platformType, Integer userId, Integer productId, OrderStatus status, LocalDateTime date) {
+        this.price = price;
+        this.platformType = platformType;
+        this.userId = userId;
+        this.productId = productId;
+        this.status = status;
+        this.date = date;
+    }
+}

+ 29 - 0
src/main/java/com/nju/edu/pay/data/entity/Trade.java

@@ -0,0 +1,29 @@
+package com.nju.edu.pay.data.entity;
+
+import lombok.Data;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.*;
+
+/**
+ * 支付宝交易内容
+ */
+@Data
+@Entity
+@Table(name = "ENTITY_TRADE")
+@EntityListeners(AuditingEntityListener.class)
+public class Trade {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private Integer tradeId;
+
+    @Basic
+    @Column(name = "out_order_no",nullable = false)
+    private Integer outOrderNo;
+
+    @Basic
+    @Column(name = "trade_no",nullable = false)
+    private int tradeNo;
+}

+ 12 - 0
src/main/java/com/nju/edu/pay/service/AlipayService.java

@@ -0,0 +1,12 @@
+package com.nju.edu.pay.service;
+
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+public interface AlipayService {
+
+    public boolean verifySign(HttpServletRequest request);
+
+
+}

+ 19 - 0
src/main/java/com/nju/edu/pay/service/OrderService.java

@@ -0,0 +1,19 @@
+package com.nju.edu.pay.service;
+
+import com.nju.edu.pay.data.entity.Order;
+import com.nju.edu.pay.util.enums.PlatformType;
+
+import java.util.List;
+
+public interface OrderService {
+
+    public Order createOrder(int userId, int productId, PlatformType platformType, double price);
+
+    public boolean hasOrder(int userId, int productId, PlatformType platformType);
+
+    public Order retrieveOrder(int outTradeNo);
+
+    public Order updateOrder(Order order);
+
+    public List<Order> retrieveAll();
+}

+ 14 - 0
src/main/java/com/nju/edu/pay/service/TradeService.java

@@ -0,0 +1,14 @@
+package com.nju.edu.pay.service;
+
+import com.nju.edu.pay.data.entity.Trade;
+
+import java.util.List;
+
+public interface TradeService {
+
+    public Trade createTrade(int outTradeNo, int tradeNo);
+
+    public Trade retrieveTrade(int outTradeNo);
+
+    public List<Trade> retrieveAll();
+}

+ 50 - 0
src/main/java/com/nju/edu/pay/service/impl/AlipayServiceImpl.java

@@ -0,0 +1,50 @@
+package com.nju.edu.pay.service.impl;
+
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.internal.util.AlipaySignature;
+import com.nju.edu.pay.configuration.AlipayProperties;
+import com.nju.edu.pay.service.AlipayService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+@Component
+@Slf4j
+public class AlipayServiceImpl  implements AlipayService {
+    @Autowired
+    AlipayProperties alipayProperties;
+
+    @Override
+    public boolean verifySign(HttpServletRequest request) {
+        // 获取支付宝POST过来反馈信息
+        Map<String,String> params = new HashMap<>();
+        Map requestParams = request.getParameterMap();
+        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
+            String name = (String) iter.next();
+            String[] values = (String[]) requestParams.get(name);
+            String valueStr = "";
+            for (int i = 0; i < values.length; i++) {
+                valueStr = (i == values.length - 1) ? valueStr + values[i]
+                        : valueStr + values[i] + ",";
+            }
+            params.put(name, valueStr);
+        }
+
+        try {
+            boolean verifyResult = AlipaySignature.rsaCheckV1(params,
+                    alipayProperties.getAlipayPublicKey(),
+                    alipayProperties.getCharset(),
+                    alipayProperties.getSignType());
+
+            return verifyResult;
+        } catch (AlipayApiException e) {
+            log.debug("verify sign error, exception is:{}", e);
+            return false;
+        }
+    }
+}

+ 48 - 0
src/main/java/com/nju/edu/pay/service/impl/OrderServiceImpl.java

@@ -0,0 +1,48 @@
+package com.nju.edu.pay.service.impl;
+
+import com.nju.edu.pay.data.dao.OrderRepository;
+import com.nju.edu.pay.data.entity.Order;
+import com.nju.edu.pay.service.OrderService;
+import com.nju.edu.pay.util.enums.OrderStatus;
+import com.nju.edu.pay.util.enums.PlatformType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Component
+public class OrderServiceImpl implements OrderService {
+
+    @Autowired
+    private OrderRepository orderRepository;
+
+    @Override
+    public Order createOrder(int userId, int productId, PlatformType platformType, double price) {
+        Order order=new Order(price,platformType,userId,productId, OrderStatus.PROCESSING, LocalDateTime.now());
+        Order newOrder=orderRepository.saveAndFlush(order);
+        return newOrder;
+    }
+
+    @Override
+    public boolean hasOrder(int userId, int productId, PlatformType platformType) {
+        return false;
+    }
+
+    @Override
+    public Order retrieveOrder(int outTradeNo) {
+        return orderRepository.findByOutTradeNo(outTradeNo);
+    }
+
+    @Override
+    public Order updateOrder(Order order) {
+        return orderRepository.saveAndFlush(order);
+    }
+
+    @Override
+    public List<Order> retrieveAll() {
+        return orderRepository.findAll();
+    }
+
+
+}

+ 34 - 0
src/main/java/com/nju/edu/pay/service/impl/TradeServiceImpl.java

@@ -0,0 +1,34 @@
+package com.nju.edu.pay.service.impl;
+
+import com.nju.edu.pay.data.dao.TradeRepository;
+import com.nju.edu.pay.data.entity.Trade;
+import com.nju.edu.pay.service.TradeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+public class TradeServiceImpl implements TradeService {
+
+    @Autowired
+    TradeRepository tradeRepository;
+
+    @Override
+    public Trade createTrade(int outTradeNo, int tradeNo) {
+        Trade trade=new Trade();
+        trade.setTradeNo(tradeNo);
+        trade.setOutOrderNo(outTradeNo);
+        return tradeRepository.saveAndFlush(trade);
+    }
+
+    @Override
+    public Trade retrieveTrade(int outTradeNo) {
+        return tradeRepository.findByOutOrderNo(outTradeNo);
+    }
+
+    @Override
+    public List<Trade> retrieveAll() {
+        return tradeRepository.findAll();
+    }
+}

+ 8 - 0
src/main/java/com/nju/edu/pay/util/enums/OrderStatus.java

@@ -0,0 +1,8 @@
+package com.nju.edu.pay.util.enums;
+
+public enum OrderStatus {
+    SUCCESS,
+    FAILED,
+    PROCESSING,
+    REFUND
+}

+ 34 - 0
src/main/java/com/nju/edu/pay/util/enums/PlatformType.java

@@ -0,0 +1,34 @@
+package com.nju.edu.pay.util.enums;
+
+public enum PlatformType {
+    /**
+     * 软工一SEEC-I
+     */
+    SEEC_I("SEEC-I"),
+    /**
+     * 软工二SEEC-II
+     */
+    SEEC_II("SEEC-II"),
+    /**
+     * 门户系统
+     */
+    PORTAL("Portal"),
+    /**
+     * Helper
+     */
+    HELPER("Helper");
+
+    private String description;
+
+    PlatformType(String description){
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+}

+ 8 - 0
src/main/java/com/nju/edu/pay/util/jwt/JWTUtil.java

@@ -0,0 +1,8 @@
+package com.nju.edu.pay.util.jwt;
+
+public interface JWTUtil {
+
+    public String createToken(String name);
+
+    public boolean verifyToken(String token);
+}

+ 25 - 0
src/main/java/com/nju/edu/pay/util/jwt/JWTUtilImpl.java

@@ -0,0 +1,25 @@
+package com.nju.edu.pay.util.jwt;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.exceptions.JWTVerificationException;
+import org.springframework.stereotype.Component;
+
+@Component
+public class JWTUtilImpl implements JWTUtil {
+    @Override
+    public String createToken(String name) {
+        return JWT.create().withAudience(name).sign(Algorithm.HMAC256("SEEC-1919810-OIDC-114514"));
+    }
+
+    @Override
+    public boolean verifyToken(String token) {
+        try {
+            JWT.require(Algorithm.HMAC256("SEEC-1919810-OIDC-114514")).build().verify(token);
+        }catch (JWTVerificationException e) {
+            return false;
+        }
+
+        return true;
+    }
+}

+ 42 - 0
src/main/java/com/nju/edu/pay/web/AuthenticationInterceptor.java

@@ -0,0 +1,42 @@
+package com.nju.edu.pay.web;
+
+import com.nju.edu.pay.util.jwt.JWTUtil;
+import com.nju.edu.pay.web.annotation.RootAllowed;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.lang.reflect.Method;
+
+
+public class AuthenticationInterceptor implements HandlerInterceptor {
+
+    @Autowired
+    JWTUtil jwtUtil;
+
+    @Override
+    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {
+        HandlerMethod handlerMethod=(HandlerMethod)object;
+        Method method=handlerMethod.getMethod();
+        if (method.isAnnotationPresent(RootAllowed.class)) {
+            RootAllowed passToken = method.getAnnotation(RootAllowed.class);
+            if (passToken.required()) {
+                String token=httpServletRequest.getHeader("Authorization");
+                return jwtUtil.verifyToken(token);
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
+
+    }
+    @Override
+    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
+
+    }
+}

+ 12 - 0
src/main/java/com/nju/edu/pay/web/annotation/RootAllowed.java

@@ -0,0 +1,12 @@
+package com.nju.edu.pay.web.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface RootAllowed {
+    boolean required() default true;
+}

+ 18 - 0
src/main/java/com/nju/edu/pay/web/response/ErrorResponse.java

@@ -0,0 +1,18 @@
+package com.nju.edu.pay.web.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ErrorResponse implements Response{
+    private int error;
+    private String message;
+
+    @Override
+    public int getError() {
+        return 0;
+    }
+}

+ 6 - 0
src/main/java/com/nju/edu/pay/web/response/Response.java

@@ -0,0 +1,6 @@
+package com.nju.edu.pay.web.response;
+
+@FunctionalInterface
+public interface Response {
+    int getError();
+}

+ 26 - 0
src/main/java/com/nju/edu/pay/web/response/SuccessResponse.java

@@ -0,0 +1,26 @@
+package com.nju.edu.pay.web.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class SuccessResponse implements Response {
+    @JsonProperty("err")
+    private int error;
+
+    @JsonProperty("res")
+    private Object response;
+
+    public SuccessResponse(Object response){
+        this.error=200;
+        this.response=response;
+    }
+    @Override
+    public int getError() {
+        return 0;
+    }
+}

+ 32 - 0
src/main/resources/application.yml

@@ -0,0 +1,32 @@
+server:
+  port: 8080
+
+pay:
+  alipay:
+    gatewayUrl: https://openapi.alipaydev.com/gateway.do
+    appid: 2016101800715899
+    appPrivateKey: MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCHdc0RXQmtoCz0PIvjS84ReVM2QmUTeuJFJQ5y+TDFJaG2eeu+4TpgwzzQ8D4eADaeP2NwoszHJ4cAerkg/Rj5zGqnwP9cLArsHQyP/fTMGFw5rVsli8wyWiUvWnX7j0yIrb58pa/SuULcd9ixC1nT4cDkElJJYNoLn7J0lXUXgzJMRe265wqAxC/F3haThWHOCBjzU2JQJ78jln1ysvZa7pFv+SiWk2uA2TujlnaHHJTrRcdgw7LOqdhF1WluT13Tjqa8CUFkndUCRk68pzWk650/4aRaH1Wj5RDQzmHuiovMvdKXUr3XxDISnDnydoFmk0GXuyc8QJ0QlDmZtW3lAgMBAAECggEAM3fx++fy1nKmwgIDUNCrsn37vQELMJSfRpBm5g6CllXPFOtMRJGFQeDMycKOh42jMwt4uAJTdlQxemAm2T7xb3BZEfZF0Hq3h7Ed5dQjYCzdVdjlaeWtJ3CS8mQXsgZnmQMS/n9hx9o2alhrEBH1BomfZckEVPckwgfioWNsQws7lGG3mKDqZLvqZvUv0xUVqrriILYbMbzTaqFUk0gqzYG5OaqNPiuZ/AkTGl8e+Nr3ZwE8LUodcxsAry6nAzwZqPS1BMhjQ0PmuboHPnacxR0vUctDyO35fVgTlaJmbCi/5RvsYxH1xjy8yg01U5QtiO5BWsG0cF7dvmOFfMOcgQKBgQDGaFxwB2M5XADx4Mr17x8Z7BDiveDmHemFyCEa9YUIB+qpARulvvO0gSBZKnZQFD+74ChBw6r2DhPkYP2+Tx3sbrUvCaOcaqbsZ0pdfpHpRTTzf50eTCj0ZZdl8LY4ET2auNwq7lpKAdq9i0qqd2TkWwc1ywbgc7I/AYMJLpesxQKBgQCux9J2Y1nXMTg+wnv+NZWtbVsuz5K/OmU83lrriOwx+YbLYDJuQ14KQX9iGoUqONGEDZYfgrFYzQqUSqtgi/Y/aJZ/0Edl6wkDVs4UlSGnQhhjF4jdJpZSpto3QE0rmJ0EgnkTDWt24w5Chn8ElIoKYR2WUmI5YGjM7web2VMOoQKBgQCVcTfm/fmD08O2bD4TfffsG34geyqxyWgCZ1pgJvv7r5LVl0sOzcRcekI2RyB0crwKs+0+k7XqvXHIPDIDrS35zu1Tr6v3ffGa8LX3tAUNMh6PJdjfYDgc1YRyuRtXIc1IA+N5xqxlP/5VdFxaB7ILunC02OamGx7wDCB5wwlljQKBgQCtN76etDIasl4S3P6z3vlbarDewLuoJ8CjxZ8IJagokysDLnBslPmDYoxTdwMY6DzFCg4JZqZK4tMkSqh0Q+Ilz4qwW4QXPwussoAFKBO1Ry0SMAXlX1PF0DUeYuzYUyTyjjheKIOjzL2aMt95c5knVj5Td4x/Xsweppq823KUYQKBgQCCsLOdE6LNE6hyQ6thbECXrfaA4lra6PuFKg2np+Sjf1DiYqhrI0fJkSIRzRosNJVUAQl2EujVawRgV3unTJIPn3x5dTWF+hEl5T9ZgRt0esrQ9ttRBf4gbqbwm0jcUqFaElwF3bjQgA1aHx56RSnfVatjgnZmDlzkG4bohtIGFg==
+    alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1q80QLBdFndav1L4ZAR4dUcKs4MaDZrFGhe3sjrmHQmpWj0CuCgOjQUts4+CI3UKcwoGDK1Nij72Ao+uXqyawbPASu/GaiCBRrjNm9fntv0xxOEZfqoj4Bs0N9d6fp8uldtDgdQuyM4fh+uf/3nJXnA0AiWDLuorVA89nD9cXP9rwsEXt150ShDDRepn7C54U5llgEF51ezLBLhwWtXcBz9OGqKEESvOXhhDyVwk0M4a8MWtIpwub2Yv/It7W/gUYP6yy0x3cUOXDKvBoNLiiuYnSYG7LfwnE5WNNdDg6cIU5vB8+mxYgPCfrcy+ModyfKAfwWcFUQriKwUsgbic6QIDAQAB
+    notifyUrl: http://pay.seec.seecoder.cn/alipay/notify
+    sellerId: 2088102180140519
+
+spring:
+  datasource:
+    url: jdbc:mysql://localhost:3306/pay?useUnicode=true&characterEncoding=UTF-8&useSSL=false
+    username: root
+    password: 123456
+#    url: jdbc:mysql://mooc.seecoder.cn/seecoder?useUnicode=true&characterEncoding=UTF-8&useSSL=false
+#    username: root
+#    password: NJU67mysql
+  jpa:
+    database-platform: org.hibernate.dialect.MySQL57InnoDBDialect
+    hibernate:
+      naming:
+        physical-strategy:  org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
+
+root:
+  name: root
+  password: SEEC2020
+  phone: 17301585267
+
+

+ 31 - 0
src/test/com/nju/edu/pay/TestCase.java

@@ -0,0 +1,31 @@
+package com.nju.edu.pay;
+
+import com.nju.edu.pay.data.dao.OrderRepository;
+import com.nju.edu.pay.data.entity.Order;
+import com.nju.edu.pay.service.OrderService;
+import com.nju.edu.pay.util.enums.OrderStatus;
+import com.nju.edu.pay.util.enums.PlatformType;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.time.LocalDateTime;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class TestCase {
+
+    @Autowired
+    private OrderRepository orderRepository;
+
+    @Autowired
+    private OrderService orderService;
+
+    @Test
+    public void test(){
+        Order order=orderService.createOrder(1,1,PlatformType.SEEC_II,0.01);
+        System.out.println(order.getOutTradeNo());
+    }
+}