فهرست منبع

feat:“添加支付宝直连支付“

soobin 1 سال پیش
والد
کامیت
18250c3f60

+ 328 - 322
pom.xml

@@ -1,342 +1,348 @@
 <?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>
+         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.szwl</groupId>
-	<artifactId>payServer</artifactId>
-	<version>0.0.1</version>
-	<packaging>jar</packaging>
+    <groupId>com.szwl</groupId>
+    <artifactId>payServer</artifactId>
+    <version>0.0.1</version>
+    <packaging>jar</packaging>
 
-	<name>payServer</name>
+    <name>payServer</name>
 
-	<parent>
-		<groupId>org.springframework.boot</groupId>
-		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>2.3.12.RELEASE</version>
-	</parent>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.3.12.RELEASE</version>
+    </parent>
 
 
-	<properties>
-		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-		<java.version>1.8</java.version>
-		<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
-<!--		<mybatis-spring-boot-starter.version>2.2.0</mybatis-spring-boot-starter.version>-->
-		<mybatis-plus.version>3.4.0</mybatis-plus.version>
-		<mybatis.version>3.5.7</mybatis.version>
-	</properties>
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+        <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
+        <!--		<mybatis-spring-boot-starter.version>2.2.0</mybatis-spring-boot-starter.version>-->
+        <mybatis-plus.version>3.4.0</mybatis-plus.version>
+        <mybatis.version>3.5.7</mybatis.version>
+    </properties>
 
-	<dependencyManagement>
-		<dependencies>
-			<dependency>
-				<groupId>org.springframework.cloud</groupId>
-				<artifactId>spring-cloud-dependencies</artifactId>
-				<version>${spring-cloud.version}</version>
-				<type>pom</type>
-				<scope>import</scope>
-			</dependency>
-			<dependency>
-				<groupId>org.mybatis</groupId>
-				<artifactId>mybatis</artifactId>
-				<version>${mybatis.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>com.baomidou</groupId>
-				<artifactId>mybatis-plus-boot-starter</artifactId>
-				<version>${mybatis-plus.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>com.baomidou</groupId>
-				<artifactId>mybatis-plus-generator</artifactId>
-				<version>${mybatis-plus.version}</version>
-			</dependency>
-<!--			<dependency>-->
-<!--				<groupId>org.mybatis.spring.boot</groupId>-->
-<!--				<artifactId>mybatis-spring-boot-starter</artifactId>-->
-<!--				<version>${mybatis-spring-boot-starter.version}</version>-->
-<!--			</dependency>-->
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.mybatis</groupId>
+                <artifactId>mybatis</artifactId>
+                <version>${mybatis.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-boot-starter</artifactId>
+                <version>${mybatis-plus.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-generator</artifactId>
+                <version>${mybatis-plus.version}</version>
+            </dependency>
+            <!--			<dependency>-->
+            <!--				<groupId>org.mybatis.spring.boot</groupId>-->
+            <!--				<artifactId>mybatis-spring-boot-starter</artifactId>-->
+            <!--				<version>${mybatis-spring-boot-starter.version}</version>-->
+            <!--			</dependency>-->
 
-		</dependencies>
-	</dependencyManagement>
+        </dependencies>
+    </dependencyManagement>
 
-	<dependencies>
-		<!--访问静态资源-->
-<!--		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-thymeleaf</artifactId>
-			<version>3.0.1</version>
-		</dependency>-->
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-thymeleaf</artifactId>
-		</dependency>
-		<!-- springcloud组件 start -->
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-web</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.cloud</groupId>
-			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.cloud</groupId>
-			<artifactId>spring-cloud-starter-openfeign</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.cloud</groupId>
-			<artifactId>spring-cloud-starter-config</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-actuator</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-jdbc</artifactId>-->
-<!--		</dependency>-->
-		<!-- springcloud组件 end -->
-		<dependency>
-			<groupId>org.projectlombok</groupId>
-			<artifactId>lombok</artifactId>
-		</dependency>
+    <dependencies>
+        <!--访问静态资源-->
+        <!--		<dependency>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-thymeleaf</artifactId>
+                    <version>3.0.1</version>
+                </dependency>-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-thymeleaf</artifactId>
+        </dependency>
+        <!-- springcloud组件 start -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</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-jdbc</artifactId>-->
+        <!--		</dependency>-->
+        <!-- springcloud组件 end -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
 
-		<!-- mybatis-plus -->
-		<dependency>
-			<groupId>com.baomidou</groupId>
-			<artifactId>mybatis-plus-boot-starter</artifactId>
-		</dependency>
-		<!--mybatisplus代码生成 start -->
-		<dependency>
-			<groupId>com.baomidou</groupId>
-			<artifactId>mybatis-plus-generator</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.velocity</groupId>
-			<artifactId>velocity-engine-core</artifactId>
-			<version>2.2</version>
-		</dependency>
-		<!--mybatisplus代码生成 end -->
-		<dependency>
-			<groupId>mysql</groupId>
-			<artifactId>mysql-connector-java</artifactId>
-		</dependency>
-		<!-- swagger2 -->
-		<dependency>
-			<groupId>com.github.xiaoymin</groupId>
-			<artifactId>knife4j-spring-boot-starter</artifactId>
-			<version>3.0.3</version>
-		</dependency>
-		<dependency>
-			<groupId>ch.ethz.ganymed</groupId>
-			<artifactId>ganymed-ssh2</artifactId>
-			<version>build210</version>
-		</dependency>
-		<!-- json -->
-		<dependency>
-			<groupId>com.alibaba</groupId>
-			<artifactId>fastjson</artifactId>
-			<version>1.2.75</version>
-		</dependency>
-		<!-- hutool -->
-		<dependency>
-			<groupId>cn.hutool</groupId>
-			<artifactId>hutool-core</artifactId>
-			<version>5.7.16</version>
-		</dependency>
-		<dependency>
-			<groupId>cn.hutool</groupId>
-			<artifactId>hutool-http</artifactId>
-			<version>5.7.16</version>
-		</dependency>
-		<!--生成二维码-->
-		<dependency>
-			<groupId>com.google.zxing</groupId>
-			<artifactId>core</artifactId>
-			<version>3.3.0</version>
-		</dependency>
-		<dependency>
-			<groupId>com.google.zxing</groupId>
-			<artifactId>javase</artifactId>
-			<version>3.3.0</version>
-		</dependency>
-		<dependency>
-			<groupId>commons-beanutils</groupId>
-			<artifactId>commons-beanutils</artifactId>
-			<version>1.8.3</version>
-		</dependency>
-		<dependency>
-			<groupId>org.hibernate</groupId>
-			<artifactId>hibernate-core</artifactId>
-			<version>3.6.10.Final</version>
-		</dependency>
-		<!-- 引入org.json所需依赖 -->
-		<dependency>
-			<groupId>org.json</groupId>
-			<artifactId>json</artifactId>
-			<version>20200518</version>
-		</dependency>
-		<dependency>
-			<groupId>commons-httpclient</groupId>
-			<artifactId>commons-httpclient</artifactId>
-			<version>3.1</version>
-		</dependency>
+        <!-- mybatis-plus -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+        </dependency>
+        <!--mybatisplus代码生成 start -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+            <version>2.2</version>
+        </dependency>
+        <!--mybatisplus代码生成 end -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <!-- swagger2 -->
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-spring-boot-starter</artifactId>
+            <version>3.0.3</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.ethz.ganymed</groupId>
+            <artifactId>ganymed-ssh2</artifactId>
+            <version>build210</version>
+        </dependency>
+        <!-- json -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.75</version>
+        </dependency>
+        <!-- hutool -->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-core</artifactId>
+            <version>5.7.16</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-http</artifactId>
+            <version>5.7.16</version>
+        </dependency>
+        <!--生成二维码-->
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <version>3.3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>javase</artifactId>
+            <version>3.3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>1.8.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-core</artifactId>
+            <version>3.6.10.Final</version>
+        </dependency>
+        <!-- 引入org.json所需依赖 -->
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>20200518</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-httpclient</groupId>
+            <artifactId>commons-httpclient</artifactId>
+            <version>3.1</version>
+        </dependency>
         <dependency>
             <groupId>log4j</groupId>
             <artifactId>log4j</artifactId>
             <version>1.2.16</version>
         </dependency>
-		<!--杉德支付-->
-		<dependency>
-			<groupId>cn.com.sand</groupId>
-			<artifactId>hmpay-sdk</artifactId>
-			<version>1.1.4</version>
-		</dependency>
-		<!--汇付支付-->
-		<dependency>
-			<groupId>com.huifu.bspay.sdk</groupId>
-			<artifactId>dg-java-sdk</artifactId>
-			<version>3.0.8</version>
-		</dependency>
-		<!--rabbitmq-->
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-amqp</artifactId>
-			<version>2.1.3.RELEASE</version>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.cloud</groupId>
-			<artifactId>spring-cloud-starter-bus-amqp</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.amqp</groupId>
-			<artifactId>spring-rabbit</artifactId>
-			<version>2.3.6</version>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.amqp</groupId>
-			<artifactId>spring-amqp</artifactId>
-			<version>2.3.6</version>
-		</dependency>
-		<dependency>
-			<groupId>cn.com.crbank.ommo</groupId>
-			<artifactId>EsBaseServer</artifactId>
-			<version>1.2.11</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.commons</groupId>
-			<artifactId>commons-collections4</artifactId>
-			<version>4.3</version>
-		</dependency>
-		<!-- 个推 -->
-		<dependency>
-			<groupId>com.gexin.platform</groupId>
-			<artifactId>gexin-rp-sdk-http</artifactId>
-			<version>4.0.1.9</version>
-		</dependency>
-		<!--elasticsearch-->
-		<dependency>
-			<groupId>org.elasticsearch</groupId>
-			<artifactId>elasticsearch</artifactId>
-			<version>7.6.2</version>
-		</dependency>
-		<dependency>
-			<groupId>org.elasticsearch.client</groupId>
-			<artifactId>elasticsearch-rest-high-level-client</artifactId>
-			<version>7.6.2</version>
-		</dependency>
-		<dependency>
-			<groupId>org.elasticsearch.client</groupId>
-			<artifactId>elasticsearch-rest-client</artifactId>
-			<version>7.6.2</version>
-		</dependency>
-		<dependency>
-			<groupId>com.google.code.gson</groupId>
-			<artifactId>gson</artifactId>
-			<version>2.9.1</version>
-		</dependency>
-		<dependency>
-			<groupId>com.squareup.okhttp3</groupId>
-			<artifactId>okhttp</artifactId>
-			<version>4.9.3</version>
-		</dependency>
-		<dependency>
-			<groupId>com.github.wechatpay-apiv3</groupId>
-			<artifactId>wechatpay-java</artifactId>
-			<version>0.2.7</version>
-		</dependency>
-		<!--微信支付SDK-->
-		<dependency>
-			<groupId>com.github.wechatpay-apiv3</groupId>
-			<artifactId>wechatpay-apache-httpclient</artifactId>
-			<version>0.3.0</version>
-		</dependency>
-	</dependencies>
+        <!--杉德支付-->
+        <dependency>
+            <groupId>cn.com.sand</groupId>
+            <artifactId>hmpay-sdk</artifactId>
+            <version>1.1.4</version>
+        </dependency>
+        <!--汇付支付-->
+        <dependency>
+            <groupId>com.huifu.bspay.sdk</groupId>
+            <artifactId>dg-java-sdk</artifactId>
+            <version>3.0.8</version>
+        </dependency>
+        <!--rabbitmq-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+            <version>2.1.3.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.amqp</groupId>
+            <artifactId>spring-rabbit</artifactId>
+            <version>2.3.6</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.amqp</groupId>
+            <artifactId>spring-amqp</artifactId>
+            <version>2.3.6</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.com.crbank.ommo</groupId>
+            <artifactId>EsBaseServer</artifactId>
+            <version>1.2.11</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>4.3</version>
+        </dependency>
+        <!-- 个推 -->
+        <dependency>
+            <groupId>com.gexin.platform</groupId>
+            <artifactId>gexin-rp-sdk-http</artifactId>
+            <version>4.0.1.9</version>
+        </dependency>
+        <!--elasticsearch-->
+        <dependency>
+            <groupId>org.elasticsearch</groupId>
+            <artifactId>elasticsearch</artifactId>
+            <version>7.6.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.elasticsearch.client</groupId>
+            <artifactId>elasticsearch-rest-high-level-client</artifactId>
+            <version>7.6.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.elasticsearch.client</groupId>
+            <artifactId>elasticsearch-rest-client</artifactId>
+            <version>7.6.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.9.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>4.9.3</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.wechatpay-apiv3</groupId>
+            <artifactId>wechatpay-java</artifactId>
+            <version>0.2.7</version>
+        </dependency>
+        <!--微信支付SDK-->
+        <dependency>
+            <groupId>com.github.wechatpay-apiv3</groupId>
+            <artifactId>wechatpay-apache-httpclient</artifactId>
+            <version>0.3.0</version>
+        </dependency>
+        <!-- 支付宝支付SDK -->
+        <dependency>
+            <groupId>com.alipay.sdk</groupId>
+            <artifactId>alipay-sdk-java</artifactId>
+            <version>4.34.0.ALL</version>
+        </dependency>
+    </dependencies>
 
-	<build>
-		<resources>
-			<resource>
-				<directory>src/main/java</directory>
-				<includes>
-					<include>**/*.xml</include>
-					<include>**/*.*</include>
-				</includes>
-				<!-- 是否替换资源中的属性 -->
-				<filtering>false</filtering>
-			</resource>
-			<resource>
-				<directory>src/main/resources</directory>
-				<includes>
-					<include>**/*.*</include>
-				</includes>
-				<!-- 是否替换资源中的属性 -->
-				<filtering>false</filtering>
-			</resource>
-		</resources>
-		<plugins>
-			<plugin>
-				<groupId>org.springframework.boot</groupId>
-				<artifactId>spring-boot-maven-plugin</artifactId>
-				<configuration>
-					<layout>ZIP</layout>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
-	<repositories>
-		<!--<repository>-->
-			<!--<id>nexus</id>-->
-			<!--<url>http://www.redouble.store:1888/repository/maven-public/</url>-->
-			<!--<releases>-->
-				<!--<enabled>true</enabled>-->
-			<!--</releases>-->
-			<!--<snapshots>-->
-				<!--<enabled>false</enabled>-->
-			<!--</snapshots>-->
-		<!--</repository>-->
-		<!-- 个推 -->
-		<repository>
-			<id>getui-nexus</id>
-			<url>http://mvn.gt.igexin.com/nexus/content/repositories/releases/</url>
-		</repository>
-		<repository>
-			<id>nexus</id>
-			<url>http://120.25.151.99:1888/repository/crbank-host/</url>
-			<releases>
-				<enabled>true</enabled>
-			</releases>
-			<snapshots>
-				<enabled>false</enabled>
-			</snapshots>
-		</repository>
-	</repositories>
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**/*.xml</include>
+                    <include>**/*.*</include>
+                </includes>
+                <!-- 是否替换资源中的属性 -->
+                <filtering>false</filtering>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/*.*</include>
+                </includes>
+                <!-- 是否替换资源中的属性 -->
+                <filtering>false</filtering>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <layout>ZIP</layout>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+    <repositories>
+        <!--<repository>-->
+        <!--<id>nexus</id>-->
+        <!--<url>http://www.redouble.store:1888/repository/maven-public/</url>-->
+        <!--<releases>-->
+        <!--<enabled>true</enabled>-->
+        <!--</releases>-->
+        <!--<snapshots>-->
+        <!--<enabled>false</enabled>-->
+        <!--</snapshots>-->
+        <!--</repository>-->
+        <!-- 个推 -->
+        <repository>
+            <id>getui-nexus</id>
+            <url>http://mvn.gt.igexin.com/nexus/content/repositories/releases/</url>
+        </repository>
+        <repository>
+            <id>nexus</id>
+            <url>http://120.25.151.99:1888/repository/crbank-host/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
 
 
 </project>

+ 3 - 0
src/main/java/com/szwl/constant/ConfigConsts.java

@@ -11,4 +11,7 @@ public class ConfigConsts {
      */
     public static final String AUTHORIZATION = "Authorization";
     public static final String INNER_FEIGN = "innerFeign";
+
+    public static final String WECHAT_NATIVE = "WEIXIN_NATIVE";
+    public static final String ALIPAY_NATIVE = "ALIPAY_NATIVE";
 }

+ 1 - 0
src/main/java/com/szwl/constant/JoinpayConstant.java

@@ -42,6 +42,7 @@ public class JoinpayConstant {
 //    public final static String Notify_Url = "http://pay.sunzee.com.cn:49013/tOrder/notify";
     public final static String Notify_Url = "https://sz.sunzee.com.cn/PAY-SERVER/tOrder/notify";
     public final static String WECHAT_NOTIFY_URL = "https://sz.sunzee.com.cn/PAY-SERVER/wechatPay/notify";
+    public final static String ALIPAY_NOTIFY_URL = "https://sz.sunzee.com.cn/PAY-SERVER/wechatPay/alipayNotify";
 //    public final static String Notify_Url = "http://szwltest.sunzee.com.cn:49002/PAY-SERVER/tOrder/notify";
 //    public final static String Notify_Url = "http://slb.sunzee.com.cn/api/order/notify.htm";
 

+ 16 - 410
src/main/java/com/szwl/controller/TWechatPayConfigController.java

@@ -24,10 +24,12 @@ import com.wechat.pay.java.service.refund.model.AmountReq;
 import com.wechat.pay.java.service.refund.model.CreateRequest;
 import com.wechat.pay.java.service.refund.model.Refund;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
@@ -46,6 +48,7 @@ import static com.wechat.pay.java.service.refund.model.Status.PROCESSING;
  * @author wuhs
  * @since 2024-03-07
  */
+@Slf4j
 @RestController
 @RequestMapping("/wechatPay")
 public class TWechatPayConfigController {
@@ -62,6 +65,9 @@ public class TWechatPayConfigController {
     @Autowired
     TWechatPayConfigService wechatPayConfigService;
 
+    @Resource
+    TAlipayConfigService alipayConfigService;
+
     @Autowired
     TEquipmentService equipmentService;
 
@@ -70,263 +76,9 @@ public class TWechatPayConfigController {
 
     @ApiOperation(value = "购物车 请求在线支付 ")
     @PostMapping("/carsPay")
-    public Object carsPay(String clientId, @RequestBody Map<String,String> productNameMap, HttpServletRequest request) {
-        JsonMessage jsonMessage = wechatPayConfigService.carsPay(clientId, productNameMap, request);
+    public Object carsPay(String clientId, @RequestBody Map<String,String> productNameMap, String frpCode, HttpServletRequest request) {
+        JsonMessage jsonMessage = wechatPayConfigService.carsPay(clientId, productNameMap, frpCode, request);
         return jsonMessage;
-//        if(productNameMap==null){
-//            return  JsonMessage.error("数据出错");
-//        }
-//        StringBuffer note = new StringBuffer();
-//        StringBuffer productName = new StringBuffer();
-//        String productNo = "";
-//        Map<String, Integer> productMap = new HashMap<>();
-//        Integer productNumber = 0;
-//
-//        TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(clientId));
-//        if(equipment==null||equipment.getId()==null){
-//            return JsonMessage.error("找不到设备");
-//        }
-//        BigDecimal price = new BigDecimal("0.00");
-//        TEquipmentDesc equipmentDesc = R.getDataIfSuccess(szwlFeign.findEquipmentById(equipment.getId()));
-//        if(equipmentDesc==null||equipmentDesc.getEquipmentId()==null||equipmentDesc.getPayType()==null||equipmentDesc.getPayType().equals("0")){
-//            for (String key : productNameMap.keySet()) {
-//                String entryValue = String.valueOf(productNameMap.get(key));
-//                List<String> value = JSON.parseArray(entryValue, String.class);
-//                List<TPromoCode> promoCodeList = new ArrayList<>();
-//                //1,校验优惠码
-//                if(value.size()>0){
-//                    for(String code:value){
-//                        if(!code.equals("0")){
-//                            TPromoCode promoCode = new TPromoCode();
-//                            ResponseModel<TPromoCode> tPromoCodeResponseModel = szwlFeign.selectTPromoCode(code, equipment.getAdminId().toString());
-//                            TPromoCode tPromoCode = tPromoCodeResponseModel.getData();
-//                            promoCode = tPromoCode;
-//                            if (tPromoCode == null||tPromoCode.getId()==null) {
-//                                //不存在
-//                                return JsonMessage.success("1");
-//                            }
-//                            Date lastUseDate = null;
-//                            if (promoCode != null) {
-//                                lastUseDate = promoCode.getLastUseDate();
-//                            }
-//
-//                            if (lastUseDate != null && lastUseDate.getTime() < ((new Date()).getTime())) {
-//                                promoCode.setIsUse("2");
-//                                szwlFeign.updatePromoCode(String.valueOf(promoCode.getId()),"2");
-//                                //过期
-//                                return JsonMessage.success("4");
-//                            }
-//                            if (promoCode.getId() == null) {
-//                                //不存在
-//                                return JsonMessage.success("1");
-//                            }
-//                            if (promoCode.getIsUse().equals("1")) {
-//                                //被使用
-//                                return JsonMessage.success("2");
-//                            }
-//                            if(!promoCode.getAdminId().equals("1")){
-//                                if (String.valueOf(equipment.getAdminId()).equals(promoCode.getAdminId())) {
-//
-//                                } else {
-//                                    //不是本机
-//                                    return JsonMessage.success("3");
-//                                }
-//                            }
-//                            if (promoCode.getDiscount() == null) {
-//                                //旧优惠码
-//                                return JsonMessage.success("0");
-//                            }
-//                            if (promoCode.getDiscount() != null && promoCode.getDiscount() == 0) {
-//                                //0折
-//                                return JsonMessage.success("0");
-//                            }
-//                            promoCodeList.add(promoCode);
-//                        }
-//                    }
-//                }
-//                String[] productNum = key.split("-");
-//                String productNamea = productNum[0];
-//                String num = productNum[1];
-//                productMap.put(productNamea,Integer.valueOf(num));
-//                productNumber += Integer.valueOf(num);
-//                productName.append(productNamea).append("x").append(num).append(",");
-//                TProduct product = R.getDataIfSuccess(szwlFeign.getProduct(String.valueOf(equipment.getId()), productNamea));
-//                if (product == null) {
-//                    return JsonMessage.error("找不到商品");
-//                }
-//                note.append(productNamea).append("-").append(product.getNo()).append(":");
-//                BigDecimal productPrice = product.getRmbPrice();
-//                productNo = product.getNo();
-//                if(promoCodeList.size()>0){
-//                    //有优惠码
-//                    BigDecimal onePrice = new BigDecimal("0.00");
-//                    int i;
-//                    for( i = 0;i<promoCodeList.size();i++){
-//                        BigDecimal discount = BigDecimal.valueOf(promoCodeList.get(i).getDiscount()).setScale(2, RoundingMode.HALF_DOWN);
-//                        BigDecimal price1 = productPrice.multiply(discount).divide(new BigDecimal(10)).setScale(2, RoundingMode.HALF_DOWN);
-//                        price = price.add(price1);
-//                        onePrice = onePrice.add(price1);
-//                    }
-//                    if(i<Integer.valueOf(num)){
-//                        int a = Integer.valueOf(num)-i;
-//                        BigDecimal price2 = productPrice.multiply(new BigDecimal(a)).setScale(2, RoundingMode.HALF_DOWN);
-//                        price =price.add(price2);
-//                        onePrice = onePrice.add(price2);
-//                    }
-//                    note.append(onePrice).append("-").append(num).append(",");
-//                }else {
-//                    //1,type=0,原始设定,没有第二件半价
-//                    int a = Integer.valueOf(num);
-//                    BigDecimal price2 = productPrice.multiply(new BigDecimal(a)).setScale(2, RoundingMode.HALF_DOWN);
-//                    price =price.add(price2);
-//                    note.append(price2).append("-").append(num).append(",");
-//                }
-//            }
-//        }else {
-//
-//            for (String key : productNameMap.keySet()) {
-//                String[] productNum = key.split("-");
-//                String productNamea = productNum[0];
-//                String num = productNum[1];
-//                productMap.put(productNamea,Integer.valueOf(num));
-//                TProduct product = R.getDataIfSuccess(szwlFeign.getProduct(String.valueOf(equipment.getId()), productNamea));
-//                productNo = product.getNo();
-//                BigDecimal productPrice = product.getRmbPrice();
-//                productName.append(productNamea).append("x").append(num).append(",");
-//                note.append(productNamea).append("-").append(product.getNo()).append(":");
-//                switch (num) {
-//                    case "1":
-//                        //1个  0个半价
-//                        price =price.add(productPrice);
-//                        note.append(price).append("-").append(num).append(",");
-//                        break;
-//                    case "2":
-//                        //2个  1个半价
-//                        price =price.add(productPrice);
-//                        price =price.add(productPrice.multiply(new BigDecimal(5)).divide(new BigDecimal(10)).setScale(2, RoundingMode.HALF_DOWN));
-//                        note.append(price).append("-").append(num).append(",");
-//                        break;
-//                    case "3":
-//                        //3个 1个半价
-//                        price =price.add(productPrice);
-//                        price =price.add(productPrice.multiply(new BigDecimal(5)).divide(new BigDecimal(10)).setScale(2, RoundingMode.HALF_DOWN));
-//                        price =price.add(productPrice);
-//                        note.append(price).append("-").append(num).append(",");
-//                        break;
-//                    case "4":
-//                        //4个 2个半价
-//                        price =price.add(productPrice);
-//                        price =price.add(productPrice.multiply(new BigDecimal(5)).divide(new BigDecimal(10)).setScale(2, RoundingMode.HALF_DOWN));
-//                        price =price.add(productPrice);
-//                        price =price.add(productPrice.multiply(new BigDecimal(5)).divide(new BigDecimal(10)).setScale(2, RoundingMode.HALF_DOWN));
-//                        note.append(price).append("-").append(num).append(",");
-//                        break;
-//                    case "5":
-//                        //5个 2个半价
-//                        price =price.add(productPrice);
-//                        price =price.add(productPrice.multiply(new BigDecimal(5)).divide(new BigDecimal(10)).setScale(2, RoundingMode.HALF_DOWN));
-//                        price =price.add(productPrice);
-//                        price =price.add(productPrice.multiply(new BigDecimal(5)).divide(new BigDecimal(10)).setScale(2, RoundingMode.HALF_DOWN));
-//                        price =price.add(productPrice);
-//                        note.append(price).append("-").append(num).append(",");
-//                        break;
-//                }
-//            }
-//        }
-//
-//        if (equipment == null) {
-//            return JsonMessage.error("找不到设备");
-//        }
-//
-//        Long equipmentId = equipment.getId();
-//        //查找商品
-//        if (BigDecimal.ZERO.compareTo(price) >= 0) {
-//            return JsonMessage.error("商品价格异常");
-//        }
-//        Long client6 = Long.parseLong(clientId.substring(clientId.length() - 6));
-//        String sn = orderService.initSn(client6);
-//        //获取分销  关联设备
-//        TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(equipment.getAdminId())));
-//        String companyType = admin.getCompanyType();
-//        if (admin == null) {
-//            return JsonMessage.error("找不到设备商家");
-//        }
-//        JSONArray altInfo = new JSONArray();
-//        BigDecimal amount = price.setScale(2, RoundingMode.HALF_DOWN);
-//        amount = amount.multiply(new BigDecimal(100));
-//        String notifyUrl = JoinpayConstant.WECHAT_NOTIFY_URL;
-//        String frpCode = "WEIXIN_NATIVE";
-//        TOrder order = new TOrder();
-//        order.setId(IDGenerator.orderID());
-//        order.setCreateDate(new Date());
-//        order.setModifyDate(new Date());
-//        order.setAdminId(admin.getId());
-//        order.setSn(sn);
-//        if(productNumber == 1) {
-//            productName.delete(productName.length() - 3, productName.length());
-//        } else {
-//            productName.deleteCharAt(productName.length() - 1);
-//        }
-//        order.setProductName(productName.toString());
-//        order.setPrice(price);
-//        order.setClientId(equipment.getClientId());
-//        order.setEquipmentId(equipmentId);
-//        order.setFrpCode(frpCode);
-//        order.setProductNumber(productNumber);
-//        order.setAltInfo(altInfo.toString());
-//        order.setStatus(0);
-//        String payPlatform = "3";
-//        order.setPayPlatform(payPlatform);
-//        order.setCompanyType(companyType);
-//        order.setMachineType(equipment.getMachineType());
-//        order.setProductNo(productNo);
-//        if(StringUtils.isNotEmpty(payPlatform)&&payPlatform.equals("1")){
-//            order.setIsSettlement("0");
-//        }
-//        order.setNote(note.toString());
-//
-//        // 订单明细表
-//        TOrderDetails orderDetails = new TOrderDetails();
-//        orderDetails.setAdminId(admin.getId());
-//        orderDetails.setEquipmentId(equipmentId);
-//        orderDetails.setCreateDate(new Date());
-//        orderDetails.setCompanyType(companyType);
-//        orderDetails.setRefundStatus("0");
-//        orderDetails.setMachineType(equipment.getMachineType());
-//        // 添加到订单明细表
-//        for (String key : productMap.keySet()) {
-//            Integer productNum = productMap.get(key);
-//            TProduct product = R.getDataIfSuccess(szwlFeign.getProduct(String.valueOf(equipment.getId()), key));
-//            orderDetails.setProductNo(product.getNo());
-//            orderDetails.setProductName(key);
-//            orderDetails.setPrice(product.getRmbPrice());
-//            orderDetails.setProductNumber(productNum);
-//            orderDetails.setAmount(product.getRmbPrice().multiply(new BigDecimal(productNum)));
-//            orderDetails.setId(HuifuUtils.initDetailsId());
-//            orderDetails.setOrderSn(sn);
-//            orderDetailsService.save(orderDetails);
-//        }
-//        orderService.save(order);
-//        String productName1 = "";
-//        if(productNumber > 1) {
-//            productName1 = "棉花糖";
-//        } else {
-//            productName1 = productName.toString();
-//        }
-//        String result;
-//        try {
-//            result = orderService.wechatPay(
-//                    sn, amount, productName1, admin.getWechatPayId(), notifyUrl, clientId, request
-//            );
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//            return JsonMessage.error("申请支付失败");
-//        }
-//        // 微信支付支付申请返回支付二维码图片
-//        JSONObject kindData = new JSONObject();
-//        kindData.put("sn", sn);
-//        kindData.put("code_url", result);
-//        return JsonMessage.success(kindData.toString());
     }
 
     @ApiOperation("微信付款码支付")
@@ -337,92 +89,20 @@ public class TWechatPayConfigController {
         return jsonMessage;
     }
 
+    @ApiOperation("处理支付宝支付成功回调的通知")
+    @PostMapping("/alipayNotify")
+    public String alipayNotify(@RequestParam Map<String, String> params) {
+        log.info("支付宝支付回调通知:{}", params);
+        String result = alipayConfigService.alipayNotify(params);
+        return result;
+    }
+
     @ApiOperation("处理微信支付成功回调的通知")
     @PostMapping(value = "/notify")
     @ResponseBody
     public Object notify(HttpServletRequest request) {
         String result = wechatPayConfigService.payNotify(request);
         return result;
-//        Gson gson = new Gson();
-//        // 读取请求体中的数据
-//        String body = HttpUtils.readData(request);
-//        Map<String, Object> bodyMap = gson.fromJson(body, HashMap.class);
-//        // 解密支付通知数据
-//        String plainText = wechatPayConfigService.decryptFromResource(bodyMap);
-//        if(StringUtils.isNotEmpty(plainText)){
-//            JSONObject resultJson = JSONObject.parseObject(plainText);
-//            // 根据订单号查询订单
-//            String sn = resultJson.getString("out_trade_no");
-//            if(StringUtils.isNotEmpty(sn)) {
-//                LambdaQueryWrapper<TOrder> query = Wrappers.lambdaQuery();
-//                query.eq(TOrder::getSn, sn);
-//                query.eq(TOrder::getStatus, 0);
-//                List<TOrder> list = orderService.list(query);
-//                // 更新订单状态和支付信息
-//                if (list != null && list.size() > 0) {
-//                    TOrder order = list.get(0);
-//                    order.setStatus(1);
-//                    String success_time = resultJson.getString("success_time");
-//                    Date date = new Date();
-//                    try {
-//                        date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(success_time);
-//                    } catch (ParseException e) {
-//                        // 忽略时间转换错误
-//                    }
-//                    order.setPayDate(date);
-//                    order.setTrxNo(resultJson.getString("transaction_id"));
-//                    // 更新订单明细状态
-//                    LambdaQueryWrapper<TOrderDetails> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-//                    lambdaQueryWrapper.eq(TOrderDetails::getOrderSn,sn);
-//                    List<TOrderDetails> orderDetails = orderDetailsService.list(lambdaQueryWrapper);
-//                    for (TOrderDetails orderDetail : orderDetails) {
-//                        orderDetail.setRefundStatus("1");
-//                        orderDetailsService.updateById(orderDetail);
-//                    }
-//                    // 发送支付成功消息给设备
-//                    TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(order.getClientId()));
-//                    JSONObject kindData = new JSONObject();
-//                    kindData.put("sn", order.getSn());
-//                    kindData.put("productName", order.getProductName());
-//                    if (!order.getIsNotified().equals("1")) {
-//                        String paySuccess = equipmentService.sentMessage(equipment.getClientId(), PushUtils.buildJson("pay_success", kindData.toString()).toString());
-//                        if (paySuccess.equals("success")) {
-//                            order.setIsNotified("1");
-//                        }
-//                    }
-//                    orderService.updateById(order);
-//                    try {
-//                        // 保存订单信息到ES
-//                        if(order.getProductNumber()==null||order.getProductNumber()==0){
-//                            order.setProductNumber(1);
-//                        }
-//                        orderFeign.saveToEs(order);
-//                    }catch (Exception e) {
-//                        e.printStackTrace();
-//                    }
-//                } else {
-//                    LambdaQueryWrapper<TOrder> queryWrapper = Wrappers.lambdaQuery();
-//                    query.eq(TOrder::getSn, sn);
-//                    query.eq(TOrder::getStatus, 1);
-//                    List<TOrder> orderList = orderService.list(queryWrapper);
-//                    if (list != null && list.size() > 0) {
-//                        TOrder tOrder = orderList.get(0);
-//                        try {
-//                            // 保存订单信息到ES
-//                            if(tOrder.getProductNumber()==null||tOrder.getProductNumber()==0){
-//                                tOrder.setProductNumber(1);
-//                            }
-//                            orderFeign.saveToEs(tOrder);
-//                        }catch (Exception e) {
-//                            e.printStackTrace();
-//                        }
-//                        return "success";
-//                    }
-//                    return "fail";
-//                }
-//            }
-//        }
-//        return "success";
     }
 
     @ApiOperation("发起退款")
@@ -430,85 +110,11 @@ public class TWechatPayConfigController {
     public ResponseModel<?> refund(@RequestBody TOrder torder){
         ResponseModel result = wechatPayConfigService.refund(torder);
         return result;
-//        // 退款金额: refusePrice
-//        BigDecimal refusePrice = torder.getPrice().setScale(2, RoundingMode.HALF_DOWN);
-//        // 退款数量: refundNumber
-//        Integer refundNumber = torder.getProductNumber();
-//        // 退款原因: refundReason
-//        String refundReason = torder.getRefundReason();
-//        // 退款明细:note
-//        String note = torder.getNote();
-//        String[] refundDetails = note.split(",");
-//        Map<String, Integer> refundMap = new HashMap<>();
-//        for (String refundDetail : refundDetails) {
-//            String[] keyValue  = refundDetail.split("-");
-//            String key = keyValue[0];
-//            String value = keyValue[1];
-//            refundMap.put(key, Integer.valueOf(value));
-//        }
-//
-//        if(refusePrice.compareTo(new BigDecimal("0.00"))<=0){
-//            return R.fail(ResponseCodesEnum.A0001,"退款金额非法");
-//        }
-//
-//        TOrder order = orderService.getById(torder.getId());
-//        if(order.getRefundQuantity() != null && order.getRefundQuantity()>0) {
-//            order.setRefundQuantity(refundNumber + order.getRefundQuantity());
-//        } else {
-//            order.setRefundQuantity(refundNumber);
-//        }
-//
-//        LambdaQueryWrapper<TOrderDetails> wrapper = new LambdaQueryWrapper<>();
-//        wrapper.eq(TOrderDetails::getOrderSn, order.getSn());
-//        List<TOrderDetails> orderDetails = orderDetailsService.list(wrapper);
-//        if (order.getStatus().equals("0")) {
-//            return R.fail(ResponseCodesEnum.A0002,"订单非支付状态");
-//        }
-//
-//        CreateRequest createRequest = new CreateRequest();
-//        createRequest.setOutTradeNo(order.getSn());
-//        AmountReq amount = new AmountReq();
-//        amount.setRefund(refusePrice.multiply(new BigDecimal(100)).longValue());
-//        BigDecimal multiply = order.getPrice().multiply(new BigDecimal(100));
-//        amount.setTotal(multiply.longValue());
-//        amount.setCurrency("CNY");
-//        createRequest.setAmount(amount);
-//        String refundNo = orderService.initSn(order.getEquipmentId());
-//        createRequest.setOutRefundNo(refundNo);
-//        // 上线需要修改回调url
-//        createRequest.setNotifyUrl(JoinpayConstant.WECHAT_NOTIFY_REFUND_URL);
-////		createRequest.setNotifyUrl("http://evxz5m.natappfree.cc/wechatPay/refundNotify");
-//        TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(order.getAdminId())));
-//        Refund refund = orderService.weixinRefundApi(createRequest, admin.getWechatPayId());
-//        System.out.println("退款参数"+refund.toString());
-//        if(refund.getStatus()==PROCESSING){
-//            order.setStatus(2);
-//            order.setRefundReason(refundReason);
-//            orderService.updateById(order);
-//            // 修改订单明细
-//            for (TOrderDetails orderDetail : orderDetails) {
-//                String productNo = orderDetail.getProductNo();
-//                Integer productNumber = refundMap.get(productNo);
-//                if(productNumber != null) {
-//                    // 退款中
-//                    orderDetail.setRefundStatus("4");
-//                    // 退款数量
-//                    orderDetail.setRefundQuantity(productNumber);
-//                    // 退款金额
-//                    orderDetail.setRefundAmount(orderDetail.getPrice().multiply(new BigDecimal(productNumber)));
-//                    orderDetailsService.updateById(orderDetail);
-//                }
-//            }
-//            return R.ok("申请退款已成功");
-//        }else {
-//            return R.fail(ResponseCodesEnum.B0001,"申请退款失败,请重试");
-//        }
     }
 
     @ApiOperation(value = "退款成功回调")
     @PostMapping("/refundNotify")
     public Object refundNotify(HttpServletRequest request, HttpServletResponse response){
-//        String result = orderService.wechatRefund(request,response);
         String result = wechatPayConfigService.refundNotify(request,response);
         return result;
     }

+ 16 - 0
src/main/java/com/szwl/mapper/TAlipayConfigMapper.java

@@ -0,0 +1,16 @@
+package com.szwl.mapper;
+
+import com.szwl.model.entity.TAlipayConfig;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author wuhs
+ * @since 2024-04-13
+ */
+public interface TAlipayConfigMapper extends BaseMapper<TAlipayConfig> {
+
+}

+ 22 - 0
src/main/java/com/szwl/mapper/xml/TAlipayConfigMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.szwl.mapper.TAlipayConfigMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.szwl.model.entity.TAlipayConfig">
+        <id column="id" property="id" />
+        <result column="create_date" property="createDate" />
+        <result column="modify_date" property="modifyDate" />
+        <result column="app_id" property="appId" />
+        <result column="seller_id" property="sellerId" />
+        <result column="private_key" property="privateKey" />
+        <result column="alipay_public_key" property="alipayPublicKey" />
+        <result column="merchant_name" property="merchantName" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, create_date, modify_date, app_id, seller_id, private_key, alipay_public_key, merchant_name
+    </sql>
+
+</mapper>

+ 3 - 0
src/main/java/com/szwl/model/entity/TAdmin.java

@@ -115,6 +115,9 @@ public class TAdmin implements Serializable {
     @ApiModelProperty(value = "微信支付配置ID")
     private Long wechatPayId;
 
+    @ApiModelProperty(value = "支付宝支付配置ID")
+    private Long alipayId;
+
     @Transient
     public String getManagerId() {
 

+ 50 - 0
src/main/java/com/szwl/model/entity/TAlipayConfig.java

@@ -0,0 +1,50 @@
+package com.szwl.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author wuhs
+ * @since 2024-04-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="TAlipayConfig对象", description="")
+public class TAlipayConfig implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private Date createDate;
+
+    private Date modifyDate;
+
+    @ApiModelProperty(value = "支付宝分配给开发者的应用ID")
+    private String appId;
+
+    @ApiModelProperty(value = "卖家支付宝用户 ID")
+    private String sellerId;
+
+    @ApiModelProperty(value = "商户私钥")
+    private String privateKey;
+
+    @ApiModelProperty(value = "商户公钥")
+    private String alipayPublicKey;
+
+    @ApiModelProperty(value = "商户名称")
+    private String merchantName;
+
+
+}

+ 35 - 0
src/main/java/com/szwl/service/TAlipayConfigService.java

@@ -0,0 +1,35 @@
+package com.szwl.service;
+
+import com.alipay.api.AlipayApiException;
+import com.szwl.model.entity.TAlipayConfig;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2024-04-13
+ */
+public interface TAlipayConfigService extends IService<TAlipayConfig> {
+
+    /**
+     * 处理支付宝支付成功回调的通知
+     * @param params
+     * @return
+     */
+    String alipayNotify(Map<String, String> params);
+
+    /**
+     * 退款支付宝
+     * @param refusePrice
+     * @param sn
+     * @param alipayId
+     * @return
+     */
+    String refundAlipay(BigDecimal refusePrice, String sn, String refundTrxNo, Long alipayId);
+}

+ 23 - 0
src/main/java/com/szwl/service/TOrderService.java

@@ -1,6 +1,7 @@
 package com.szwl.service;
 
 import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.AlipayApiException;
 import com.szwl.model.entity.TOrder;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.wechat.pay.java.service.refund.model.CreateRequest;
@@ -9,6 +10,7 @@ import com.wechat.pay.java.service.refund.model.Refund;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
+import java.util.Map;
 
 /**
  * <p>
@@ -60,4 +62,25 @@ public interface TOrderService extends IService<TOrder> {
      * @return
      */
     String huifuNotifyRefund(HttpServletRequest request);
+
+
+    /**
+     * 发起支付宝支付
+     * @param sn
+     * @param amount
+     * @param productName
+     * @param alipayId
+     * @param notifyUrl
+     * @param clientId
+     * @return
+     * @throws AlipayApiException
+     */
+    String alipayPay(String sn, BigDecimal amount, String productName, Long alipayId, String notifyUrl, String clientId) throws AlipayApiException;
+
+    /**
+     * 处理支付宝订单支付成功
+     * @param params
+     * @param order
+     */
+    void processAlipayOrder(Map<String, String> params, TOrder order);
 }

+ 2 - 1
src/main/java/com/szwl/service/TWechatPayConfigService.java

@@ -1,5 +1,6 @@
 package com.szwl.service;
 
+import com.alipay.api.AlipayApiException;
 import com.szwl.model.bo.JsonMessage;
 import com.szwl.model.bo.ResponseModel;
 import com.szwl.model.entity.TOrder;
@@ -36,7 +37,7 @@ public interface TWechatPayConfigService extends IService<TWechatPayConfig> {
      * @param request
      * @return
      */
-    JsonMessage carsPay(String clientId, Map<String, String> productNameMap, HttpServletRequest request);
+    JsonMessage carsPay(String clientId, Map<String, String> productNameMap, String frpCode, HttpServletRequest request);
 
     /**
      * 微信支付回调

+ 180 - 0
src/main/java/com/szwl/service/impl/TAlipayConfigServiceImpl.java

@@ -0,0 +1,180 @@
+package com.szwl.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.AlipayConfig;
+import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.domain.AlipayTradeFastpayRefundQueryModel;
+import com.alipay.api.domain.AlipayTradeRefundModel;
+import com.alipay.api.internal.util.AlipaySignature;
+import com.alipay.api.request.AlipayTradeFastpayRefundQueryRequest;
+import com.alipay.api.request.AlipayTradeRefundRequest;
+import com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse;
+import com.alipay.api.response.AlipayTradeRefundResponse;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.szwl.feign.bean.OrderFeign;
+import com.szwl.feign.bean.SzwlFeign;
+import com.szwl.model.bo.R;
+import com.szwl.model.entity.*;
+import com.szwl.mapper.TAlipayConfigMapper;
+import com.szwl.model.utils.PushUtils;
+import com.szwl.service.*;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.locks.ReentrantLock;
+
+import static com.alipay.api.AlipayConstants.*;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2024-04-13
+ */
+@Slf4j
+@Service
+public class TAlipayConfigServiceImpl extends ServiceImpl<TAlipayConfigMapper, TAlipayConfig> implements TAlipayConfigService {
+
+    @Resource
+    TOrderService orderService;
+
+    @Resource
+    SzwlFeign szwlFeign;
+
+    @Override
+    public String alipayNotify(Map<String, String> params) {
+        String result = "fail";
+        String outTradeNo = params.get("out_trade_no");
+        // 验证该通知数据中的 out_trade_no 是否为商家系统中创建的订单号
+        if(StringUtils.isEmpty(outTradeNo)) {
+            log.error("订单号不存在");
+            return result;
+        }
+        LambdaQueryWrapper<TOrder> query = Wrappers.lambdaQuery();
+        query.eq(TOrder::getSn, outTradeNo);
+        TOrder order = orderService.getOne(query);
+        if(order == null) {
+            log.error("订单不存在");
+            return result;
+        }
+        try {
+            // 查询支付宝配置
+            TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(order.getAdminId())));
+            TAlipayConfig alipayConfig = getById(admin.getAlipayId());
+
+            // 验签
+            boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayConfig.getAlipayPublicKey(), CHARSET_UTF8, SIGN_TYPE_RSA2);
+            if(!signVerified) {
+                log.error("支付宝回调验签失败!");
+                return result;
+            }
+
+            // 判断 total_amount 是否确实为该订单的实际金额(即商家订单创建时的金额)
+            String totalAmount = params.get("total_amount");
+            BigDecimal bigDecimal = new BigDecimal(totalAmount).setScale(2);
+            BigDecimal price = order.getPrice();
+            if(bigDecimal.compareTo(price) != 0) {
+                log.error("订单金额不一致!");
+                return result;
+            }
+
+            // 校验通知中的 seller_id(或者 seller_email ) 是否为 out_trade_no 这笔单据的对应的操作方
+            String sellerId = params.get("seller_id");
+            if(!sellerId.equals(alipayConfig.getSellerId())) {
+                log.error("商家PID校验失败!");
+                return result;
+            }
+
+            // 验证 app_id 是否为该商家本身
+            String appId = params.get("app_id");
+            if(!appId.equals(alipayConfig.getAppId())) {
+                log.error("商家APPID校验失败!");
+                return result;
+            }
+
+            // 校验交易通知状态是否为TRADE_SUCCESS
+            String trade_status = params.get("trade_status");
+            if(!trade_status.equals("TRADE_SUCCESS")) {
+                log.error("支付未成功!");
+                return result;
+            }
+
+            // 处理业务 修改订单状态
+            orderService.processAlipayOrder(params, order);
+            // 返回成功结果
+            result = "success";
+        } catch (AlipayApiException e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+    @Override
+    public String refundAlipay(BigDecimal refusePrice, String sn, String refundTrxNo, Long alipayId){
+        TAlipayConfig tAlipayConfig = getById(alipayId);
+        AlipayConfig alipayConfig = new AlipayConfig();
+        alipayConfig.setAppId(tAlipayConfig.getAppId());
+        alipayConfig.setPrivateKey(tAlipayConfig.getPrivateKey());
+        alipayConfig.setFormat("json");
+        alipayConfig.setAlipayPublicKey(tAlipayConfig.getAlipayPublicKey());
+        alipayConfig.setCharset("UTF-8");
+        alipayConfig.setSignType("RSA2");
+
+        try {
+            AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
+            AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
+            AlipayTradeRefundModel model = new AlipayTradeRefundModel();
+            model.setRefundAmount(refusePrice.toString());
+            model.setOutTradeNo(sn);
+            model.setOutRequestNo(refundTrxNo);
+            request.setBizModel(model);
+            log.info("调用支付退款API");
+            AlipayTradeRefundResponse response = alipayClient.execute(request);
+            System.out.println(response.getBody());
+            log.info("退款结果:{}", response.getBody());
+            if (response.isSuccess()) {
+                String fundChange = response.getFundChange();
+                if(StringUtils.isNotEmpty(fundChange) && fundChange.equals("Y")) {
+                    // 直接退款成功
+                    return "success";
+                } else {
+                    // 没有直接退款,需要查询退款单
+                    AlipayTradeFastpayRefundQueryRequest queryRefund = new AlipayTradeFastpayRefundQueryRequest();
+                    AlipayTradeFastpayRefundQueryModel modelRefund = new AlipayTradeFastpayRefundQueryModel();
+                    modelRefund.setOutRequestNo(refundTrxNo);
+                    queryRefund.setBizModel(model);
+                    log.info("调用查询退款结果API");
+                    AlipayTradeFastpayRefundQueryResponse responseRefund = alipayClient.execute(queryRefund);
+                    log.info("查询退款结果:{}", responseRefund.getBody());
+                    if(responseRefund.isSuccess()) {
+                        String refundStatus = responseRefund.getRefundStatus();
+                        // 退款成功
+                        if(StringUtils.isNotEmpty(refundStatus) && refundStatus.equals("REFUND_SUCCESS")) {
+                            return "success";
+                        }
+                    }
+                }
+            } else {
+                System.out.println("调用失败");
+            }
+        } catch (AlipayApiException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}

+ 103 - 1
src/main/java/com/szwl/service/impl/TOrderServiceImpl.java

@@ -3,6 +3,13 @@ package com.szwl.service.impl;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.AlipayConfig;
+import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.domain.AlipayTradePrecreateModel;
+import com.alipay.api.request.AlipayTradePrecreateRequest;
+import com.alipay.api.response.AlipayTradePrecreateResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.google.gson.Gson;
@@ -27,17 +34,21 @@ import com.wechat.pay.java.service.payments.nativepay.model.PrepayResponse;
 import com.wechat.pay.java.service.payments.nativepay.model.SceneInfo;
 import com.wechat.pay.java.service.refund.model.CreateRequest;
 import com.wechat.pay.java.service.refund.model.Refund;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.apache.http.HttpStatus;
 import org.apache.http.message.BasicNameValuePair;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.UnsupportedEncodingException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
 
@@ -51,6 +62,7 @@ import static com.szwl.service.impl.TJoinpayMchServiceImpl.createHmacSign;
  * @author wuhs
  * @since 2022-06-17
  */
+@Slf4j
 @Service
 public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> implements TOrderService {
 
@@ -70,7 +82,10 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
     TEquipmentService equipmentService;
 
     @Autowired
-    private TWechatPayConfigService wechatPayConfigService;
+    TWechatPayConfigService wechatPayConfigService;
+
+    @Resource
+    TAlipayConfigService alipayConfigService;
 
     @Autowired
     private TOrderDetailsService orderDetailsService;
@@ -396,6 +411,93 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         return "退款失败";
     }
 
+    @Override
+    public String alipayPay(String sn, BigDecimal amount, String productName, Long alipayId, String notifyUrl, String clientId) throws AlipayApiException {
+        TAlipayConfig tAlipayConfig = alipayConfigService.getById(alipayId);
+        AlipayConfig alipayConfig = new AlipayConfig();
+        alipayConfig.setAppId(tAlipayConfig.getAppId());
+        alipayConfig.setPrivateKey(tAlipayConfig.getPrivateKey());
+        alipayConfig.setFormat("json");
+        alipayConfig.setAlipayPublicKey(tAlipayConfig.getAlipayPublicKey());
+        alipayConfig.setCharset("UTF-8");
+        alipayConfig.setSignType("RSA2");
+
+        AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
+        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
+        AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
+        model.setOutTradeNo(sn);
+        model.setTotalAmount(amount.toString());
+        model.setSubject(productName);
+        model.setSellerId(tAlipayConfig.getSellerId());
+        model.setTerminalId(clientId);
+        request.setBizModel(model);
+        request.setNotifyUrl(notifyUrl);
+
+        AlipayTradePrecreateResponse response = alipayClient.execute(request);
+        System.out.println(response.getBody());
+        log.info("支付宝扫码支付接口返回结果:{}", response.getBody());
+        if (response.isSuccess()) {
+            log.info("调用支付宝扫码支付接口成功:{}", response.getBody());
+            System.out.println("二维码地址:" + response.getQrCode());
+            return response.getQrCode();
+        } else {
+            System.out.println("调用失败");
+            log.info("调用支付宝扫码支付接口失败:{}", response.getBody());
+            return null;
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void processAlipayOrder(Map<String, String> params, TOrder order) {
+        log.info("处理订单");
+        if(order.getStatus() != 0) {
+            return;
+        }
+        order.setStatus(1);
+        // 交易时间
+        String gmtPayment = params.get("gmt_payment");
+        Date date = new Date();
+        try {
+            date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(gmtPayment);
+        } catch (ParseException e) {
+            // 忽略时间转换错误
+        }
+        order.setPayDate(date);
+        // 支付宝交易号
+        String tradeNo = params.get("trade_no");
+        order.setTrxNo(tradeNo);
+        // 更新订单明细状态
+        LambdaQueryWrapper<TOrderDetails> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(TOrderDetails::getOrderSn, order.getSn());
+        List<TOrderDetails> orderDetails = orderDetailsService.list(lambdaQueryWrapper);
+        for (TOrderDetails orderDetail : orderDetails) {
+            orderDetail.setRefundStatus("1");
+            orderDetailsService.updateById(orderDetail);
+        }
+        // 发送支付成功消息给设备
+        TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(order.getClientId()));
+        JSONObject kindData = new JSONObject();
+        kindData.put("sn", order.getSn());
+        kindData.put("productName", order.getProductName());
+        if (!order.getIsNotified().equals("1")) {
+            String paySuccess = equipmentService.sentMessage(equipment.getClientId(), PushUtils.buildJson("pay_success", kindData.toString()).toString());
+            if (paySuccess.equals("success")) {
+                order.setIsNotified("1");
+            }
+        }
+        orderService.updateById(order);
+        try {
+            // 保存订单信息到ES
+            if(order.getProductNumber()==null||order.getProductNumber()==0){
+                order.setProductNumber(1);
+            }
+            orderFeign.saveToEs(order);
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
     public void processRefund(Map<String, Object> bodyMap) {
         String decrypt = wechatPayConfigService.decryptFromResource(bodyMap);
         Gson gson = new Gson();

+ 128 - 49
src/main/java/com/szwl/service/impl/TWechatPayConfigServiceImpl.java

@@ -5,9 +5,11 @@ import cn.hutool.http.HttpUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.AlipayApiException;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.google.gson.Gson;
+import com.szwl.constant.ConfigConsts;
 import com.szwl.constant.JoinpayConstant;
 import com.szwl.constant.ResponseCodesEnum;
 import com.szwl.constant.WXPayConstants;
@@ -19,10 +21,7 @@ import com.szwl.model.bo.ResponseModel;
 import com.szwl.model.entity.*;
 import com.szwl.mapper.TWechatPayConfigMapper;
 import com.szwl.model.utils.PushUtils;
-import com.szwl.service.TEquipmentService;
-import com.szwl.service.TOrderDetailsService;
-import com.szwl.service.TOrderService;
-import com.szwl.service.TWechatPayConfigService;
+import com.szwl.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.szwl.utils.HuifuUtils;
 import com.szwl.utils.IDGenerator;
@@ -35,11 +34,13 @@ import com.wechat.pay.java.core.RSAAutoCertificateConfig;
 import com.wechat.pay.java.service.refund.model.AmountReq;
 import com.wechat.pay.java.service.refund.model.CreateRequest;
 import com.wechat.pay.java.service.refund.model.Refund;
+import com.wechat.pay.java.service.refund.model.Status;
 import org.apache.commons.lang.StringUtils;
 import org.apache.http.HttpStatus;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
@@ -79,6 +80,9 @@ public class TWechatPayConfigServiceImpl extends ServiceImpl<TWechatPayConfigMap
     @Autowired
     TOrderService orderService;
 
+    @Resource
+    TAlipayConfigService alipayConfigService;
+
     @Autowired
     TEquipmentService equipmentService;
 
@@ -138,7 +142,7 @@ public class TWechatPayConfigServiceImpl extends ServiceImpl<TWechatPayConfigMap
     }
 
     @Override
-    public JsonMessage carsPay(String clientId, Map<String, String> productNameMap, HttpServletRequest request) {
+    public JsonMessage carsPay(String clientId, Map<String, String> productNameMap, String frpCode, HttpServletRequest request) {
         if(productNameMap==null){
             return  JsonMessage.error("数据出错");
         }
@@ -313,8 +317,8 @@ public class TWechatPayConfigServiceImpl extends ServiceImpl<TWechatPayConfigMap
         JSONArray altInfo = new JSONArray();
         BigDecimal amount = price.setScale(2, RoundingMode.HALF_DOWN);
         amount = amount.multiply(new BigDecimal(100));
-        String notifyUrl = JoinpayConstant.WECHAT_NOTIFY_URL;
-        String frpCode = "WEIXIN_NATIVE";
+//        String notifyUrl = JoinpayConstant.WECHAT_NOTIFY_URL;
+//        String frpCode = "WEIXIN_NATIVE";
         TOrder order = new TOrder();
         order.setId(IDGenerator.orderID());
         order.setCreateDate(new Date());
@@ -372,11 +376,18 @@ public class TWechatPayConfigServiceImpl extends ServiceImpl<TWechatPayConfigMap
         } else {
             productName1 = productName.toString();
         }
-        String result;
+        String result = null;
         try {
-            result = orderService.wechatPay(
-                    sn, amount, productName1, admin.getWechatPayId(), notifyUrl, clientId, request
-            );
+            if (frpCode.equals(ConfigConsts.WECHAT_NATIVE)) {
+                result = orderService.wechatPay(
+                        sn, amount, productName1, admin.getWechatPayId(), JoinpayConstant.WECHAT_NOTIFY_URL, clientId, request
+                );
+            }
+            if (frpCode.equals(ConfigConsts.ALIPAY_NATIVE)) {
+                result = orderService.alipayPay(
+                        sn, price, productName1, admin.getAlipayId(), JoinpayConstant.ALIPAY_NOTIFY_URL, clientId
+                );
+            }
         } catch (Exception e) {
             e.printStackTrace();
             return JsonMessage.error("申请支付失败");
@@ -473,7 +484,7 @@ public class TWechatPayConfigServiceImpl extends ServiceImpl<TWechatPayConfigMap
     }
 
     @Override
-    public ResponseModel refund(TOrder torder) {
+    public ResponseModel refund(TOrder torder){
         // 退款金额: refusePrice
         BigDecimal refusePrice = torder.getPrice().setScale(2, RoundingMode.HALF_DOWN);
         // 退款数量: refundNumber
@@ -495,6 +506,7 @@ public class TWechatPayConfigServiceImpl extends ServiceImpl<TWechatPayConfigMap
             return R.fail(ResponseCodesEnum.A0001,"退款金额非法");
         }
 
+
         TOrder order = orderService.getById(torder.getId());
         if(order.getRefundQuantity() != null && order.getRefundQuantity()>0) {
             order.setRefundQuantity(refundNumber + order.getRefundQuantity());
@@ -502,51 +514,118 @@ public class TWechatPayConfigServiceImpl extends ServiceImpl<TWechatPayConfigMap
             order.setRefundQuantity(refundNumber);
         }
 
-        LambdaQueryWrapper<TOrderDetails> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(TOrderDetails::getOrderSn, order.getSn());
-        List<TOrderDetails> orderDetails = orderDetailsService.list(wrapper);
+        if(refusePrice.compareTo(order.getPrice()) > 0) {
+            return R.fail(ResponseCodesEnum.A0001,"退款金额非法");
+        }
+
+        if(order.getRefundAmount() != null && order.getRefundAmount().add(refusePrice).compareTo(order.getPrice()) > 0) {
+            return R.fail(ResponseCodesEnum.A0001,"退款金额非法");
+        }
+
         if (order.getStatus().equals("0")) {
             return R.fail(ResponseCodesEnum.A0002,"订单非支付状态");
         }
 
-        CreateRequest createRequest = new CreateRequest();
-        createRequest.setOutTradeNo(order.getSn());
-        AmountReq amount = new AmountReq();
-        amount.setRefund(refusePrice.multiply(new BigDecimal(100)).longValue());
-        BigDecimal multiply = order.getPrice().multiply(new BigDecimal(100));
-        amount.setTotal(multiply.longValue());
-        amount.setCurrency("CNY");
-        createRequest.setAmount(amount);
-        String refundNo = orderService.initSn(order.getEquipmentId());
-        createRequest.setOutRefundNo(refundNo);
-        // 上线需要修改回调url
-        createRequest.setNotifyUrl(JoinpayConstant.WECHAT_NOTIFY_REFUND_URL);
-//		createRequest.setNotifyUrl("http://evxz5m.natappfree.cc/wechatPay/refundNotify");
+        LambdaQueryWrapper<TOrderDetails> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(TOrderDetails::getOrderSn, order.getSn());
+        List<TOrderDetails> orderDetails = orderDetailsService.list(wrapper);
+        // 微信支付
         TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(order.getAdminId())));
-        Refund refund = orderService.weixinRefundApi(createRequest, admin.getWechatPayId());
-        System.out.println("退款参数"+refund.toString());
-        if(refund.getStatus()==PROCESSING){
-            order.setStatus(2);
-            order.setRefundReason(refundReason);
-            orderService.updateById(order);
-            // 修改订单明细
-            for (TOrderDetails orderDetail : orderDetails) {
-                String productNo = orderDetail.getProductNo();
-                Integer productNumber = refundMap.get(productNo);
-                if(productNumber != null) {
-                    // 退款中
-                    orderDetail.setRefundStatus("4");
-                    // 退款数量
-                    orderDetail.setRefundQuantity(productNumber);
-                    // 退款金额
-                    orderDetail.setRefundAmount(orderDetail.getPrice().multiply(new BigDecimal(productNumber)));
-                    orderDetailsService.updateById(orderDetail);
+        if (order.getFrpCode().equals("WEIXIN_PAYCODE") || order.getFrpCode().equals("WEIXIN_NATIVE")) {
+            CreateRequest createRequest = new CreateRequest();
+            createRequest.setOutTradeNo(order.getSn());
+            AmountReq amount = new AmountReq();
+            amount.setRefund(refusePrice.multiply(new BigDecimal(100)).longValue());
+            BigDecimal multiply = order.getPrice().multiply(new BigDecimal(100));
+            amount.setTotal(multiply.longValue());
+            amount.setCurrency("CNY");
+            createRequest.setAmount(amount);
+            String refundNo = orderService.initSn(order.getEquipmentId());
+            createRequest.setOutRefundNo(refundNo);
+            // 上线需要修改回调url
+            createRequest.setNotifyUrl(JoinpayConstant.WECHAT_NOTIFY_REFUND_URL);
+            Refund refund = orderService.weixinRefundApi(createRequest, admin.getWechatPayId());
+            System.out.println("退款参数"+refund.toString());
+            if(refund.getStatus() == PROCESSING){
+                order.setStatus(2);
+                order.setRefundReason(refundReason);
+                orderService.updateById(order);
+                // 修改订单明细
+                for (TOrderDetails orderDetail : orderDetails) {
+                    String productNo = orderDetail.getProductNo();
+                    Integer productNumber = refundMap.get(productNo);
+                    if(productNumber != null) {
+                        // 退款中
+                        orderDetail.setRefundStatus("4");
+                        // 退款数量
+                        orderDetail.setRefundQuantity(productNumber);
+                        // 退款金额
+                        orderDetail.setRefundAmount(orderDetail.getPrice().multiply(new BigDecimal(productNumber)));
+                        orderDetailsService.updateById(orderDetail);
+                    }
                 }
+                return R.ok("申请退款已成功");
+            }
+        }
+        // 支付宝支付
+        if(order.getFrpCode().equals("ALIPAY_NATIVE")) {
+            // 随机生成退款交易号
+            String refundTrxNo = HuifuUtils.initRefundTrxNo();
+            String refundAlipay = alipayConfigService.refundAlipay(refusePrice, order.getSn(), refundTrxNo, admin.getAlipayId());
+            if(refundAlipay.equals("success")) {
+                order.setRefundReason(refundReason);
+                // 已退款
+                if(order.getRefundQuantity() < order.getProductNumber()) {
+                    order.setStatus(1);
+                } else {
+                    order.setStatus(3);
+                }
+                // 退款金额
+                BigDecimal refundAmount = order.getRefundAmount();
+                BigDecimal price = order.getPrice();
+                if(refundAmount != null) {
+                    if (price.compareTo(refundAmount) == 0) {
+                        order.setRefundAmount(refundAmount);
+                    } else {
+                        order.setRefundAmount(refundAmount.add(refusePrice));
+                    }
+                } else {
+                    order.setRefundAmount(refusePrice);
+                }
+                order.setRefundDate(new Date());
+                order.setModifyDate(new Date());
+                order.setRefundTrxNo(refundTrxNo);
+                // 修改订单明细
+                for (TOrderDetails orderDetail : orderDetails) {
+                    String productNo = orderDetail.getProductNo();
+                    Integer productNumber = refundMap.get(productNo);
+                    if(productNumber != null) {
+                        // 退款数量
+                        orderDetail.setRefundQuantity(productNumber);
+                        // 退款状态
+                        if(productNumber < orderDetail.getProductNumber()) {
+                            // 部分退款
+                            orderDetail.setRefundStatus("2");
+                        } else {
+                            // 全部退款
+                            orderDetail.setRefundStatus("3");
+                        }
+                        // 退款金额
+                        orderDetail.setRefundAmount(orderDetail.getPrice().multiply(new BigDecimal(productNumber)));
+                        orderDetailsService.updateById(orderDetail);
+                    }
+                }
+                try {
+                    orderFeign.saveToEs(order);
+                }catch (Exception e) {
+                    e.printStackTrace();
+                }finally {
+                    orderService.updateById(order);
+                }
+                return R.ok("申请退款已成功");
             }
-            return R.ok("申请退款已成功");
-        }else {
-            return R.fail(ResponseCodesEnum.B0001,"申请退款失败,请重试");
         }
+        return R.fail(ResponseCodesEnum.B0001,"申请退款失败,请重试");
     }
 
     @Override

+ 10 - 0
src/main/java/com/szwl/utils/HuifuUtils.java

@@ -94,4 +94,14 @@ public class HuifuUtils {
         String numbers2 = RandomUtil.randomNumbers(5);
         return new StringBuilder(numbers1).append(DateTools.getCurrentDateTimeYYYYMMDDHHMMSSSSS()).append(numbers2).toString();
     }
+
+    /**
+     * 生成随机退款流水号
+     * @return
+     */
+    public static String initRefundTrxNo() {
+        String numbers1 = RandomUtil.randomNumbers(5);
+        String numbers2 = RandomUtil.randomNumbers(5);
+        return new StringBuilder("r"+ numbers1).append(DateTools.getCurrentDateTimeYYYYMMDDHHMMSSSSS()).append(numbers2).toString();
+    }
 }