hechunping vor 2 Monaten
Ursprung
Commit
8e34ecc034
30 geänderte Dateien mit 5780 neuen und 7 gelöschten Zeilen
  1. 10 7
      .gitignore
  2. 225 0
      mvnw
  3. 143 0
      mvnw.cmd
  4. 194 0
      pom.xml
  5. 63 0
      src/main/java/com/xynet/pay/Exception/BusinessException.java
  6. 60 0
      src/main/java/com/xynet/pay/XynetServicePayThirdApplication.java
  7. 20 0
      src/main/java/com/xynet/pay/controller/TestController.java
  8. 23 0
      src/main/java/com/xynet/pay/foreignAPI/ApiClient.java
  9. 29 0
      src/main/java/com/xynet/pay/spring/SpringContextUtil.java
  10. 127 0
      src/main/java/com/xynet/pay/util/AESUtil.java
  11. 144 0
      src/main/java/com/xynet/pay/util/ArrayUtils.java
  12. 136 0
      src/main/java/com/xynet/pay/util/Base64Utils.java
  13. 150 0
      src/main/java/com/xynet/pay/util/ConvertData.java
  14. 410 0
      src/main/java/com/xynet/pay/util/DateUtil.java
  15. 166 0
      src/main/java/com/xynet/pay/util/FileUtils.java
  16. 160 0
      src/main/java/com/xynet/pay/util/HMAC_SHA1Utils.java
  17. 38 0
      src/main/java/com/xynet/pay/util/HttpResult.java
  18. 233 0
      src/main/java/com/xynet/pay/util/HttpServiceUtils.java
  19. 5 0
      src/main/java/com/xynet/pay/util/HttpsUtils.java
  20. 96 0
      src/main/java/com/xynet/pay/util/JsonUtils.java
  21. 215 0
      src/main/java/com/xynet/pay/util/MathUtil.java
  22. 459 0
      src/main/java/com/xynet/pay/util/PKCS7Tool.java
  23. 462 0
      src/main/java/com/xynet/pay/util/RSAProvider.java
  24. 98 0
      src/main/java/com/xynet/pay/util/RSASignUtil.java
  25. 301 0
      src/main/java/com/xynet/pay/util/RSATool.java
  26. 76 0
      src/main/java/com/xynet/pay/util/Reserve.java
  27. 1612 0
      src/main/resources/application.yml
  28. 15 0
      src/main/resources/environment.properties
  29. 80 0
      src/main/resources/logback-spring.xml
  30. 30 0
      src/main/resources/mybatis/mybatis-config.xml

+ 10 - 7
.gitignore

@@ -1,4 +1,4 @@
-/target/
+target/
 !.mvn/wrapper/maven-wrapper.jar
 
 ### STS ###
@@ -17,9 +17,12 @@
 *.ipr
 
 ### NetBeans ###
-/nbproject/private/
-/build/
-/nbbuild/
-/dist/
-/nbdist/
-/.nb-gradle/
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
+
+logs/
+src/test

+ 225 - 0
mvnw

@@ -0,0 +1,225 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven2 Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+#   JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+#   M2_HOME - location of maven2's installed home dir
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
+#     e.g. to debug Maven itself, use
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+  if [ -f /etc/mavenrc ] ; then
+    . /etc/mavenrc
+  fi
+
+  if [ -f "$HOME/.mavenrc" ] ; then
+    . "$HOME/.mavenrc"
+  fi
+
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  MINGW*) mingw=true;;
+  Darwin*) darwin=true
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+    if [ -z "$JAVA_HOME" ]; then
+      if [ -x "/usr/libexec/java_home" ]; then
+        export JAVA_HOME="`/usr/libexec/java_home`"
+      else
+        export JAVA_HOME="/Library/Java/Home"
+      fi
+    fi
+    ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+  ## resolve links - $0 may be a link to maven's home
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+      PRG="$link"
+    else
+      PRG="`dirname "$PRG"`/$link"
+    fi
+  done
+
+  saveddir=`pwd`
+
+  M2_HOME=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  M2_HOME=`cd "$M2_HOME" && pwd`
+
+  cd "$saveddir"
+  # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --unix "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Migwn, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME="`(cd "$M2_HOME"; pwd)`"
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+  # TODO classpath?
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="`which javac`"
+  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=`which readlink`
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+      if $darwin ; then
+        javaHome="`dirname \"$javaExecutable\"`"
+        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+      else
+        javaExecutable="`readlink -f \"$javaExecutable\"`"
+      fi
+      javaHome="`dirname \"$javaExecutable\"`"
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="`which java`"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly." >&2
+  echo "  We cannot execute $JAVACMD" >&2
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+  if [ -z "$1" ]
+  then
+    echo "Path not specified to find_maven_basedir"
+    return 1
+  fi
+
+  basedir="$1"
+  wdir="$1"
+  while [ "$wdir" != '/' ] ; do
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+    if [ -d "${wdir}" ]; then
+      wdir=`cd "$wdir/.."; pwd`
+    fi
+    # end of workaround
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' < "$1")"
+  fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+  exit 1;
+fi
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+echo $MAVEN_PROJECTBASEDIR
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+  $MAVEN_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

+ 143 - 0
mvnw.cmd

@@ -0,0 +1,143 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven2 Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM     e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%

+ 194 - 0
pom.xml

@@ -0,0 +1,194 @@
+<?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.xynet</groupId>
+	<artifactId>xynet-service-marketing</artifactId>
+	<version>1.0</version>
+	<packaging>jar</packaging>
+
+	<name>xynet-service-marketing</name>
+	<description>xynet-service-marketing</description>
+
+	<parent>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-parent</artifactId>
+		<version>1.5.10.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>
+		<spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
+	</properties>
+
+	<dependencies>		
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-actuator</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-hystrix</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-ribbon</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-jdbc</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.mybatis.spring.boot</groupId>
+			<artifactId>mybatis-spring-boot-starter</artifactId>
+			<version>1.3.1</version>
+		</dependency>
+
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+			<scope>runtime</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.integration</groupId>
+			<artifactId>spring-integration-http</artifactId>
+		</dependency>		
+		<!-- 集成 aop -->
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-aop</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>commons-lang</groupId>
+			<artifactId>commons-lang</artifactId>
+			<version>2.6</version>
+		</dependency>	
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-devtools</artifactId>
+			<optional>true</optional> <!-- 表示依赖不会传递 -->
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-data-redis</artifactId>
+		</dependency>
+		
+		
+		
+		<dependency>
+			<groupId>commons-discovery</groupId>
+			<artifactId>commons-discovery</artifactId>
+			<version>0.2</version>
+		</dependency>
+		
+		<!-- 引入zipkin -->
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-zipkin</artifactId>
+		</dependency>		
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-feign</artifactId>
+		</dependency>
+		
+		
+	</dependencies>
+
+	<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>
+		</dependencies>
+	</dependencyManagement>
+
+	<build>
+		<plugins>
+			<plugin>
+				<artifactId>maven-jar-plugin</artifactId>
+				<version>2.6</version>
+				<configuration>
+					<archive>
+						<manifest>
+							<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+							<addClasspath>true</addClasspath>
+							<mainClass>com.xynet.pay.XynetServicePayThirdApplication</mainClass>
+							<classpathPrefix>dependency</classpathPrefix>
+							<useUniqueVersions>false</useUniqueVersions>
+						</manifest>
+					</archive>
+				</configuration>
+			</plugin>
+			<plugin>
+				<artifactId>maven-dependency-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>copy-dependencies</id>
+						<phase>package</phase>
+						<goals>
+							<goal>copy-dependencies</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+
+
+			<plugin>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<configuration>
+					<source>1.8</source>
+					<target>1.8</target>
+					<encoding>UTF-8</encoding>
+					<compilerArguments>
+						<extdirs>${project.basedir}/src/main/lib</extdirs>
+					</compilerArguments>
+				</configuration>
+			</plugin>
+
+			<!-- maven打包跳过编译 -->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<configuration>
+					<skip>true</skip>
+				</configuration>
+			</plugin>
+
+		</plugins>
+
+		<defaultGoal>compile</defaultGoal>
+
+		<!-- <resources> <resource> <directory>src/main/resources</directory> <targetPath>.</targetPath> 
+			</resource> <resource> <directory>src/main/lib</directory> <targetPath>.</targetPath> 
+			</resource> <resource> <directory>src/main/lib</directory> <targetPath>BOOT-INF/lib/</targetPath> 
+			<includes> <include>*.jar</include> </includes> </resource> </resources> -->
+
+		<resources>
+			<resource>
+				<directory>src/main/java</directory>
+				<includes>
+					<include>**/*.properties</include>
+					<include>**/*.xml</include>
+				</includes>
+				<filtering>false</filtering>
+			</resource>
+			<resource>
+				<directory>src/main/resources</directory>
+			</resource>
+		</resources>
+	</build>
+
+</project>

+ 63 - 0
src/main/java/com/xynet/pay/Exception/BusinessException.java

@@ -0,0 +1,63 @@
+package com.xynet.pay.Exception;
+/**
+ * 业务异常
+ * 
+ * @author yangsj 
+ */
+public class BusinessException extends RuntimeException
+ {
+   private static final long serialVersionUID = 5808616192752024016L;
+   private String code;
+   private Object[] args;
+ 
+   public BusinessException()
+   {
+   }
+   
+   public BusinessException(String code, String msg)
+   {
+     super(msg);
+     this.code = code;
+   }
+
+   public BusinessException(String code, String msg, Object[] _args)
+   {
+     super(msg);
+     this.code = code;
+     this.args = _args;
+   }
+
+   public BusinessException(Throwable exception)
+   {
+     super(exception);
+     getExceptionCode(exception);
+   }
+ 
+   private void getExceptionCode(Throwable exception)
+   {
+     if ((exception instanceof BusinessException))
+     {
+       this.code = ((BusinessException)exception).getCode();
+     }
+     else
+     {
+       this.code = "999999";
+     }
+   }
+ 
+   public String getCode() {
+     return this.code;
+   }
+ 
+   public void setCode(String code) {
+     this.code = code;
+   }
+ 
+   public Object[] getArgs() {
+     return this.args;
+   }
+ 
+   public void setArgs(Object[] args) {
+     this.args = args;
+   }
+ }

+ 60 - 0
src/main/java/com/xynet/pay/XynetServicePayThirdApplication.java

@@ -0,0 +1,60 @@
+package com.xynet.pay;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.ServletComponentScan;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.netflix.feign.EnableFeignClients;
+import org.springframework.cloud.netflix.hystrix.EnableHystrix;
+import org.springframework.context.annotation.Bean;
+import org.springframework.retry.annotation.EnableRetry;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import java.util.TimeZone;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+@EnableCaching //开启缓存
+@SpringBootApplication
+@EnableHystrix
+@ServletComponentScan
+@EnableTransactionManagement 
+@EnableDiscoveryClient
+@EnableFeignClients
+@EnableScheduling
+@EnableAsync
+@EnableRetry
+@MapperScan(basePackages = {"com.xynet.pay.meitu.mapper"})
+public class XynetServicePayThirdApplication {
+
+	public static void main(String[] args) {
+		init();		
+		SpringApplication.run(XynetServicePayThirdApplication.class, args);
+	}
+	private static void init(){ 
+		//设置时区
+	    System.setProperty("user.timezone","Asia/Shanghai"); 
+	    TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
+	}	
+	
+	/**
+	 * 公共日志执行线程池配置
+	 * 
+	 * @return
+	 */
+	@Bean(value = "publicLogTaskExecutor")
+	public Executor publicLogTaskExecutor() {
+		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+		executor.setThreadNamePrefix("PublicLogTaskExecutor");
+		executor.setCorePoolSize(10);
+		executor.setQueueCapacity(200);
+		executor.setMaxPoolSize(100);
+		executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
+		executor.initialize();
+		return executor;
+	}
+}

+ 20 - 0
src/main/java/com/xynet/pay/controller/TestController.java

@@ -0,0 +1,20 @@
+package com.xynet.pay.controller;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("test")
+public class TestController  {
+	private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+
+
+
+
+	
+
+}

+ 23 - 0
src/main/java/com/xynet/pay/foreignAPI/ApiClient.java

@@ -0,0 +1,23 @@
+package com.xynet.pay.foreignAPI;
+
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import java.util.Map;
+
+@FeignClient("service-api")
+public interface ApiClient {
+	
+	@RequestMapping(value = "/api/updateOrdeGoodsMeitu", method = RequestMethod.POST, consumes = "application/json;charset=UTF-8")
+	Map updateOrdeGoodsMeitu(@RequestBody Map paraMap);
+	
+	/**核减预定数*/
+	@RequestMapping(value="/api/updateOrdeGoodsPlat",method = RequestMethod.POST)
+	 Object updateOrdeGoodsPlat(@RequestBody Map paraMap);
+
+	@RequestMapping(value="/api/amr/socket",method = RequestMethod.POST)
+	Object socket(@RequestBody Map paraMap);
+
+}

+ 29 - 0
src/main/java/com/xynet/pay/spring/SpringContextUtil.java

@@ -0,0 +1,29 @@
+package com.xynet.pay.spring;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SpringContextUtil implements ApplicationContextAware {
+         private static ApplicationContext applicationContext; // Spring应用上下文环境
+
+         /*
+          * 实现了ApplicationContextAware 接口,必须实现该方法;
+          * 通过传递applicationContext参数初始化成员变量applicationContext
+          */
+         public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+               SpringContextUtil.applicationContext = applicationContext;
+         }
+
+         public static ApplicationContext getApplicationContext() {
+                return applicationContext;
+         }
+
+         @SuppressWarnings("unchecked")
+         public static <T> T getBean(String name) throws BeansException {
+               return (T) applicationContext.getBean(name);
+         }
+
+}

+ 127 - 0
src/main/java/com/xynet/pay/util/AESUtil.java

@@ -0,0 +1,127 @@
+package com.xynet.pay.util;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Objects;
+
+public class AESUtil {
+    protected static final Logger logger = LoggerFactory.getLogger(AESUtil.class);
+
+    public static void main(String[] args) {
+        String data = "GaiSCUWBym:1588783320:20200403";
+        String key = "2170a8049257678b918fc0048e89bf17";
+        String machineid = "888888";
+        String encrypt = Objects.requireNonNull(encrypt(data, key)).toLowerCase();
+        System.out.println("加密前:" + data);
+        System.out.println("加密后:" + encrypt);
+        String[] cmds = {"curl", "-H", "Host: https://payapi.weixiao.qq.com/", "-H", "authorization: WxToken : " + machineid + encrypt, "-H", "Cache-Control: max-age=0", "--compressed", "https://payapi.weixiao.qq.com/config_v2"};
+        execCurl(cmds);
+    }
+
+    public static String encrypt(String data, String key) {
+
+        String ivString = key.substring(0,16);
+        //偏移量
+        byte[] iv = ivString.getBytes();
+        try {
+            Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");
+            int blockSize = cipher.getBlockSize();
+            byte[] dataBytes = data.getBytes();
+            int length = dataBytes.length;
+            //计算需填充长度
+
+            byte[] plaintext = new byte[length];
+            //填充
+            System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
+            SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
+            //设置偏移量参数
+            IvParameterSpec ivSpec = new IvParameterSpec(iv);
+            cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
+            byte[] encryped = cipher.doFinal(plaintext);
+
+            return parseByte2HexStr(encryped);
+
+        } catch (Exception e) {
+            logger.info("AES加密错误"+e);
+            e.printStackTrace();
+            return null;
+        }
+
+    }
+
+    public static String encrypt(String data, String key,String ivString) {
+
+        //String ivString = key.substring(0,16);
+        //偏移量
+        byte[] iv = ivString.getBytes();
+        try {
+            Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");
+            int blockSize = cipher.getBlockSize();
+            byte[] dataBytes = data.getBytes();
+            int length = dataBytes.length;
+            //计算需填充长度
+
+            byte[] plaintext = new byte[length];
+            //填充
+            System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
+            SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
+            //设置偏移量参数
+            IvParameterSpec ivSpec = new IvParameterSpec(iv);
+            cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
+            byte[] encryped = cipher.doFinal(plaintext);
+
+            return parseByte2HexStr(encryped);
+
+        } catch (Exception e) {
+            logger.info("AES加密错误"+e);
+            e.printStackTrace();
+            return null;
+        }
+
+    }
+
+    public static String parseByte2HexStr(byte[] buf) {
+        StringBuffer sb = new StringBuffer();
+
+        for (int i = 0; i < buf.length; ++i) {
+            String hex = Integer.toHexString(buf[i] & 255);
+            if (hex.length() == 1) {
+                hex = '0' + hex;
+            }
+            sb.append(hex.toUpperCase());
+        }
+
+        return sb.toString();
+    }
+
+
+
+    public static String execCurl(String[] cmds) {
+        ProcessBuilder process = new ProcessBuilder(cmds);
+        Process p;
+        try {
+            p = process.start();
+            BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
+            StringBuilder builder = new StringBuilder();
+            String line = null;
+            while ((line = reader.readLine()) != null) {
+                builder.append(line);
+                builder.append(System.getProperty("line.separator"));
+            }
+            return builder.toString();
+
+        } catch (IOException e) {
+            System.out.print("error");
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+}

+ 144 - 0
src/main/java/com/xynet/pay/util/ArrayUtils.java

@@ -0,0 +1,144 @@
+package com.xynet.pay.util;
+
+/**
+ * <p>Operations on arrays, primitive arrays (like {@code int[]}) and
+ * primitive wrapper arrays (like {@code Integer[]}).
+ *
+ * <p>This class tries to handle {@code null} input gracefully.
+ * An exception will not be thrown for a {@code null}
+ * array input. However, an Object array that contains a {@code null}
+ * element may throw an exception. Each method documents its behaviour.
+ *
+ * <p>#ThreadSafe#
+ * @since 2.0
+ */
+
+public class ArrayUtils {
+
+    /**
+     * An empty immutable {@code byte} array.
+     */
+    public static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
+
+
+    /**
+     * Copies the specified range of the specified array into a new array.
+     * The initial index of the range (<tt>from</tt>) must lie between zero
+     * and <tt>original.length</tt>, inclusive.  The value at
+     * <tt>original[from]</tt> is placed into the initial element of the copy
+     * (unless <tt>from == original.length</tt> or <tt>from == to</tt>).
+     * Values from subsequent elements in the original array are placed into
+     * subsequent elements in the copy.  The final index of the range
+     * (<tt>to</tt>), which must be greater than or equal to <tt>from</tt>,
+     * may be greater than <tt>original.length</tt>, in which case
+     * <tt>(byte)0</tt> is placed in all elements of the copy whose index is
+     * greater than or equal to <tt>original.length - from</tt>.  The length
+     * of the returned array will be <tt>to - from</tt>.
+     *
+     * @param original the array from which a range is to be copied
+     * @param from the initial index of the range to be copied, inclusive
+     * @param to the final index of the range to be copied, exclusive.
+     *     (This index may lie outside the array.)
+     * @return a new array containing the specified range from the original array,
+     *     truncated or padded with zeros to obtain the required length
+     * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
+     *     or {@code from > original.length}
+     * @throws IllegalArgumentException if <tt>from &gt; to</tt>
+     * @throws NullPointerException if <tt>original</tt> is null
+     * @since 1.6
+     */
+    public static byte[] copyOfRange(byte[] original, int from, int to) {
+        int newLength = to - from;
+        if (newLength < 0)
+            throw new IllegalArgumentException(from + " > " + to);
+        byte[] copy = new byte[newLength];
+        System.arraycopy(original, from, copy, 0,
+                Math.min(original.length - from, newLength));
+        return copy;
+    }
+
+    /**
+     * <p>Produces a new {@code byte} array containing the elements
+     * between the start and end indices.
+     *
+     * <p>The start index is inclusive, the end index exclusive.
+     * Null array input produces null output.
+     *
+     * @param array  the array
+     * @param startIndexInclusive  the starting index. Undervalue (&lt;0)
+     *      is promoted to 0, overvalue (&gt;array.length) results
+     *      in an empty array.
+     * @param endIndexExclusive  elements up to endIndex-1 are present in the
+     *      returned subarray. Undervalue (&lt; startIndex) produces
+     *      empty array, overvalue (&gt;array.length) is demoted to
+     *      array length.
+     * @return a new array containing the elements between
+     *      the start and end indices.
+     * @since 2.1
+     */
+    public static byte[] subarray(final byte[] array, int startIndexInclusive, int endIndexExclusive) {
+        if (array == null) {
+            return null;
+        }
+        if (startIndexInclusive < 0) {
+            startIndexInclusive = 0;
+        }
+        if (endIndexExclusive > array.length) {
+            endIndexExclusive = array.length;
+        }
+        final int newSize = endIndexExclusive - startIndexInclusive;
+        if (newSize <= 0) {
+            return EMPTY_BYTE_ARRAY;
+        }
+
+        final byte[] subarray = new byte[newSize];
+        System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
+        return subarray;
+    }
+
+    /**
+     * <p>Adds all the elements of the given arrays into a new array.
+     * <p>The new array contains all of the element of {@code array1} followed
+     * by all of the elements {@code array2}. When an array is returned, it is always
+     * a new array.
+     *
+     * <pre>
+     * ArrayUtils.addAll(array1, null)   = cloned copy of array1
+     * ArrayUtils.addAll(null, array2)   = cloned copy of array2
+     * ArrayUtils.addAll([], [])         = []
+     * </pre>
+     *
+     * @param array1  the first array whose elements are added to the new array.
+     * @param array2  the second array whose elements are added to the new array.
+     * @return The new byte[] array.
+     * @since 2.1
+     */
+    public static byte[] addAll(final byte[] array1, final byte... array2) {
+        if (array1 == null) {
+            return clone(array2);
+        } else if (array2 == null) {
+            return clone(array1);
+        }
+        final byte[] joinedArray = new byte[array1.length + array2.length];
+        System.arraycopy(array1, 0, joinedArray, 0, array1.length);
+        System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
+        return joinedArray;
+    }
+
+    /**
+     * <p>Clones an array returning a typecast result and handling
+     * {@code null}.
+     *
+     * <p>This method returns {@code null} for a {@code null} input array.
+     *
+     * @param array  the array to clone, may be {@code null}
+     * @return the cloned array, {@code null} if {@code null} input
+     */
+    public static byte[] clone(final byte[] array) {
+        if (array == null) {
+            return null;
+        }
+        return array.clone();
+    }
+
+}

+ 136 - 0
src/main/java/com/xynet/pay/util/Base64Utils.java

@@ -0,0 +1,136 @@
+package com.xynet.pay.util;
+
+
+import sun.misc.BASE64Encoder;
+
+import java.io.*;
+
+
+/**
+ * BASE64编码解码工具包
+ *
+ * @author IceWee
+ * @date 2012-5-19
+ * @version 1.0
+ */
+public class Base64Utils {
+
+    /**
+     * 文件读取缓冲区大小
+     */
+    private static final int CACHE_SIZE = 1024;
+
+    /**
+     * <p>
+     * BASE64字符串解码为二进制数据
+     * </p>
+     *
+     * @param base64
+     * @return
+     * @throws Exception
+     */
+    public static byte[] decode(String base64) throws Exception {
+    	return new sun.misc.BASE64Decoder().decodeBuffer(base64) ; //Base64.decodeBase64(base64);
+    }
+
+    /**
+     * <p>
+     * 二进制数据编码为BASE64字符串
+     * </p>
+     *
+     * @param bytes
+     * @return
+     * @throws Exception
+     */
+    public static String encode(byte[] bytes) throws Exception {
+    	//return Base64.encodeBase64String(bytes);
+    	return new BASE64Encoder().encode(bytes);
+    }
+
+    /**
+     * <p>
+     * 将文件编码为BASE64字符串
+     * </p>
+     * <p>
+     * 大文件慎用,可能会导致内存溢出
+     * </p>
+     *
+     * @param filePath 文件绝对路径
+     * @return
+     * @throws Exception
+     */
+    public static String encodeFile(String filePath) throws Exception {
+        byte[] bytes = fileToByte(filePath);
+        return encode(bytes);
+    }
+
+    /**
+     * <p>
+     * BASE64字符串转回文件
+     * </p>
+     *
+     * @param filePath 文件绝对路径
+     * @param base64 编码字符串
+     * @throws Exception
+     */
+    public static void decodeToFile(String filePath, String base64) throws Exception {
+        byte[] bytes = decode(base64);
+        byteArrayToFile(bytes, filePath);
+    }
+
+    /**
+     * <p>
+     * 文件转换为二进制数组
+     * </p>
+     *
+     * @param filePath 文件路径
+     * @return
+     * @throws Exception
+     */
+    public static byte[] fileToByte(String filePath) throws Exception {
+        byte[] data = new byte[0];
+        File file = new File(filePath);
+        if (file.exists()) {
+            FileInputStream in = new FileInputStream(file);
+            ByteArrayOutputStream out = new ByteArrayOutputStream(2048);
+            byte[] cache = new byte[CACHE_SIZE];
+            int nRead = 0;
+            while ((nRead = in.read(cache)) != -1) {
+                out.write(cache, 0, nRead);
+                out.flush();
+            }
+            out.close();
+            in.close();
+            data = out.toByteArray();
+        }
+        return data;
+    }
+
+    /**
+     * <p>
+     * 二进制数据写文件
+     * </p>
+     *
+     * @param bytes 二进制数据
+     * @param filePath 文件生成目录
+     */
+    public static void byteArrayToFile(byte[] bytes, String filePath) throws Exception {
+        InputStream in = new ByteArrayInputStream(bytes);
+        File destFile = new File(filePath);
+        if (!destFile.getParentFile().exists()) {
+            destFile.getParentFile().mkdirs();
+        }
+        destFile.createNewFile();
+        OutputStream out = new FileOutputStream(destFile);
+        byte[] cache = new byte[CACHE_SIZE];
+        int nRead = 0;
+        while ((nRead = in.read(cache)) != -1) {
+            out.write(cache, 0, nRead);
+            out.flush();
+        }
+        out.close();
+        in.close();
+    }
+
+
+}

+ 150 - 0
src/main/java/com/xynet/pay/util/ConvertData.java

@@ -0,0 +1,150 @@
+package com.xynet.pay.util;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.Map;
+import java.util.TreeMap;
+
+public class ConvertData {
+
+	private final static String EQUAL_SIGN = "=";
+	private final static String AND_SIGN = "&";
+	
+	/**
+	 * 组装验签的明文(按自然树进行组装),用于签名
+	 * 
+	 * @param treeMap
+	 * @return
+	 */
+	public static String convertToSign(TreeMap<String, String> treeMap) {
+		
+		StringBuilder plainTextBuffer = new StringBuilder();
+		for (String key : treeMap.keySet()) {
+			if ("signature".equals(key)) {
+				// 签名域本身不是明文内容之一,所以要过滤掉
+				continue;
+			}
+			String value = treeMap.get(key);
+			//空值或空字符串不参与签名验签运算
+			if(!isEmpty(value)){
+				plainTextBuffer.append(key);
+				plainTextBuffer.append(EQUAL_SIGN);
+				try {
+					plainTextBuffer.append(URLEncoder.encode(value, "UTF-8"));
+				} catch (UnsupportedEncodingException e) {
+					throw new RuntimeException(e);
+				}
+				plainTextBuffer.append(AND_SIGN);
+			}
+		}
+		
+		if(plainTextBuffer.length()<1)
+			return plainTextBuffer.toString();
+		
+		return plainTextBuffer.substring(0, plainTextBuffer.length() - 1);
+	}
+	
+	/**
+	 * 组装验签的明文(按自然树进行组装),用于验签
+	 * 
+	 * @param treeMap
+	 * @return
+	 */
+	public static String convertToVerify(TreeMap<String, String> treeMap) {
+		
+		StringBuilder plainTextBuffer = new StringBuilder();
+		for (String key : treeMap.keySet()) {
+			if ("signature".equals(key)) {
+				// 签名域本身不是明文内容之一,所以要过滤掉
+				continue;
+			}
+			String value = treeMap.get(key);
+			//空值或空字符串不参与签名验签运算
+			if(!isEmpty(value)){
+				plainTextBuffer.append(key);
+				plainTextBuffer.append(EQUAL_SIGN);
+				try {
+					plainTextBuffer.append(URLEncoder.encode(value, "UTF-8"));
+				} catch (UnsupportedEncodingException e) {
+					throw new RuntimeException(e);
+				}
+				plainTextBuffer.append(AND_SIGN);
+			}
+		}
+		
+		if(plainTextBuffer.length()<1)
+			return plainTextBuffer.toString();
+		
+		return plainTextBuffer.substring(0, plainTextBuffer.length() - 1);
+	}
+	
+	/**
+	 * 转换为接口对应的应答报文(按接口文档进行组装)
+	 * 
+	 * @param map
+	 * @return
+	 */
+	public static String convertToMessage(Map<String, String> map) {
+
+		StringBuilder tempMessage = new StringBuilder();
+		for (String key : map.keySet()) {
+			String value = map.get(key);
+			if(!isEmpty(value)){
+				tempMessage.append(key);
+				tempMessage.append(EQUAL_SIGN);
+				try {
+					tempMessage.append(URLEncoder.encode(value, "UTF-8"));
+				} catch (UnsupportedEncodingException e) {
+					throw new RuntimeException(e);
+				}
+				tempMessage.append(AND_SIGN);
+			}
+		}
+		
+		if(tempMessage.length()<1)
+			return tempMessage.toString();
+		
+		return tempMessage.substring(0, tempMessage.length() - 1);
+	}
+	
+	/**
+	 * 将key=value&key=value的字符串转成map
+	 * 
+	 * @param message
+	 * @return
+	 */
+	public static Map<String, String> convertStringToMap(String message) {
+		Map<String, String> map = new TreeMap<String, String>();
+		boolean hasError = false;
+		String[] ss = message.split("&");
+		for (String s : ss) {
+			if (s == null || s.isEmpty()) {
+				continue;
+			}
+			String[] kv = s.split("=");
+			if (kv.length == 2) {
+				try {
+					map.put(kv[0], URLDecoder.decode(kv[1], "UTF-8"));
+				} catch (UnsupportedEncodingException e) {
+				}
+			} else {
+				hasError = true;
+			}
+		}
+		if (hasError) {
+			System.out.println("解析UPMP报文可能出现异常。报文是【{"+message+"}】");
+		}
+		return map;
+	}
+	
+	/**
+	 * 判断字符串是否为空。会自动trim。
+	 * 
+	 * @param str
+	 * @return
+	 */
+	private static boolean isEmpty(String str) {
+		return (str == null || str.trim().isEmpty());
+	}
+}

+ 410 - 0
src/main/java/com/xynet/pay/util/DateUtil.java

@@ -0,0 +1,410 @@
+package com.xynet.pay.util;
+
+import java.text.ParseException;
+import java.text.ParsePosition;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+
+/**
+ * Copyright © 2018 xynet Tech Ltd. All rights reserved
+ * @author: sund
+ * @date: 2018年2月9日 下午3:21:58
+ * @remark:日期工具类
+ */
+public class DateUtil {
+	static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+	static SimpleDateFormat ymd = new SimpleDateFormat("yyyy-MM-dd");//yyyyMMddHHmmss
+	static SimpleDateFormat ymdhms = new SimpleDateFormat("yyyyMMddHHmmss");
+	static SimpleDateFormat yms = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
+	static SimpleDateFormat yms2 = new SimpleDateFormat("YYYYMMDD'T'HHMMSS'Z'");
+
+	/**
+	 * 将Date类型转换为字符串
+	 * 
+	 * @param date
+	 *            日期类型
+	 * @return 日期字符串
+	 */
+	public static String format(Date date) {
+		return format(date, "yyyy-MM-dd HH:mm:ss");
+	}
+
+	/**
+	 * 将Date类型转换为字符串
+	 * 
+	 * @param date
+	 *            日期类型
+	 * @param pattern
+	 *            字符串格式
+	 * @return 日期字符串
+	 */
+	public static String format(Date date, String pattern) {
+		if (date == null) {
+			return "null";
+		}
+		if (pattern == null || pattern.equals("") || pattern.equals("null")) {
+			pattern = "yyyy-MM-dd HH:mm:ss";
+		}
+		return new SimpleDateFormat(pattern).format(date);
+	}
+
+	/**
+	 * 将字符串转换为Date类型
+	 *
+	 * @param date
+	 *            字符串类型
+	 * @return 日期类型(yyyy-MM-dd HH:mm:ss)
+	 */
+	public static Date format(String date) {
+		return format(date, null);
+	}
+
+	/**
+	 * 将字符串转换为Date类型
+	 *
+	 * @param date
+	 *            字符串类型
+	 * @param pattern
+	 *            格式
+	 * @return 日期类型
+	 */
+	public static Date format(String date, String pattern) {
+		if (pattern == null || pattern.equals("") || pattern.equals("null")) {
+			pattern = "yyyy-MM-dd HH:mm:ss";
+		}
+		if (date == null || date.equals("") || date.equals("null")) {
+			return new Date();
+		}
+		Date d = null;
+		try {
+			d = new SimpleDateFormat(pattern).parse(date);
+		} catch (ParseException pe) {
+		}
+		return d;
+	}
+
+	 // 两天之间的天数
+	public static int daysBetween(String startDate, String endDate)
+			throws ParseException {
+		 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		 Date start = sdf.parse(startDate);
+		 Date end = sdf.parse(endDate);
+		 return  daysBetween(end,start);
+	}
+	
+	/*
+	 * 求两个日期之间的天数
+	 */
+	public static int daysBetween(Date startDate,Date endDate)
+	{
+		//一天24小时*60分钟*60秒*1000毫秒
+		return  (int) ((endDate.getTime() - 
+				startDate.getTime()-10) /(24*60*60*1000));
+	}
+	
+	/*
+	 * 时间格式的转换
+	 */
+	public static Date formatUtc(String str)
+	{
+		String strTime = str.replace("Z", " UTC");
+		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
+		Date dateTime = null;
+		try {
+			dateTime = format.parse(strTime);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return  dateTime;
+	}
+	
+	/*
+	 * 求某一日期加N个小时后的时间
+	 */
+	public static String dateAddHours(Date startDate,int hours,String pattern)
+	{
+		//一天24小时*60分钟*60秒*1000毫秒
+		return format(new Date(startDate.getTime()+hours*60*60*1000),pattern);
+
+	}
+
+
+		/**
+		 * 判断是否在同一个月
+		 * @param startDate yyyy-MM-dd
+		 * @param endDate yyyy-MM-dd
+		 * @return false:不在同一个月内,true在同一个月内
+		 */
+		public static boolean isMonth(String startDate,String endDate){
+			if(margin(startDate, endDate)>31){
+				return false;
+			}
+			int startMonth = Integer.parseInt(startDate.substring(5, 7));
+			int endMonth = Integer.parseInt(endDate.substring(5, 7));
+			if(startMonth==endMonth){
+				return true;
+			}else{
+				return false;
+			}
+		}
+		/**
+		 * 计算开始日期和结束日期差
+		 * @param startDate yyyy-MM-dd
+		 * @param endDate yyyy-MM-dd
+		 * @return
+		 */
+		private static int margin(String startDate,String endDate){
+			ParsePosition pos = new ParsePosition(0);
+			ParsePosition pos2 = new ParsePosition(0);
+			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+			Date ds = sdf.parse(startDate, pos);
+			Date de = sdf.parse(endDate, pos2);
+			long l = de.getTime()-ds.getTime();
+			int margin = (int)(l/24*60*60*1000);
+			return margin;
+		}
+
+	/**
+	 * 判断时间跨度是否相差一个月
+	 * @param startTime  yyyyMMdd
+	 * @param endTime
+	 */
+    public static boolean  isDifference(String startTime,String endTime){
+        SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd");
+        try {
+            Date d1 = f.parse(startTime);
+            Date d2 = f.parse(endTime);
+            //Date d2 = f.parse("20120101");
+            long day = (d2.getTime()-d1.getTime())/1000/60/60/24 + 1;
+            System.out.println("d1和d2相差" + day + "天。");
+            int month = isMaxMonth(startTime);
+            System.out.println(month);
+            if(day > month){
+                return false;
+            }else {
+                return  true;
+            }
+        } catch (ParseException e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 判断这年的某月有多少天
+     * @param startTime 时间  yyyyMMdd
+     * @return
+     */
+    public static int isMaxMonth(String startTime) {
+        int year = 0;
+        int month = 0;
+        int days= 0 ;
+        year = Integer.parseInt(startTime.substring(0, 4));
+        month = Integer.parseInt(startTime.substring(4, 6));
+        switch(month){
+            case 2:
+                boolean flag=(year%4==0&&year%100!=100)||year%400==0;
+                if(flag){
+                    days=29;
+                }else{
+                    days=28;
+                }
+                break;
+            case 4:
+            case 6:
+            case 9:
+            case 11:
+                days=30;
+                break;
+            default:
+                days=31;
+                break;
+        }
+        return days;
+    }
+
+	/**
+	 * 返回序列化
+	 * @param date
+	 * @param index
+	 * @return
+	 */
+	public static int timexlh(Date date,int index) {
+		return (date.getHours()*60+date.getMinutes())/index;
+	}
+
+	/**
+	 *  获取昨天的yyyyMMdd
+
+	 * @param date
+	 * @return
+	 */
+	public static int yesterdayyyMMdd(Date date,int index) {
+		Date yesterday = new Date(date.getTime() - 86400000L*index);
+		SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
+		String time = format.format(yesterday);
+		return Integer.parseInt(time);
+	}
+	/**
+	 *  获取前天的yyyyMMdd
+
+	 * @param date
+	 * @return
+	 */
+	public static int beforeYesterdayyyMMdd(Date date) {
+		Date yesterday = new Date(date.getTime() - 172800000l);
+		SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
+		String time = format.format(yesterday);
+		return Integer.parseInt(time);
+	}
+
+	/**
+	 * 获取今天的yyyyMMdd
+	 * @param date
+	 * @return
+	 */
+	public static int todayyyMMdd(Date date) {
+		SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
+		String time = format.format(date);
+		return Integer.parseInt(time);
+	}
+
+	/*public static void main(String[] args){
+        final BASE64Encoder encoder = new BASE64Encoder();
+        final BASE64Decoder decoder = new BASE64Decoder();
+        final String text = "字串文字sad22";
+        final byte[] textByte;
+        try {
+            textByte = text.getBytes("UTF-8");//5a2X5Liy5paH5a2X.5a2X5Liy5paH5a2XMjI=.5a2X5Liy5paH5a2Xc2FkMjI=
+            final String encodedText = encoder.encode(textByte);
+            System.out.println(encodedText);
+                System.out.println(new String(decoder.decodeBuffer(encodedText), "UTF-8"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }*/
+//编码
+
+
+
+    /**
+     * 时间字符串转intger
+     * @param str
+     * @return
+     */
+    public  static  Integer stringToInt(String str){
+	    try {
+	        //2019-08-08
+            StringBuffer sb = new StringBuffer();
+            String year = str.substring(0, 4);
+            String moth = str.substring(5, 7);
+            String day = str.substring(8, 10);
+            sb.append(year);
+            sb.append(moth);
+            sb.append(day);
+            return Integer.parseInt(sb.toString());
+        }catch (Exception e){
+	        return null;
+        }
+	}
+
+
+	public  static  String toString(String str){
+		try {
+			//2019-08-08
+			StringBuffer sb = new StringBuffer();
+			String year = str.substring(0, 4);
+			String moth = str.substring(4, 6);
+			String day = str.substring(6, 8);
+			String HH = str.substring(8, 10);
+			String mm = str.substring(10, 12);
+			String ss = str.substring(12, 14);
+			sb.append(year).append("-");
+			sb.append(moth).append("-");
+			sb.append(day).append(" ").append(HH).append(":").append(mm).append(":").append(ss);
+			return sb.toString();
+		}catch (Exception e){
+			return null;
+		}
+	}
+
+    /**
+     * 时间转字符串yyyyMMddHHmmss
+     * @param date
+     * @return
+     */
+	public static String dateToString(Date date){
+        String format = ymdhms.format(date);
+        return format;
+    }
+	public static String dateToString2(Date date){
+		String format = yms.format(date);
+		return format;
+	}
+
+	public static String dateToString3(Date date,String s,Integer i){
+		long time = date.getTime() - 24*60*60*1000*i;
+		SimpleDateFormat sdf = new SimpleDateFormat(s);
+		String format = sdf.format(time);
+		return format;
+	}
+
+    public static Date stringToDate(String str) {
+        Date parse = null;
+        try {
+            parse = ymdhms.parse(str);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return parse;
+    }
+
+	/**
+	 * 获取i、月(前,后)的日期
+	 * @param i
+	 * @return
+	 */
+	public static String dateTo(int i,String s) {
+		SimpleDateFormat sdf = new SimpleDateFormat(s);
+		Calendar cal = Calendar.getInstance();
+		cal.add(Calendar.MONTH, i);
+		Date time = cal.getTime();
+		String format = sdf.format(time);
+		return  format;
+	}
+
+    public static void main(String[] args) throws ParseException {
+       /* Date date = new Date();
+        System.out.println("本地时间Date: " + date);
+        TimeZone tz = TimeZone.getTimeZone("UTC");
+        DateFormat df = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'");
+        df.setTimeZone(tz);  //获取时区
+        String nowAsISO = df.format(date);
+        System.out.println("本地时间Date--->UTC时间String:" + nowAsISO);*/
+        String transAmt = "1.22";//支付金额
+        double v = Double.parseDouble(transAmt);
+        int fee = (int) (v*100);
+        System.out.println(fee);
+    }
+
+    /**
+	 * 判断时间是否在两个时间点之间
+	 * @param time
+	 * @return
+	 * @throws ParseException
+	 */
+	public static boolean isDaysBetween(String time,String starttime,String endtime)
+			throws ParseException {		
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		Date start = sdf.parse(starttime);
+		Date end = sdf.parse(endtime);
+		Date now = sdf.parse(time);
+		if ((now.compareTo(start) == 1 || (now.compareTo(start) == 0))
+				&& end.compareTo(now) == 1) {
+			return true;
+		}
+		return false;
+	}
+
+}

+ 166 - 0
src/main/java/com/xynet/pay/util/FileUtils.java

@@ -0,0 +1,166 @@
+package com.xynet.pay.util;
+
+import java.io.*;
+
+/**
+ * Copyright (C) BlakeQu All Rights Reserved <blakequ@gmail.com>
+ * <p>
+ * Licensed under the blakequ.com License, Version 1.0 (the "License");
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * <p>
+ * author  : quhao <blakequ@gmail.com> <br>
+ * date     : 2017/2/22 21:08 <br>
+ * last modify author : <br>
+ * version : 1.0 <br>
+ * description:
+ */
+
+public class FileUtils {
+
+    /**
+     * 注意保持加密内容的时候不能先将byte数组转换为string,因为转换为string的时候,后面会默认加上结束符,造成解密失败,故而在读取和写入都使用byte数组
+     * @param data
+     * @param filePath
+     */
+    public static boolean saveDataToFile(byte[] data, File filePath){
+        if (data == null || filePath == null){
+            throw  new IllegalArgumentException("Input data is null or output path is null");
+        }
+        boolean result = false;
+        try {
+            result = write(filePath, data, false);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+    /**
+     * 从文件读取byte数组
+     * @param sourceFile
+     * @return
+     * @throws FileNotFoundException
+     */
+    public static byte[] getDataFromFile(File sourceFile) throws FileNotFoundException {
+        return getBytesFromInputStream(new FileInputStream(sourceFile));
+    }
+
+    /**
+     * 从输入流中读取byte数组
+     * String filePath
+     */
+    public static byte[] getBytesFromInputStream(InputStream inputStream){
+        byte[] buffer = null;
+        ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
+        byte[] b = new byte[1000];
+        try {
+            int n;
+            while ((n = inputStream.read(b)) != -1) {
+                bos.write(b, 0, n);
+            }
+            buffer = bos.toByteArray();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                inputStream.close();
+                bos.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return buffer;
+    }
+
+
+    /**
+     * 读取密钥信息
+     *
+     * @param in
+     * @return
+     * @throws IOException
+     */
+    public static String readString(InputStream in) throws IOException {
+        BufferedReader br = new BufferedReader(new InputStreamReader(in));
+        String readLine = null;
+        StringBuilder sb = new StringBuilder();
+        while ((readLine = br.readLine()) != null) {
+            if (readLine.charAt(0) == '-') {
+                continue;
+            } else {
+                sb.append(readLine);
+                sb.append('\r');
+            }
+        }
+
+        return sb.toString();
+    }
+
+    /**
+     * 将内容写文件
+     * @param file
+     * @param content
+     * @param append
+     * @return
+     */
+    private static boolean write(File file, byte[] content, boolean append) {
+        if(file != null && content != null) {
+            if(!file.exists()) {
+                file = createNewFile(file);
+            }
+
+            FileOutputStream ops = null;
+
+            try {
+                ops = new FileOutputStream(file, append);
+                ops.write(content);
+                return true;
+            } catch (Exception var15) {
+                var15.printStackTrace();
+            } finally {
+                try {
+                    ops.close();
+                } catch (IOException var14) {
+                    var14.printStackTrace();
+                }
+                ops = null;
+            }
+
+            return false;
+        }
+        return false;
+    }
+
+    /**
+     * 创建新文件
+     * @param file
+     * @return
+     */
+    private static File createNewFile(File file) {
+        try {
+            if(file.exists()) {
+                return file;
+            } else {
+                File e = file.getParentFile();
+                if(!e.exists()) {
+                    e.mkdirs();
+                }
+
+                if(!file.exists()) {
+                    file.createNewFile();
+                }
+
+                return file;
+            }
+        } catch (IOException var2) {
+            var2.printStackTrace();
+            return null;
+        }
+    }
+}

+ 160 - 0
src/main/java/com/xynet/pay/util/HMAC_SHA1Utils.java

@@ -0,0 +1,160 @@
+package com.xynet.pay.util;
+
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.*;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+
+import org.apache.commons.codec.binary.Base64;
+
+/**
+ * HMAC_SHA1 Sign生成器. 
+ *
+ * 需要apache.commons.codec包 
+ *
+ */
+public class HMAC_SHA1Utils {
+
+    private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";
+
+    /**
+     * 使用 HMAC-SHA1 签名方法对data进行签名 
+     *
+     * @param data
+     *            被签名的字符串 
+     * @param key
+     *            密钥      
+     * @return
+    加密后的字符串
+     */
+    public static String genHMAC(String data, String key) {
+        byte[] result = null;
+        try {
+            //根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称    
+            SecretKeySpec signinKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM);
+            //生成一个指定 Mac 算法 的 Mac 对象    
+            Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
+            //用给定密钥初始化 Mac 对象    
+            mac.init(signinKey);
+            //完成 Mac 操作     
+            byte[] rawHmac = mac.doFinal(data.getBytes());
+            result = Base64.encodeBase64(rawHmac);
+
+        } catch (NoSuchAlgorithmException e) {
+            System.err.println(e.getMessage());
+        } catch (InvalidKeyException e) {
+            System.err.println(e.getMessage());
+        }
+        if (null != result) {
+            return new String(result);
+        } else {
+            return null;
+        }
+    }
+    /**
+     * 测试 
+     * @param args
+     */
+    /*public static void main(String[] args) {
+        String genHMAC = genHMAC("111", "2222");
+        System.out.println(genHMAC.length()); //28
+        System.out.println(genHMAC);  // O5fviq3DGCB5NrHcl/JP6+xxF6s=
+    }*/
+
+    public static void main(String[] args){//OmmcT/30A1TyGAxjNE/9bdM0OAk=
+        String key = "YTVhNzUxYzAtOWU3My00NTM5LWFlYWQtNjFiMjhlOGEwZWI2MjAyMDA1MTgxMTEx";
+        String secret = "NDdkYWE3ZTMtOTM3NC00YWQ1LWE1ZWMtNGRkOTg1MzVkMzk5MjAyMDA1MTgxMTEx";
+        Map map = new HashMap();
+        List<Map> invoices = new ArrayList<>();
+        Date date = new Date();
+        Map invoices_map = new HashMap();
+        invoices_map.put("order_id","200519140100001433");
+        invoices_map.put("invoice_date",DateUtil.dateToString3(date,"yyyyMMdd",0));
+        invoices_map.put("invoice_time",DateUtil.dateToString3(date,"HHmmss",0));
+        invoices_map.put("tax_type","3");
+        invoices_map.put("tax_amount",0);
+        invoices_map.put("sales_amount",0);
+        invoices_map.put("tax_rate",0.05);
+        invoices_map.put("free_tax_sales_amount",0);
+        invoices_map.put("zero_tax_sales_amount",0);
+        invoices_map.put("total_amount",1234);
+        invoices_map.put("main_remark","测试");
+        invoices_map.put("print_mark","Y");
+        invoices_map.put("random_number","AAAA");
+
+        Map buyer = new HashMap();
+        buyer.put("identifier","00000000");
+        buyer.put("name","兴元网络");
+        buyer.put("email_address","282929986@qq.com");
+        invoices_map.put("buyer",buyer);
+        invoices.add(invoices_map);
+        map.put("invoices",invoices);
+        List<Map> details1 = new ArrayList<>();
+        Map details = new HashMap();
+        details.put("description","FOOD");
+        details.put("quantity",1);
+        details.put("sequence_number","1");
+        details.put("unit_price",1234);
+        details.put("amount",1234);
+        details1.add(details);
+        invoices_map.put("details",details1);
+
+       String data = "{\n" +
+                "\t\"invoices\": [{\n" +
+                "\t\t\"order_id\": \"200519140100001434\",\n" +
+                "\t\t\"buyer\": {\n" +
+                "\t\t\t\"identifier\": \"53567686\",\n" +
+                "\t\t\t\"name\": \"兴元网络\"\n" +
+                //"\t\t\t\"email_address\": \"282929986@qq.com\"\n" +
+                "\t\t},\n" +
+                "\t\t\"invoice_date\": \"20200520\",\n" +
+                "\t\t\"invoice_time\": \"142022\",\n" +
+                "\t\t\"tax_type\": \"1\",\n" +
+                "\t\t\"tax_rate\": 0.5,\n" +
+                "\t\t\"tax_amount\": 24,\n" +
+                "\t\t\"sales_amount\": 1234,\n" +
+                "\t\t\"free_tax_sales_amount\": 12,\n" +
+                "\t\t\"zero_tax_sales_amount\": 123,\n" +
+                "\t\t\"total_amount\": 1234,\n" +
+                "\t\t\"print_mark\": \"Y\",\n" +
+                "\t\t\"random_number\": \"AAAA\",\n" +
+                "\t\t\"details\": [{\n" +
+                "\t\t\t\"description\": \"FOOD\",\n" +
+                "\t\t\t\"quantity\": 1,\n" +
+                "\t\t\t\"sequence_number\": \"1\",\n" +
+                "\t\t\t\"unit_price\": 1000,\n" +
+                "\t\t\t\"amount\": 245\n" +
+                "\t\t}]\n" +
+                "\t}]\n" +
+                "}";
+
+        long l = System.currentTimeMillis()/1000;
+        Map<String, Object> params = new HashMap<>();
+        params.put("api_key",key);
+        params.put("timestamp",l+"");
+        params.put("auto_assign_invoice_track","true");
+        params.put("invoice",JsonUtils.objectToJson(map));
+
+        TreeMap<String,Object> treeMap = new TreeMap();
+        treeMap.put("api_key",key);
+        treeMap.put("timestamp",l+"");
+        treeMap.put("auto_assign_invoice_track","true");
+        treeMap.put("invoice",JsonUtils.objectToJson(map));
+        String data1 = "";
+
+        for (Map.Entry<String, Object> entry : treeMap.entrySet()) {
+            data1+=entry.getKey()+"="+entry.getValue()+"&";
+        }
+        String substring = data1.substring(0, data1.length() - 1);
+        System.out.println(substring);
+        String genHMAC = genHMAC(substring, secret);
+        System.out.println(genHMAC.length()); //28
+        System.out.println(genHMAC);  // O5fviq3DGCB5NrHcl/JP6+xxF6s=
+        String url = "https://boxtest.ecloudlife.com/customer/api/C0401";
+        System.out.println("参数:"+JsonUtils.objectToJson(params));
+        String s = HttpServiceUtils.sendPost(url, params, genHMAC);
+        System.out.println(s);
+    }
+} 

+ 38 - 0
src/main/java/com/xynet/pay/util/HttpResult.java

@@ -0,0 +1,38 @@
+package com.xynet.pay.util;
+
+public class HttpResult {
+
+	/**
+	 * 状态码
+	 */
+	private Integer status;
+	/**
+	 * 返回数据
+	 */
+	private String data;
+
+	public HttpResult() {
+	}
+
+	public HttpResult(Integer status, String data) {
+		this.status = status;
+		this.data = data;
+	}
+
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+
+	public String getData() {
+		return data;
+	}
+
+	public void setData(String data) {
+		this.data = data;
+	}
+
+}

+ 233 - 0
src/main/java/com/xynet/pay/util/HttpServiceUtils.java

@@ -0,0 +1,233 @@
+package com.xynet.pay.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Map;
+
+/**
+ * @author YanJ
+ * @date 2020/1/9-10:55
+ */
+public class HttpServiceUtils {
+    public static String sendPost(String urlParam, Map<String, String> params){
+        return  sendPost(urlParam,params,"UTF-8","application/json");
+    }
+
+    public static String sendPostMap(String urlParam, Map<String, String> params){
+        return  sendPost(urlParam,params,"UTF-8","application/x-www-form-urlencoded");
+    }
+
+    public static String sendPost(String urlParam, Map<String, String> params, String charset,String contentType) {
+        StringBuffer resultBuffer = null;
+        // 构建请求参数
+        StringBuffer sbParams = new StringBuffer();
+        if (params != null && params.size() > 0) {
+            for (Map.Entry<String, String> e : params.entrySet()) {
+                sbParams.append(e.getKey());
+                sbParams.append("=");
+                sbParams.append(e.getValue());
+                sbParams.append("&");
+            }
+        }
+        URLConnection con = null;
+        OutputStreamWriter osw = null;
+        BufferedReader br = null;
+        try {
+            URL realUrl = new URL(urlParam);
+            // 打开和URL之间的连接
+            con = realUrl.openConnection();
+            // 设置通用的请求属性
+            con.setRequestProperty("accept", "*/*");
+            con.setRequestProperty("connection", "Keep-Alive");
+            con.setRequestProperty("Content-Type", contentType);
+            con.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            // 发送POST请求必须设置如下两行
+            con.setDoOutput(true);
+            con.setDoInput(true);
+            // 获取URLConnection对象对应的输出流
+            osw = new OutputStreamWriter(con.getOutputStream(), charset);
+            if (sbParams != null && sbParams.length() > 0) {
+                // 发送请求参数
+                osw.write(sbParams.substring(0, sbParams.length() - 1));
+                // flush输出流的缓冲
+                osw.flush();
+            }
+            // 定义BufferedReader输入流来读取URL的响应
+            resultBuffer = new StringBuffer();
+            int contentLength = Integer.parseInt(con.getHeaderField("Content-Length"));
+            if (contentLength > 0) {
+                br = new BufferedReader(new InputStreamReader(con.getInputStream(), charset));
+                String temp;
+                while ((temp = br.readLine()) != null) {
+                    resultBuffer.append(temp);
+                }
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        } finally {
+            if (osw != null) {
+                try {
+                    osw.close();
+                } catch (IOException e) {
+                    osw = null;
+                    throw new RuntimeException(e);
+                }
+            }
+            if (br != null) {
+                try {
+                    br.close();
+                } catch (IOException e) {
+                    br = null;
+                    throw new RuntimeException(e);
+                }
+            }
+        }
+        return resultBuffer.toString();
+    }
+
+    public static String sendPostTelecom(String urlParam, Map<String, String> params, String charset,String contentType) {
+        StringBuffer resultBuffer = null;
+        // 构建请求参数
+        StringBuffer sbParams = new StringBuffer();
+        if (params != null && params.size() > 0) {
+            for (Map.Entry<String, String> e : params.entrySet()) {
+                sbParams.append(e.getKey());
+                sbParams.append("=");
+                sbParams.append(e.getValue());
+                sbParams.append("&");
+            }
+        }
+        URLConnection con = null;
+        OutputStreamWriter osw = null;
+        BufferedReader br = null;
+        try {
+            URL realUrl = new URL(urlParam);
+            // 打开和URL之间的连接
+            con = realUrl.openConnection();
+            // 设置通用的请求属性
+            con.setRequestProperty("accept", "*/*");
+            con.setRequestProperty("connection", "Keep-Alive");
+            con.setRequestProperty("Content-Type", contentType);
+            con.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            // 发送POST请求必须设置如下两行
+            con.setDoOutput(true);
+            con.setDoInput(true);
+            // 获取URLConnection对象对应的输出流
+            osw = new OutputStreamWriter(con.getOutputStream(), charset);
+            if (sbParams != null && sbParams.length() > 0) {
+                // 发送请求参数
+                osw.write(sbParams.substring(0, sbParams.length() - 1));
+                // flush输出流的缓冲
+                osw.flush();
+            }
+            // 定义BufferedReader输入流来读取URL的响应
+            resultBuffer = new StringBuffer();
+            //int contentLength = Integer.parseInt(con.getHeaderField("Content-Length"));
+            //if (contentLength > 0) {
+                br = new BufferedReader(new InputStreamReader(con.getInputStream(), charset));
+                String temp;
+                while ((temp = br.readLine()) != null) {
+                    resultBuffer.append(temp);
+                }
+            //}
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        } finally {
+            if (osw != null) {
+                try {
+                    osw.close();
+                } catch (IOException e) {
+                    osw = null;
+                    throw new RuntimeException(e);
+                }
+            }
+            if (br != null) {
+                try {
+                    br.close();
+                } catch (IOException e) {
+                    br = null;
+                    throw new RuntimeException(e);
+                }
+            }
+        }
+        return resultBuffer.toString();
+    }
+
+    /**
+     * 电子发票http工具类
+     * @param urlParam
+     * @param params
+     * @return
+     */
+    public static String sendPost(String urlParam, Map<String,Object> params, String signature) {
+        StringBuffer resultBuffer = null;
+        // 构建请求参数
+        StringBuffer sbParams = new StringBuffer();
+        if (params != null && params.size() > 0) {
+            for (Map.Entry<String, Object> e : params.entrySet()) {
+                sbParams.append(e.getKey());
+                sbParams.append("=");
+                sbParams.append(e.getValue());
+                sbParams.append("&");
+            }
+        }
+        URLConnection con = null;
+        OutputStreamWriter osw = null;
+        BufferedReader br = null;
+        try {
+            URL realUrl = new URL(urlParam);
+            // 打开和URL之间的连接
+            con = realUrl.openConnection();
+            // 设置通用的请求属性
+            con.setRequestProperty("accept", "*/*");
+            con.setRequestProperty("connection", "Keep-Alive");
+            con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+            con.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            // 发送POST请求必须设置如下两行
+            con.setDoOutput(true);
+            con.setDoInput(true);
+            // 获取URLConnection对象对应的输出流
+            osw = new OutputStreamWriter(con.getOutputStream(), "UTF-8");
+            if (sbParams != null && sbParams.length() > 0) {
+                // 发送请求参数
+                osw.write(sbParams.substring(0, sbParams.length() - 1));
+                // flush输出流的缓冲
+                osw.flush();
+            }
+            // 定义BufferedReader输入流来读取URL的响应
+            resultBuffer = new StringBuffer();
+            int contentLength = Integer.parseInt(con.getHeaderField("Content-Length"));
+            if (contentLength > 0) {
+                br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
+                String temp;
+                while ((temp = br.readLine()) != null) {
+                    resultBuffer.append(temp);
+                }
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        } finally {
+            if (osw != null) {
+                try {
+                    osw.close();
+                } catch (IOException e) {
+                    osw = null;
+                    throw new RuntimeException(e);
+                }
+            }
+            if (br != null) {
+                try {
+                    br.close();
+                } catch (IOException e) {
+                    br = null;
+                    throw new RuntimeException(e);
+                }
+            }
+        }
+        return resultBuffer.toString();
+    }
+}

+ 5 - 0
src/main/java/com/xynet/pay/util/HttpsUtils.java

@@ -0,0 +1,5 @@
+package com.xynet.pay.util;
+
+public class HttpsUtils {
+
+}

+ 96 - 0
src/main/java/com/xynet/pay/util/JsonUtils.java

@@ -0,0 +1,96 @@
+package com.xynet.pay.util;
+
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * json工具类
+ * 字符串对象相互转换
+ *
+ * @author YanJ
+ */
+public class JsonUtils {
+
+    // 定义jackson对象
+    private static final ObjectMapper MAPPER = new ObjectMapper();
+
+    /**
+     * 将对象转换成json字符串。
+     * <p>Title: pojoToJson</p>
+     * <p>Description: </p>
+     *
+     * @param data
+     * @return
+     */
+    public static String objectToJson(Object data) {
+        try {
+            String string = MAPPER.writeValueAsString(data);
+            return string;
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 将json结果集转化为对象
+     *
+     * @param jsonData json数据
+     * @param clazz    对象中的object类型
+     * @return
+     */
+    public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {
+        try {
+            T t = MAPPER.readValue(jsonData, beanType);
+            return t;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 将json数据转换成pojo对象list
+     * <p>Title: jsonToList</p>
+     * <p>Description: </p>
+     *
+     * @param jsonData
+     * @param beanType
+     * @return
+     */
+    public static <T> List<T> jsonToList(String jsonData, Class<T> beanType) {
+        JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
+        try {
+            List<T> list = MAPPER.readValue(jsonData, javaType);
+            return list;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+    /**
+     * 将下划线转换为驼峰的形式,例如:user_name-->userName
+     *
+     * @param json
+     * @param clazz
+     * @return
+     * @throws IOException
+     */
+    public static <T> T toSnakeObject(String json, Class<T> clazz) throws IOException {
+        // mapper的configure方法可以设置多种配置(例如:多字段 少字段的处理)
+        //mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+
+        MAPPER.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
+        T reqJson = MAPPER.readValue(json, clazz);
+        return reqJson;
+    }
+
+}

+ 215 - 0
src/main/java/com/xynet/pay/util/MathUtil.java

@@ -0,0 +1,215 @@
+package com.xynet.pay.util;
+
+import java.math.BigDecimal;
+import java.util.Random;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+/**
+ * 
+ * 数学运算工具类:主要包含加、减、乘、除、精度截取及比大小等功能<br>
+ * 此类采用BigDecimal进行基础运算,避免丢失精度以及灵活的控制四舍五入方式<br>
+ * 
+ *
+ */
+public class MathUtil {
+
+    private static Object lock = new Object();
+
+	/**
+	 * 
+	 * 加(结果默认舍入)
+	 * 
+	 * @param d1 数1
+	 * @param d2 数2
+	 * @param scale 小数位位数(四舍五入)
+	 * @return 和
+	 *
+	 */
+	public static BigDecimal add(Number d1, Number d2,int scale) {
+		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
+		BigDecimal bd2 = new BigDecimal(String.valueOf(d2));
+		return bd1.add(bd2).setScale(scale, BigDecimal.ROUND_HALF_UP);
+		
+	}
+	
+
+	/**
+	 * 
+	 * 加(含舍入判断)
+	 * 
+	 * @param d1 数1
+	 * @param d2 数2
+	 * @param scale 小数位位数(四舍五入)
+	 * @param round 舍入方式(boolean值,true则入,false则舍)
+	 * @return 说明入参、返回、异常等
+	 */
+	public static BigDecimal add(Number d1, Number d2,int scale,boolean round) {
+		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
+		BigDecimal bd2 = new BigDecimal(String.valueOf(d2));
+		return bd1.add(bd2).setScale(scale, round?BigDecimal.ROUND_HALF_UP:BigDecimal.ROUND_HALF_DOWN);		
+	}
+
+	/**
+	 * 
+	 * 减(结果默认舍入)
+	 * 
+	 * @param d1 数1
+	 * @param d2 数2
+	 * @param scale 小数位位数(四舍五入)
+	 * @return 差
+	 *
+	 */
+	public static BigDecimal subtract(Number d1, Number d2,int scale) {
+		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
+		BigDecimal bd2 = new BigDecimal(String.valueOf(d2));
+		return bd1.subtract(bd2).setScale(scale, BigDecimal.ROUND_HALF_UP);
+	}
+
+	/**
+	 * 
+	 * 减(含舍入判断)
+	 * 
+	 * @param d1 数1
+	 * @param d2 数2
+	 * @param scale 小数位位数(四舍五入)
+	 * @param round 舍入方式(boolean值,true则入,false则舍)
+	 * @return 差
+	 *
+	 */
+	public static BigDecimal subtract(Number d1, Number d2,int scale,boolean round) {
+		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
+		BigDecimal bd2 = new BigDecimal(String.valueOf(d2));
+		return bd1.subtract(bd2).setScale(scale, round?BigDecimal.ROUND_HALF_UP:BigDecimal.ROUND_HALF_DOWN);
+	}
+
+	/**
+	 * 除(结果默认舍入)
+	 * @param d1 数1
+	 * @param d2 数2
+	 * @param scale 小数位位数(四舍五入)
+	 * @return 商
+	 */
+	public static BigDecimal divide(Number d1, Number d2, int scale) {
+		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
+		BigDecimal bd2 = new BigDecimal(String.valueOf(d2));
+		return bd1.divide(bd2, scale, BigDecimal.ROUND_HALF_UP);
+	}
+	
+	/**
+	 * 除(含舍入判断)
+	 * @param d1 数1
+	 * @param d2 数2
+	 * @param scale 小数位位数(四舍五入)
+	 * @param round 舍入方式(boolean值,true则入,false则舍)
+	 * @return 商
+	 */
+	public static BigDecimal divide(Number d1, Number d2, int scale,boolean round) {
+		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
+		BigDecimal bd2 = new BigDecimal(String.valueOf(d2));
+		return bd1.divide(bd2, scale, round?BigDecimal.ROUND_HALF_UP:BigDecimal.ROUND_HALF_DOWN);
+	}
+	
+	/**
+	 * 乘(结果默认舍入)
+	 * @param d1 数1
+	 * @param d2 数2
+	 * @param scale 小数位位数(四舍五入)
+	 * @return 积
+	 */
+	public static BigDecimal multiply(Number d1, Number d2, int scale) {
+		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
+		BigDecimal bd2 = new BigDecimal(String.valueOf(d2));
+		return bd1.multiply(bd2).setScale(scale, BigDecimal.ROUND_HALF_UP);
+	}
+	
+	/**
+	 * 乘(含舍入判读)
+	 * @param d1 数1
+	 * @param d2 数2
+	 * @param scale 小数位位数(四舍五入)
+	 * @param round 舍入方式(boolean值,true则入,false则舍)
+	 * @return 积
+	 */
+	public static BigDecimal multiply(Number d1, Number d2, int scale,boolean round) {
+		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
+		BigDecimal bd2 = new BigDecimal(String.valueOf(d2));
+		return bd1.multiply(bd2).setScale(scale, round?BigDecimal.ROUND_HALF_UP:BigDecimal.ROUND_HALF_DOWN);
+	}
+	
+	/**
+	 * 判断舍入与否后精确到指定位数
+	 * @param d1 数1
+	 * @param scale 小数位位数(四舍五入)
+	 * @param round 舍入方式(boolean值,true则入,false则舍)
+	 * @return 舍入数
+	 */
+	public static BigDecimal round(Number d1, int scale,boolean round) {
+		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
+		return bd1.setScale(scale, round?BigDecimal.ROUND_HALF_UP:BigDecimal.ROUND_HALF_DOWN);
+	}
+	
+	/**
+	 * 比较两数大小
+	 * @param d1 数1
+	 * @param d2 数2
+	 * @return 0相等,1则d1大,-1则d2大
+	 */
+	public static int checkBigger(Number d1,Number d2){
+		int result = -1;
+		BigDecimal bd1 = new BigDecimal(String.valueOf(d1));
+		BigDecimal bd2 = new BigDecimal(String.valueOf(d2));
+		if(bd1.compareTo(bd2)>0){
+			result = 1;
+		}else if(bd1.compareTo(bd2)==0){
+			result = 0;
+		}
+		return result;
+		
+	}
+	/**获取指定长度随机数*/
+	public static String getRandNum(int charCount) {
+        String charValue = "";
+        for (int i = 0; i < charCount; i++) {
+            char c = (char) (randomInt(0, 10) + '0');
+            charValue += String.valueOf(c);
+        }
+        return charValue;
+    }
+	/**获取指定范围随机数*/
+    public static int randomInt(int from, int to) {
+        Random r = new Random();
+        return from + r.nextInt(to - from);
+    }	
+    
+    /**获取随机字符串*/
+    public static String getRandStr(int charCount){
+    	StringBuffer randBf = new StringBuffer();
+        char[] charAndnum = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray();
+        Random random = new Random(); //用于产生随机数
+        for (int j = 0; j < charCount; j++) {
+        	randBf.append(charAndnum[random.nextInt(62)]);  
+        }
+        
+        return randBf.toString();
+    }
+
+	/*
+    生成唯一主键
+    格式:时间+随机数
+     */
+	public static String genUniqueKey() {
+	    synchronized (lock) {
+            String number = getRandNum(6);
+            String str = System.currentTimeMillis() + number;
+            return str;
+        }
+	}
+
+	public static void main(String[] args){
+        String s = genUniqueKey();
+        System.out.println(s);
+    }
+
+}

+ 459 - 0
src/main/java/com/xynet/pay/util/PKCS7Tool.java

@@ -0,0 +1,459 @@
+package com.xynet.pay.util;
+
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+import sun.security.pkcs.ContentInfo;
+import sun.security.pkcs.PKCS7;
+import sun.security.pkcs.PKCS9Attributes;
+import sun.security.pkcs.SignerInfo;
+
+import javax.security.auth.x500.X500Principal;
+import java.io.*;
+import java.lang.reflect.Array;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.math.BigInteger;
+import java.security.*;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.util.Enumeration;
+
+public class PKCS7Tool {
+
+	/** 签名 */
+	private static final int SIGNER = 1;
+	/** 验证 */
+	private static final int VERIFIER = 2;
+	/** 用途 */
+	private int mode = 0;
+	/** 摘要算法 */
+	private static String digestAlgorithm = "SHA1";
+	/** 签名算法 */
+	private static String signingAlgorithm = "SHA1withRSA";
+	/** 签名证书 */
+	private X509Certificate[] certificates = null;
+	/** 签名私钥 */
+	private PrivateKey privateKey = null;
+	/** 根证书 */
+	private Certificate[] rootCertificates = null;
+	/** JVM 提供商 */
+	private static char jvm = 0;
+	private static Class algorithmId = null;
+	private static Class derValue = null;
+	private static Class objectIdentifier = null;
+	private static Class x500Name = null;
+	private static boolean debug = false;
+
+	/**
+	 * 私有构造方法
+	 */
+	private PKCS7Tool(int mode) {
+		this.mode = mode;
+	}
+
+	/**
+	 * 匹配私钥用法
+	 * 
+	 * @param keyUsage
+	 * @param usage
+	 * @return
+	 */
+	private static boolean matchUsage(boolean[] keyUsage, int usage) {
+		if (usage == 0 || keyUsage == null)
+			return true;
+		for (int i = 0; i < Math.min(keyUsage.length, 32); i++) {
+			if ((usage & (1 << i)) != 0 && !keyUsage[i])
+				return false;
+		}
+		return true;
+	}
+
+	private static void init() {
+		if (jvm != 0)
+			return;
+		String vendor = System.getProperty("java.vm.vendor");
+		if (vendor == null)
+			vendor = "";
+		String vendorUC = vendor.toUpperCase();
+		try {
+			if (vendorUC.indexOf("IBM") >= 0) {
+				jvm = 'I';
+				algorithmId = Class
+						.forName("com.ibm.security.x509.AlgorithmId");
+				derValue = Class.forName("com.ibm.security.util.DerValue");
+				objectIdentifier = Class
+						.forName("com.ibm.security.util.ObjectIdentifier");
+				x500Name = Class.forName("com.ibm.security.x509.X500Name");
+			} else {
+				jvm = 'S';
+				algorithmId = Class.forName("sun.security.x509.AlgorithmId");
+				derValue = Class.forName("sun.security.util.DerValue");
+				objectIdentifier = Class
+						.forName("sun.security.util.ObjectIdentifier");
+				x500Name = Class.forName("sun.security.x509.X500Name");
+			}
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+			System.out.println("Not support JRE: " + vendor);
+			throw new RuntimeException(e);
+		}
+	}
+
+	/**
+	 * 取得签名工具 加载证书库, 取得签名证书链和私钥
+	 * 
+	 * @param keyStorePath
+	 *            证书库路径
+	 * @param keyStorePassword
+	 *            证书库口令
+	 * @param keyPassword
+	 *            证书口令
+	 * @throws GeneralSecurityException
+	 * @throws IOException
+	 */
+	public static PKCS7Tool getSigner(String keyStorePath,
+			String keyStorePassword, String keyPassword)
+			throws GeneralSecurityException, IOException {
+		String type;
+		if (keyStorePath.toLowerCase().endsWith(".pfx"))
+			type = "PKCS12";
+		else if (keyStorePath.toLowerCase().endsWith(".jks"))
+			type = "JKS";
+		else
+			throw new IllegalStateException("Unknown keystore type.");
+		FileInputStream fis = null;
+		try {
+			fis = new FileInputStream(keyStorePath);
+			return getSigner(fis, type, keyStorePassword, keyPassword);
+		} finally {
+			if (fis != null)
+				fis.close();
+		}
+	}
+
+	/**
+	 * 取得签名工具 加载证书库, 取得签名证书链和私钥
+	 * 
+	 * @param keyStorePath
+	 *            证书库路径
+	 * @param keyStorePassword
+	 *            证书库口令
+	 * @param keyPassword
+	 *            证书口令
+	 * @throws GeneralSecurityException
+	 * @throws IOException
+	 */
+	public static PKCS7Tool getSigner(InputStream keyStoreStream, String type,
+			String keyStorePassword, String keyPassword)
+			throws GeneralSecurityException, IOException {
+		init();
+		// 加载证书库
+		KeyStore keyStore = KeyStore.getInstance(type);
+		keyStore.load(keyStoreStream, keyStorePassword.toCharArray());
+		// 在证书库中找到签名私钥
+		Enumeration aliases = keyStore.aliases();
+		String keyAlias = null;
+		if (aliases != null) {
+			while (aliases.hasMoreElements()) {
+				keyAlias = (String) aliases.nextElement();
+				Certificate[] certs = keyStore.getCertificateChain(keyAlias);
+				if (certs == null || certs.length == 0)
+					continue;
+				X509Certificate cert = (X509Certificate) certs[0];
+				if (matchUsage(cert.getKeyUsage(), 1)) {
+					try {
+						cert.checkValidity();
+					} catch (CertificateException e) {
+						continue;
+					}
+					break;
+				}
+			}
+		}
+		// 没有找到可用签名私钥
+		if (keyAlias == null)
+			throw new GeneralSecurityException(
+					"None certificate for sign in this keystore");
+
+		if (debug) {
+			System.out.println(keyAlias);
+			System.out.println("SIGNER =\n"
+					+ new BASE64Encoder().encode(keyStore.getCertificate(
+							keyAlias).getEncoded()));
+		}
+		// 签名证书只能放一张
+		X509Certificate certificate = null;
+		if (keyStore.isKeyEntry(keyAlias)
+				|| keyStore.isCertificateEntry(keyAlias)) {
+			certificate = (X509Certificate) keyStore.getCertificate(keyAlias);
+		} else {
+			throw new GeneralSecurityException(keyAlias
+					+ " is unknown to this keystore");
+		}
+
+		PrivateKey privateKey = (PrivateKey) keyStore.getKey(keyAlias,
+				keyPassword.toCharArray());
+		// 没有私钥抛异常
+		if (privateKey == null) {
+			throw new GeneralSecurityException(keyAlias
+					+ " could not be accessed");
+		}
+
+		PKCS7Tool tool = new PKCS7Tool(SIGNER);
+		tool.certificates = new X509Certificate[] { certificate };
+		tool.privateKey = privateKey;
+		return tool;
+	}
+
+	/**
+	 * 取得验签名工具 加载信任根证书
+	 * 
+	 * @param rootCertificatePath
+	 *            根证书路径
+	 * @throws GeneralSecurityException
+	 * @throws IOException
+	 */
+	public static PKCS7Tool getVerifier(String rootCertificatePath)
+			throws GeneralSecurityException, IOException {
+		String type;
+		if (rootCertificatePath.toLowerCase().endsWith(".p7b"))
+			type = "PKCS7";
+		else if (rootCertificatePath.toLowerCase().endsWith(".cer"))
+			type = "DER";
+		else
+			throw new IllegalStateException("Unknown rootstore type.");
+		FileInputStream fis = null;
+		try {
+			fis = new FileInputStream(rootCertificatePath);
+			return getVerifier(fis, type);
+		} finally {
+			if (fis != null)
+				fis.close();
+		}
+	}
+
+	/**
+	 * 取得验签名工具 加载信任根证书
+	 * 
+	 * @param rootCertStresm
+	 *            根证书输入流
+	 * @throws GeneralSecurityException
+	 * @throws IOException
+	 */
+	public static PKCS7Tool getVerifier(InputStream rootCertStream, String type)
+			throws GeneralSecurityException, IOException {
+		init();
+		// 加载根证书
+		Certificate[] rootCertificates = null;
+
+		CertificateFactory certificatefactory = CertificateFactory
+				.getInstance("X.509");
+		if ("DER".equals(type)) {
+			try {
+				rootCertificates = new Certificate[] { certificatefactory
+						.generateCertificate(rootCertStream) };
+			} catch (Exception exception) {
+				if (debug)
+					exception.printStackTrace();
+				InputStream is = new ByteArrayInputStream(
+						new BASE64Decoder().decodeBuffer(rootCertStream));
+				rootCertificates = new Certificate[] { certificatefactory
+						.generateCertificate(is) };
+			}
+		} else if ("PKCS7".equals(type)) {
+			PKCS7 p7;
+			byte[] roots = readData(rootCertStream);
+			try {
+				p7 = new PKCS7(roots);
+			} catch (Exception exception) {
+				roots = new BASE64Decoder().decodeBuffer(new String(roots));
+				p7 = new PKCS7(roots);
+			}
+			rootCertificates = p7.getCertificates();
+		} else
+			throw new IllegalStateException("Unknown root certificate(s) type.");
+
+		PKCS7Tool tool = new PKCS7Tool(VERIFIER);
+		tool.rootCertificates = rootCertificates;
+		return tool;
+	}
+
+	/**
+	 * 签名
+	 * 
+	 * @param data
+	 *            数据
+	 * @return signature 签名结果
+	 * @throws GeneralSecurityException
+	 * @throws IOException
+	 * @throws IllegalArgumentException
+	 */
+	public String sign(byte[] data) throws Exception {
+		if (mode != SIGNER)
+			throw new IllegalStateException(
+					"call a PKCS7Tool instance not for signature.");
+
+		Signature signer = Signature.getInstance(signingAlgorithm);
+		signer.initSign(privateKey);
+		signer.update(data, 0, data.length);
+		byte[] signedAttributes = signer.sign();
+
+		ContentInfo contentInfo = null;
+		Field data_oidField = ContentInfo.class.getField("DATA_OID");
+		Object data_oid = data_oidField.get(null);
+		Constructor<ContentInfo> contentInfoConstructor = ContentInfo.class
+				.getConstructor(new Class[] { data_oid.getClass(), derValue });
+		contentInfo = contentInfoConstructor
+				.newInstance(new Object[] { data_oid, null });
+		// 根证书
+		X509Certificate x509 = certificates[certificates.length - 1];
+		BigInteger serial = x509.getSerialNumber();
+		// X500Name
+		Constructor x500NameConstructor = x500Name
+				.getConstructor(new Class[] { String.class });
+		Object x500NameObject = x500NameConstructor
+				.newInstance(new Object[] { x509.getIssuerDN().getName() });
+		// AlgorithmId
+		Method algorithmIdGet = algorithmId.getMethod("get",
+				new Class[] { String.class });
+		Object digestAlgorithmId = algorithmIdGet.invoke(null,
+				new Object[] { digestAlgorithm });
+		Field algorithmIdfield = algorithmId.getField("RSAEncryption_oid");
+		Object rsaOid = algorithmIdfield.get(null);
+		Constructor algorithmConstructor = algorithmId
+				.getConstructor(new Class[] { objectIdentifier });
+		Object algorithmRsaOid = algorithmConstructor
+				.newInstance(new Object[] { rsaOid });
+		// SignerInfo
+		Constructor<SignerInfo> signerInfoConstructor = SignerInfo.class
+				.getConstructor(new Class[] { x500Name, BigInteger.class,
+						algorithmId, PKCS9Attributes.class, algorithmId,
+						byte[].class, PKCS9Attributes.class });
+		// 签名信息
+		SignerInfo si = signerInfoConstructor
+				.newInstance(new Object[] { x500NameObject,// X500Name,
+															// issuerName,
+						serial, // x509.getSerialNumber(), BigInteger serial,
+						digestAlgorithmId, // AlgorithmId, digestAlgorithmId,
+						null, // PKCS9Attributes, authenticatedAttributes,
+						algorithmRsaOid, // AlgorithmId,
+											// digestEncryptionAlgorithmId,
+						signedAttributes, // byte[] encryptedDigest,
+						null // PKCS9Attributes unauthenticatedAttributes)
+				});
+
+		SignerInfo[] signerInfos = { si };
+
+		// 构造PKCS7数据
+		Object digestAlgorithmIds = Array.newInstance(algorithmId, 1);
+		Array.set(digestAlgorithmIds, 0, digestAlgorithmId);
+		// PKCS7
+		Constructor<PKCS7> pkcs7Constructor = PKCS7.class.getConstructor(new Class[] {
+				digestAlgorithmIds.getClass(), ContentInfo.class,
+				X509Certificate[].class, signerInfos.getClass() });
+		PKCS7 p7 = pkcs7Constructor.newInstance(new Object[] {
+				digestAlgorithmIds, contentInfo, certificates, signerInfos });
+
+		ByteArrayOutputStream baout = new ByteArrayOutputStream();
+		p7.encodeSignedData(baout);
+		// Base64编码
+		return (new BASE64Encoder()).encode(baout.toByteArray());
+	}
+
+	/**
+	 * 验证签名(无CRL)
+	 * 
+	 * @param signature
+	 *            签名签名结果
+	 * @param data
+	 *            被签名数据
+	 * @param dn
+	 *            签名证书dn, 如果为空则不做匹配验证
+	 * @throws IOException
+	 * @throws NoSuchAlgorithmException
+	 * @throws SignatureException
+	 * @throws InvalidKeyException
+	 * @throws CertificateException
+	 * @throws NoSuchProviderException
+	 */
+	public void verify(String signature, byte[] data, String dn)
+			throws IOException, NoSuchAlgorithmException, SignatureException,
+			InvalidKeyException, CertificateException, NoSuchProviderException {
+		if (mode != VERIFIER)
+			throw new IllegalStateException(
+					"call a PKCS7Tool instance not for verify.");
+		byte[] sign = new BASE64Decoder().decodeBuffer(signature);
+		PKCS7 p7 = new PKCS7(sign);
+		X509Certificate[] certs = p7.getCertificates();
+		if (debug)
+			for (int i = 0; i < certs.length; i++) {
+				X509Certificate cert = certs[i];
+				System.out.println("SIGNER " + i + "=\n" + cert);
+				System.out.println("SIGNER " + i + "=\n"
+						+ new BASE64Encoder().encode(cert.getEncoded()));
+			}
+
+		// 验证签名本身、证书用法、证书扩展
+		SignerInfo[] sis = p7.verify(data);
+
+		// check the results of the verification
+		if (sis == null)
+			throw new SignatureException(
+					"Signature failed verification, data has been tampered");
+
+		for (int i = 0; i < sis.length; i++) {
+			SignerInfo si = sis[i];
+
+			X509Certificate cert = si.getCertificate(p7);
+			// 证书是否过期验证,如果不用系统日期可用cert.checkValidity(date);
+			cert.checkValidity();
+			boolean valid = false;
+			for (int j = rootCertificates.length - 1; j >= 0; j--) {
+				if (cert.equals(rootCertificates[j])) {
+					valid = true;
+					break;
+				} else {
+					// 验证证书签名
+					try {
+						cert.verify(rootCertificates[j].getPublicKey());
+						valid = true;
+						break;
+					} catch (Exception e) {
+					}
+				}
+			}
+			if (!valid)
+				throw new SignatureException(
+						"Signature certificate's issuer is untrusty.");
+			// 验证dn
+			if (i == 0 && dn != null) {
+				X500Principal name = cert.getSubjectX500Principal();
+				if (!dn.equals(name.getName(X500Principal.RFC1779))
+						&& !new X500Principal(dn).equals(name))
+					throw new SignatureException("Signer dn '"
+							+ name.getName(X500Principal.RFC1779)
+							+ "' does not matchs '" + dn + "'");
+			}
+		}
+	}
+
+	/**
+	 * 读取输入流
+	 * 
+	 * @param in
+	 *            输入流
+	 * @return 数据
+	 * @throws IOException
+	 */
+	protected static byte[] readData(InputStream in) throws IOException {
+		ByteArrayOutputStream bai = new ByteArrayOutputStream();
+		byte[] buf = new byte[256];
+		int len;
+		while ((len = in.read(buf)) > 0)
+			bai.write(buf, 0, len);
+		return bai.toByteArray();
+	}
+}

+ 462 - 0
src/main/java/com/xynet/pay/util/RSAProvider.java

@@ -0,0 +1,462 @@
+package com.xynet.pay.util;
+
+import javax.crypto.Cipher;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigInteger;
+import java.security.*;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * Copyright (C) BlakeQu All Rights Reserved <blakequ@gmail.com>
+ * <p>
+ * Licensed under the blakequ.com License, Version 1.0 (the "License");
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * <p>
+ * author  : quhao <blakequ@gmail.com> <br>
+ * date     : 2017/2/22 16:03 <br>
+ * last modify author : <br>
+ * version : 1.0 <br>
+ * description:
+ */
+
+public class RSAProvider {
+
+    /**
+     * KEY_ALGORITHM
+     */
+    public static final String KEY_ALGORITHM = "RSA";
+    /**
+     * 加密Key的长度等于1024
+     */
+    public static int KEYSIZE = 1024;
+    /**
+     * 解密时必须按照此分组解密
+     */
+    public static int decodeLen = KEYSIZE / 8;
+    /**
+     * 加密时小于117即可
+     */
+    public static int encodeLen = 110;//(DEFAULT_KEY_SIZE / 8) - 11;
+    /**
+     * 公钥
+     */
+    private static final String PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnl3tOgNlzZAuF4+8XsO+rhrd17mAb6Tvp+0REc+WfiBt5f7xco25oyJJCwhpSe/n4e4Az/jqo3ipiZOq2U8GFNSJSIkFzfaagt6kit9DqyCr5cSwRiHmvqeb8ajuO4nJ5OoVwvqpfICrEbDlr6c7ShFtGREeaVAjwQfjRlgK8LSQ4yyyw6fqSWB1N3Z+H8Ji/fq8XGiCaN6gYpM5bukRvW95gkOzY8ASzmd+vX5OxEHcF4Tbf/qR/IcZb/eA9aGfCZJa0+OtOORn4wpo/1rUxwDfws4xg2RDpZnkrA99yZCu5Ce/t0qMIwmWLbpu9yRGexbFlY5ercqxyQO0sxS38QIDAQAB";
+    /**
+     * 私钥
+     */
+    private static final String PRIVATE_KEY = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCeXe06A2XNkC4Xj7xew76uGt3XuYBvpO+n7RERz5Z+IG3l/vFyjbmjIkkLCGlJ7+fh7gDP+OqjeKmJk6rZTwYU1IlIiQXN9pqC3qSK30OrIKvlxLBGIea+p5vxqO47icnk6hXC+ql8gKsRsOWvpztKEW0ZER5pUCPBB+NGWArwtJDjLLLDp+pJYHU3dn4fwmL9+rxcaIJo3qBikzlu6RG9b3mCQ7NjwBLOZ369fk7EQdwXhNt/+pH8hxlv94D1oZ8JklrT46045GfjCmj/WtTHAN/CzjGDZEOlmeSsD33JkK7kJ7+3SowjCZYtum73JEZ7FsWVjl6tyrHJA7SzFLfxAgMBAAECggEAH5ShcvksevKujlpGeStVwghvhs5iM2FTvUwEJGYeH6a946iUY4CprUNwB3g07t6dgithFBgSSmkMfffpkQ42Kz865TEV7D2qEEDv1RWyu9R3EwnHESU/i3OHIIjMgSj4DuMzVb+Avug1tQBuvTl/FEUnWWFVjDDEAIFfLC7wd5FqKQY4NUgxmOQZVHFvT5rtZISmTs/N7IAZrsYtYePvk8Nsjte948rvUCBPa0Y9Hbj2A9PoC4AZ+q24Oa1GjtMCMtBErsw8Kc1a+15ilAPLt4/f9hrimwyfluZzknZMCNPC/mXwkcyIlrPkofK/iyzFI4jI4XC14S/ggPTLC1tNsQKBgQDJWc6P9dv5E43r7bdH63blNdoAvgXWLA/c+azK9TqbUfcGbF196KZ5chpgZ/+UTzlNjPN4U8LUUX/KFuYqrljAXZeGkQuwfk1fX6CiiyDQ4x1NH2Yzc4PMUrjy8LAhXGgp9piRLAwIQa3ouy/d73GKrZyz7yxMCg/QdAysPNfB7QKBgQDJWYaKyd8BCTTEeTHJ603Xi9+Q3i61ymlKyYg6aH8MtRphS0qLrb1B78UHEjc+K39Oc87MoN0JmMcy/u6VLLY2IyBjzZvuHYA8laSKkItF21E308DUyml+XYOsyFy09pgUDowgbQRynkw8P+Dc9LsDaWHFcmdV93mUKDgqDY0dlQKBgQCm6PpxnhZecFZKiEFRriBeO3je+qat9tKjlJknmYeer6B9w6DwucYekHbLCgr0r4PKBJjjW1P7Wx/6r2bXZLWPqUXtuBkfkmOjNwtbEsf+QPbOMsQuzIgp/TzxrpHi5c43UwL//KpwwblfXqR8bnwJwIdRJWfsFL8tRrYmpT0ZtQKBgQC+RV6RyuB0zylRPSHiqPyfYut6r6s+WS+U38tfPp5I+N8b8BVa12zQYW80Fm+jzWD5VxCmaKFYT0p2k1gMGft6P0l9ZrAinTgwiEy8MImcEvu2IOHJdBmqs14aKiEJVTozQegDQGICmjp6ePbadl4/hBdDia/DGiCG9FbWzoV63QKBgQCzpZ+C8/9Vr5xZl8KlQLloVky/OFCUCpmrt0OFkiDfUe5VDLVm+YbtNVmEndiLziIdBa/7rfWLAJ3ivWhAhHbuBPffH0zXf/pjLXdN9NxNpnmoMFzmTv4m4CYlHfKYiRox+St44L9bYDy4QgqZ2unp4nphvxchgKYC61/tAxKSWw==";
+    /**
+     * MODULES
+     */
+    private static final String MODULES = "RSAModules";
+    /**
+     * 签名算法
+     */
+    public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
+    /**
+     * 加密填充方式,android系统的RSA实现是"RSA/None/NoPadding",而标准JDK实现是"RSA/None/PKCS1Padding" ,这造成了在android机上加密后无法在服务器上解密的原因
+     */
+    public static final String ECB_PKCS1_PADDING = "RSA/ECB/PKCS1Padding";
+    //public static final String ECB_PKCS1_PADDING = "RSA/None/NoPadding";
+    /**
+     *
+     * 生成KeyPair
+     * @return
+     * @throws Exception
+     */
+    public static Map<String, Object> generateKeyPair() throws Exception {
+        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
+        keyPairGen.initialize(KEYSIZE);
+        KeyPair keyPair = keyPairGen.generateKeyPair();
+
+        // 公钥
+        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
+
+        // 私钥
+        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
+        BigInteger modules = privateKey.getModulus();
+
+        Map<String, Object> keys = new HashMap<String, Object>(3);
+        keys.put(PUBLIC_KEY, publicKey);
+        keys.put(PRIVATE_KEY, privateKey);
+        keys.put(MODULES, modules);
+        return keys;
+    }
+
+    public static byte[] getModulesBytes(Map<String, Object> keys) {
+        BigInteger big = (BigInteger) keys.get(MODULES);
+        return big.toByteArray();
+    }
+
+    /**
+     *
+     * 取得私钥
+     * @return
+     * @throws Exception
+     */
+    public static String getPrivateKeyBytes(Map<String, Object> keys) throws Exception {
+        Key key = (Key) keys.get(PRIVATE_KEY);
+        return Base64Utils.encode(key.getEncoded());
+    }
+
+    /**
+     * 取得公钥
+     *
+     * @return
+     * @throws Exception
+     */
+    public static String getPublicKeyBytes(Map<String, Object> keys) throws Exception {
+        Key key = (Key) keys.get(PUBLIC_KEY);
+        return Base64Utils.encode(key.getEncoded());
+    }
+
+    /**
+     * 用私钥对信息生成数字签名
+     *
+     * @param data 已加密数据
+     * @param privateKey 私钥(BASE64编码)
+     *
+     * @return
+     * @throws Exception
+     */
+    public static String sign(byte[] data, String privateKey) throws Exception {
+        PrivateKey privateK = loadPrivateKey(privateKey);
+        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
+        signature.initSign(privateK);
+        signature.update(data);
+        return Base64Utils.encode(signature.sign());
+    }
+
+    /**
+     * 校验数字签名
+     *
+     * @param data 已加密数据
+     * @param publicKey 公钥(BASE64编码)
+     * @param sign 数字签名
+     *
+     * @return
+     * @throws Exception
+     *
+     */
+    public static boolean verify(byte[] data, String publicKey, String sign)
+            throws Exception {
+        PublicKey publicK = loadPublicKey(publicKey);
+        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
+        signature.initVerify(publicK);
+        signature.update(data);
+        return signature.verify(Base64Utils.decode(sign));
+    }
+
+    /**
+     *
+     * 通过私钥加密
+     * @param encryptedData
+     * @param key
+     * @return
+     * @throws Exception
+     */
+    public static byte[] encryptPrivateKey(byte[] encryptedData, String key) throws Exception {
+        if (encryptedData == null){
+            throw  new IllegalArgumentException("Input encryption data is null");
+        }
+        byte[] encode = new byte[] {};
+        for (int i = 0; i < encryptedData.length; i += encodeLen) {
+            byte[] subarray = ArrayUtils.subarray(encryptedData, i, i + encodeLen);
+            byte[] doFinal = encryptByPrivateKey(subarray, key);
+            encode = ArrayUtils.addAll(encode, doFinal);
+        }
+        return encode;
+    }
+
+    /**
+     * 通过公钥解密
+     * @param encode
+     * @param key
+     * @return
+     * @throws Exception
+     */
+    public static byte[] decryptPublicKey(byte[] encode, String key) throws Exception {
+        if (encode == null){
+            throw  new IllegalArgumentException("Input encryption data is null");
+        }
+        byte [] buffers = new byte[]{};
+        for (int i = 0; i < encode.length; i += decodeLen) {
+            byte[] subarray = ArrayUtils.subarray(encode, i, i + decodeLen);
+            byte[] doFinal = decryptByPublicKey(subarray, key);
+            buffers = ArrayUtils.addAll(buffers, doFinal);
+        }
+        return buffers;
+    }
+
+    /**
+     *
+     * 通过公钥加密
+     * @param encryptedData
+     * @param key
+     * @return
+     * @throws Exception
+     */
+    public static byte[] encryptPublicKey(byte[] encryptedData, String key) throws Exception {
+        if (encryptedData == null){
+            throw  new IllegalArgumentException("Input encryption data is null");
+        }
+        byte[] encode = new byte[] {};
+        for (int i = 0; i < encryptedData.length; i += encodeLen) {
+            byte[] subarray = ArrayUtils.subarray(encryptedData, i, i + encodeLen);
+            byte[] doFinal = encryptByPublicKey(subarray, key);
+            encode = ArrayUtils.addAll(encode, doFinal);
+        }
+        return encode;
+    }
+
+    /**
+     * 通过私钥解密
+     * @param encode
+     * @param key
+     * @return
+     * @throws Exception
+     */
+    public static byte[] decryptPrivateKey(byte[] encode, String key) throws Exception {
+        if (encode == null){
+            throw  new IllegalArgumentException("Input data is null");
+        }
+        byte [] buffers = new byte[]{};
+        for (int i = 0; i < encode.length; i += decodeLen) {
+            byte[] subarray = ArrayUtils.subarray(encode, i, i + decodeLen);
+            byte[] doFinal = decryptByPrivateKey(subarray, key);
+            buffers = ArrayUtils.addAll(buffers, doFinal);
+        }
+        return buffers;
+    }
+
+    /**
+     * 从字符串中加载公钥
+     *
+     * @param publicKeyStr 公钥数据字符串
+     * @throws Exception 加载公钥时产生的异常
+     */
+    public static PublicKey loadPublicKey(String publicKeyStr) throws Exception {
+        try {
+            byte[] buffer = Base64Utils.decode(publicKeyStr);
+            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+            //表示根据 ASN.1 类型 SubjectPublicKeyInfo 进行编码的公用密钥的 ASN.1 编码。
+            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
+            return keyFactory.generatePublic(keySpec);
+        } catch (NoSuchAlgorithmException e) {
+            throw new Exception("无此算法");
+        } catch (InvalidKeySpecException e) {
+            throw new Exception("公钥非法");
+        } catch (NullPointerException e) {
+            throw new Exception("公钥数据为空");
+        }
+    }
+
+    /**
+     * 从字符串中加载私钥<br>
+     * 加载时使用的是PKCS8EncodedKeySpec(PKCS#8编码的Key指令)。
+     *
+     * @param privateKeyStr
+     * @return
+     * @throws Exception
+     */
+    public static PrivateKey loadPrivateKey(String privateKeyStr) throws Exception {
+        try {
+            byte[] buffer = Base64Utils.decode(privateKeyStr);
+            //表示按照 ASN.1 类型 PrivateKeyInfo 进行编码的专用密钥的 ASN.1 编码。
+            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);
+            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+            return keyFactory.generatePrivate(keySpec);
+        } catch (NoSuchAlgorithmException e) {
+            throw new Exception("无此算法");
+        } catch (InvalidKeySpecException e) {
+            throw new Exception("私钥非法");
+        } catch (NullPointerException e) {
+            throw new Exception("私钥数据为空");
+        }
+    }
+
+    /**
+     * 从文件中输入流中加载公钥
+     *
+     * @param in 公钥输入流
+     * @throws Exception 加载公钥时产生的异常
+     */
+    public static PublicKey loadPublicKey(InputStream in) throws Exception {
+        try {
+            return loadPublicKey(FileUtils.readString(in));
+        } catch (IOException e) {
+            throw new Exception("公钥数据流读取错误");
+        } catch (NullPointerException e) {
+            throw new Exception("公钥输入流为空");
+        }
+    }
+
+    /**
+     * 读取私钥
+     *
+     * @param in
+     * @return
+     * @throws Exception
+     */
+    public static PrivateKey loadPrivateKey(InputStream in) throws Exception {
+        try {
+            return loadPrivateKey(FileUtils.readString(in));
+        } catch (IOException e) {
+            throw new Exception("私钥数据读取错误");
+        } catch (NullPointerException e) {
+            throw new Exception("私钥输入流为空");
+        }
+    }
+
+    /**
+     * 用私钥解密
+     * @param data
+     * @param key
+     * @return
+     * @throws Exception
+     */
+    private static byte[] decryptByPrivateKey(byte[] data, String key) throws Exception {
+        if (data == null){
+            throw  new IllegalArgumentException("Input data is null");
+        }
+        //取得私钥
+        Key privateKey = loadPrivateKey(key);
+        // 对数据解密
+        Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);
+        cipher.init(Cipher.DECRYPT_MODE, privateKey);
+
+        return cipher.doFinal(data);
+    }
+
+    /**
+     *
+     * 用公钥解密
+     * @param data
+     * @param key
+     * @return
+     * @throws Exception
+     */
+    private static byte[] decryptByPublicKey(byte[] data, String key) throws Exception {
+        if (data == null){
+            throw  new IllegalArgumentException("Input data is null");
+        }
+        //取得公钥
+        Key publicKey = loadPublicKey(key);
+        // 对数据解密
+        Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);
+        cipher.init(Cipher.DECRYPT_MODE, publicKey);
+
+        return cipher.doFinal(data);
+    }
+
+    /**
+     *
+     * 用公钥加密
+     * @param data
+     * @param key
+     * @return
+     * @throws Exception
+     */
+    private static byte[] encryptByPublicKey(byte[] data, String key) throws Exception {
+        if (data == null){
+            throw  new IllegalArgumentException("Input data is null");
+        }
+        // 取得公钥
+        Key publicKey = loadPublicKey(key);
+        // 对数据加密
+        Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);
+        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+
+        return cipher.doFinal(data);
+    }
+
+    /**
+     * 用私钥加密
+     *
+     * @param data
+     * @param key
+     * @return
+     * @throws Exception
+     */
+    private static byte[] encryptByPrivateKey(byte[] data, String key) throws Exception {
+        if (data == null){
+            throw  new IllegalArgumentException("Input data is null");
+        }
+        // 取得私钥
+        Key privateKey = loadPrivateKey(key);
+        // 对数据加密
+        Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);
+        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
+
+        return cipher.doFinal(data);
+    }
+    
+  /* public static void main(String[] args) {
+	   String result=null;
+	   String privateKey ="MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANwoNy/xUugCcXnYvI3VqOg59e8KzZL4O7fwqqFZ10ixvAbeGLryZ+plVGljrNTP/QyeCJR9BM+u3MKlk36KeDGTfZ7xcuLFoxS4T7u3BRIHrd33MkdszJXgByugSvQbrPj9v/iMAkFSCvT1KvgJhwVYMDS9Ax1/Rho7baPQNpSFAgMBAAECgYBxiJe1NKlBloj4ginypv2dDM7kQFj1cugxGn6UCOW5ylah4AU22211dl4Kn2lwsfXYfOMF2FcT1yRniMXAWx5R1db4jM+TpGkjyjQFBuxjLd+MPtCHUBgJ3qkLB2VnChTshmS26KxzpfJU2i4TmRWlGTYu9OzPZxKQ53W4/x+inQJBAO3yuX5GOt5/e/7X0s4iSaMOqOuT352Kz/z+INiFyHGeQl5BlShf5R45dpeu6uQERYyYiK5nR3hNQWJ1nD6+83MCQQDs2/b0371U5a4TJV4Dl0U8engldxO4BdmugYEAgD7iknZGKgjoP4vtW/WhrAfhhNqDGd8Khxv+uyjOIeQgrwonAkEAz5Dp0MZQuiC5OIBqatisJao3HnE7IsGhV48Tde2WAc7NFE3fYH3ubuQvmHfEfS1gwhmZOZHsXXv+6nWv22hVEwJBAJDL56zLGnNL9Z6+uTp4v1q5g7ljkiptaSXFBZfIzqiz4JoEGG3iaygvj3nGMQssrGh46GEHN5YB1HAvR8azOwECQGCm14aPjEoA8CqOKo917jbAiw2r7e7sbNRhb9VPfJIeOpq+asu4dakpJbZPXB/wAJ1nK0otD6JkSGxZBkLpucE=";
+	   String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcKDcv8VLoAnF52LyN1ajoOfXvCs2S+Du38KqhWddIsbwG3hi68mfqZVRpY6zUz/0MngiUfQTPrtzCpZN+ingxk32e8XLixaMUuE+7twUSB63d9zJHbMyV4AcroEr0G6z4/b/4jAJBUgr09Sr4CYcFWDA0vQMdf0YaO22j0DaUhQIDAQAB";
+	   String ss="test";
+	   try {
+	    	byte[] bt=ss.getBytes();
+	    	byte[] encodedData = RSAProvider.encryptPublicKey(bt, publicKey);
+	    	result=Base64Utils.encode(encodedData);
+	    	System.out.println("------>"+result);	    	
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	   
+	   try {
+		   byte[] bt=RSAProvider.decryptByPrivateKey(Base64Utils.decode(result), privateKey);
+		   System.out.println("------>"+new String(bt));	
+	} catch (Exception e) {
+		// TODO Auto-generated catch block
+		e.printStackTrace();
+	}*/
+  public static void main(String[] args) {
+      try {
+          Map<String,String> params = new TreeMap();
+          params.put("requestId","test0001");
+          params.put("service","CreateEMVTrade");
+          params.put("version","2.0");
+          params.put("signType","RSA2");
+          params.put("merchantId","138618081008200");
+          params.put("terminalNo","98106094");
+          params.put("amount","1");
+          params.put("originalAmount","1");
+          params.put("payChannel","UNIONPAYQR");
+          params.put("productCode","PCWEB");
+          params.put("mercOrderNo","20200225113012");
+          params.put("orderDate","20210225");
+          params.put("orderTime","110223");
+          String string = "";
+          for (Map.Entry<String, String> entry : params.entrySet()) {
+              string += entry.getKey() + "="+entry.getValue() + "&";
+          }
+          string=string.substring(0,string.length()-1);
+          System.out.println(JsonUtils.objectToJson(params));
+          System.out.println(string);
+          byte[] bytes = RSAProvider.encryptPrivateKey(string.getBytes(), PRIVATE_KEY);
+          String encode = Base64Utils.encode(bytes);
+          System.out.println(encode.replaceAll("",""));
+          byte[] bytes1 = RSAProvider.decryptByPublicKey(bytes, PUBLIC_KEY);
+          System.out.println(new String(bytes1));
+      } catch (Exception e) {
+          e.printStackTrace();
+      }
+  }
+	   
+    String s = "YyctHEn5T8HXy7KSy+ebxnVrYISd/laI4SkbmQUKtPcBKsL9mbYuAW4j0fvena0Wua5+tEfTScQV6+ErxIXh8cugOWjydGYLgZAMUYhe7/wDTsqRwDqbPzRY7U0nDNd3avLnasDNamPUuppPG9siC9xZ6HRmYE9QXg0fiAwIupklLD6uLzuB9m+yyTAhJiqOtnV75lfW9DZXKHarFx90Vx7Mc9+2VhMdGXG7h5pCtYyJQUFVcLcB1t3Tbj5z421LpGxnxiMGCKQsyP0OYdO+Gk//jZD9l0dO/vTd3GFYOuETC6nNoGEnG4sPdcfR1L9ou86IVxS4RNGTUV0vHxehgw==";
+}

+ 98 - 0
src/main/java/com/xynet/pay/util/RSASignUtil.java

@@ -0,0 +1,98 @@
+package com.xynet.pay.util;
+
+import org.apache.commons.codec.binary.Base64;
+
+import java.io.UnsupportedEncodingException;
+import java.security.*;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+
+public class RSASignUtil {
+	/**
+	 * 加密
+	 * 
+	 * @param privateKey
+	 *            私钥
+	 * @param plain_text
+	 *            加密字符串
+	 * @return
+	 */
+	public static String signater(String privateKey, String plain_text) {
+		byte[] signed = null;
+		try {
+			Signature Sign = Signature.getInstance("SHA256WithRSA");
+			PKCS8EncodedKeySpec priPKCS8    = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey.getBytes()));
+			KeyFactory keyf = KeyFactory.getInstance("RSA");  
+	        PrivateKey priKey = keyf.generatePrivate(priPKCS8);
+	        Sign.initSign(priKey);
+	        Sign.update(plain_text.getBytes("UTF-8"));
+			signed = Sign.sign();
+			System.out.println("SHA256withRSA?????-----??" + Base64.encodeBase64String(signed));
+		} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {
+			e.printStackTrace();
+		} catch (InvalidKeySpecException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (UnsupportedEncodingException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return Base64.encodeBase64String(signed);
+	} 
+	
+	
+	/**
+	 * 解密
+	 * 
+	 * @param publicKey
+	 *            公钥
+	 * @param plain_text
+	 *            加密参数
+	 * @param signed
+	 *            ???
+	 */
+	public static boolean verify(String publicKey, String plain_text, String signed) {
+
+		//MessageDigest messageDigest;
+		boolean SignedSuccess=false;
+		try {
+			Signature verifySign = Signature.getInstance("SHA256WithRSA");
+			 KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
+	         byte[] encodedKey = Base64.decodeBase64(publicKey);  
+	         PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
+			verifySign.initVerify(pubKey);
+			verifySign.update(plain_text.getBytes("UTF-8"));
+			SignedSuccess = verifySign.verify(Base64.decodeBase64(signed));
+			System.out.println("????????---" + SignedSuccess);
+
+		} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {
+			e.printStackTrace();
+		} catch (InvalidKeySpecException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (UnsupportedEncodingException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return SignedSuccess;
+	} 
+	
+	
+	public static void main(String[] args) throws UnsupportedEncodingException {
+		String privateKey="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCMA535xCcPJQ5b9J2nbj01FyG7zLc2Si6Zd0zS6vW5qygm6YwebWpqG37uJEulRjF6q6aGiCFrt7f8Mb5qOuBu/iZ3ByJn/UOGzDJYIl8nXxhCKzudZ8C2yq9hwtVKICzcEXphxtUbA1RutX1EiViFdPVIpCk0NPfzukzX8JaVoS2C4YUCnedpAUzD9if7N1wDYFaNdjuEOH1FznXPBO9unRU5dacVix6rqgFL5Lg5jdHdzra5GRZWdTFI9bL4UPbnOTK7rvt/963qM47F1vTf0KQR8F0pBb5kSsWZvg05bAGeYGi0TOQPRuddD1DZz5i1B71IPhEp23eLahqd5cBZAgMBAAECggEABE6YLXa7PNwG9Q0xTFU3zMpJX12MxT7C8DWbR2Gy7WM2ePv2M3lqLJlr7idvrEXcf8mH9dt6K7YbEsb09I+bF875n++4PzqrORpO8icchjmGpYJu8wieBQF3I6q6pO0YdCyVdyyGoa4Yis9KazFOZ8yRPwrNua1nczfn5TyhZTjkYec2zbWgU0XEk6DDj2NJO7Y9ut7o3+0xeVLE1WR5e324jS1DjHVafBGMnAaA7HBOIHmPp75OwXiFf6S6wwqTH4vMe+ivXq1RVo2M8Y28UvY3WNSkW5drEhDipz//fuMLowHLmTFYWzvq4pS3UjykSj6zWwDDf0HJRwipPtoAAQKBgQDJdBmhVfMLwkP9oHvzn5IZiCnunKymy3fZX5Wu6vjrn4wmDWuUoa53Hj3h2yTHZ4I/DQ29sMFd6M0+kC4aE60ecvD7o+eLRXqlJiuVUf9UijSB7BxznyAN0EGY1AcrNLLVQy/WMBxddMkOTyxAYi6CFwM2YCZNQbtI7gA8CLPpWQKBgQCx7MzhBHxgnda5oMR3Yuc2awZ6Fcka9vdRzU1UE6B5p4xbgKJcZIJgQsBaq0ZsYiSlAIoZX/dnL8eSMWK4ag6+ycCXo1AqNth1/Q+oS+IN9cuWFA0ofj49mJzkoM5oQVpgabzwnPVoj8pG9Y6BXLab1obdChwE64SvhtFz+l6vAQKBgFooPXg40QcIMAmIEzEazvXiPHHvaE1VbhO4dXLM8g3xX3WAOA9StJPW0vcLblBXgLDbFLU6L6/pikFfoWJGQAoKgtL7rZpkw9i5VnQDOHQLTih/FNSh+GR2OYU+Dt9FPGu5H+WJrogcxgZDZJiD2DCcP/HL4hhdPIYNDcnQU0QxAoGBAKhT8ZjIl6sIaMcBdB3GshvnsR77UWFzWJRJeOkcEGxHuSAwWGq0pCvRuw2MkHmleCmqkvxisDstFtAWbOEvZXfWg6ByXzsw3CT0H0YHVHwEmHEJ01EF7nhz06rw/5XejlQ8dQXmWL5tmt77HbEBN7nDgZ/JGq0E7GjrUWk56y4BAoGAKIA5F3e09oFPjfOVfq5cdfWPCVG0wYN//LNzx4REIUVyUCem423WB+TBMw7cQVHbHdYahO6Uqtlk0ONYG8CAxHVvEzJOXrqygf84DPNL06N/5ArH3czroG/mgX5f632xxlS5ppP31jLrSJjCl2sX17RuPRlyYpvbEkTDrlgPlqw=";
+		String publicKey="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjqDD+/kZfajDAk6H1KHl1ppar8vDbcza9a0ZaS+ia5JFoWmnZeHjaIowXdEozMdeyiBNxw++grdKzJVZRDx6iWL4q0rdp/OkESrPsrvCwmOpQ2alyZWXS/O6JEJ200Q80V87c7oRYNmaaT3kEmAvBmZ9xqA/t5+dmI0CrySSkzVrYgwltUYeO6I6saJ8XDHNjHly6uanDr/prpe7KWVDQ8TjQA8rAvAH6se3L6TDVru0wA04QHCFApV60pBt3ARp4SS4dHxL4y6CA44L/5C7DxOHG7/F2EzSVb221Oj5EKRV0aU7X/bp3Rm/hZygzfKS0FPAQhT72rSzTSwj34NmuwIDAQAB";//"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjAOd+cQnDyUOW/Sdp249NRchu8y3NkoumXdM0ur1uasoJumMHm1qaht+7iRLpUYxequmhogha7e3/DG+ajrgbv4mdwciZ/1DhswyWCJfJ18YQis7nWfAtsqvYcLVSiAs3BF6YcbVGwNUbrV9RIlYhXT1SKQpNDT387pM1/CWlaEtguGFAp3naQFMw/Yn+zdcA2BWjXY7hDh9Rc51zwTvbp0VOXWnFYseq6oBS+S4OY3R3c62uRkWVnUxSPWy+FD25zkyu677f/et6jOOxdb039CkEfBdKQW+ZErFmb4NOWwBnmBotEzkD0bnXQ9Q2c+YtQe9SD4RKdt3i2oaneXAWQIDAQAB";
+		String sign = "c3Dbqw0iwxCm8yNZxq+LRecK8yjxQFwNMgbntA2c8eCe0aMtXo6OlZUdxNbX+/85jMmtKph0rxRgHlfh2f6TAetrX/apfZCjO+7Pai20+LfdiW3nGOU0w/dZrcucUwoVs/tb2nfRvwaX7UKDHNcTpngST4i+c6qemFz4NFl1cR0S6Ji2mQRgWXH9HAwXx+9CzFl06G5YvfBHBIQQ4v29X+H8ovFng757Hnu5QvYDSrK/B8bnygBOEht1crX3WynQZQpd0+fYJB+kxjvl9Z6CKL90RHHto5nsLWcowYtPLf48v8Y8S7bb2Qb+7wNkT5Sbp/Wrfg0X+IrvZfUo8N12dQ==";
+
+		System.out.println(sign);
+		String plain_text="21CNY0TESTCU202103181425124762720210318142508888618050003300202103181425552000000OfflineResultSUCCESS42000008782021031822972141821.0";
+		//String signed=RSASignUtil.signater(privateKey, plain_text);
+		//System.out.println(signed);
+		System.out.println(RSASignUtil.verify(publicKey, plain_text, sign));
+
+
+		
+	}
+
+
+}

+ 301 - 0
src/main/java/com/xynet/pay/util/RSATool.java

@@ -0,0 +1,301 @@
+package com.xynet.pay.util;
+
+import java.security.KeyFactory;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.MessageDigest;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.SecureRandom;
+import java.security.Signature;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Arrays;
+import java.util.Base64;
+
+import javax.crypto.Cipher;
+
+/**
+ * 关于JAVA中RSA加签解签,私钥加密公钥解密和公钥加密私钥解密代码详解 
+ * 在项目中遇到的问题百度了许久总结出来的 私钥加密公钥解密和公钥加密私钥解密。
+ * 一般为了安全采用的是私钥加密,公钥解密(公钥可以用Base64转换后公开)
+ * 
+ * @author wangchaohua
+ *
+ */
+
+public class RSATool {
+
+	public RSATool() {
+
+	}
+
+	/**
+	 * 使用私钥加密数据 用一个已打包成byte[]形式的私钥加密数据,即数字签名
+	 * 
+	 * @param keyInByte
+	 *            打包成byte[]的私钥
+	 * @param source
+	 *            要签名的数据,一般应是数字摘要
+	 * @return 签名 byte[]
+	 */
+
+	public static byte[] sign(byte[] keyInByte, byte[] source) {
+		try {
+			PKCS8EncodedKeySpec priv_spec = new PKCS8EncodedKeySpec(keyInByte);
+			KeyFactory mykeyFactory = KeyFactory.getInstance("RSA");
+			PrivateKey privKey = mykeyFactory.generatePrivate(priv_spec);
+			Signature sig = Signature.getInstance("SHA1withRSA");
+			sig.initSign(privKey);
+			sig.update(source);
+			return sig.sign();
+		} catch (Exception e) {
+			return null;
+		}
+	}
+
+	/**
+	 * 验证数字签名
+	 * 
+	 * @param keyInByte
+	 *            打包成byte[]形式的公钥
+	 * @param source
+	 *            原文的数字摘要
+	 * @param sign
+	 *            签名(对原文的数字摘要的签名)
+	 * @return 是否证实 boolean
+	 */
+	public static boolean verify(byte[] keyInByte, byte[] source, byte[] sign) {
+		try {
+			KeyFactory mykeyFactory = KeyFactory.getInstance("RSA");
+			Signature sig = Signature.getInstance("SHA1withRSA");
+			X509EncodedKeySpec pub_spec = new X509EncodedKeySpec(keyInByte);
+			PublicKey pubKey = mykeyFactory.generatePublic(pub_spec);
+			sig.initVerify(pubKey);
+			sig.update(source);
+			return sig.verify(sign);
+		} catch (Exception e) {
+			return false;
+		}
+	}
+
+	/**
+	 * 建立新的密钥对,返回打包的byte[]形式私钥和公钥
+	 * 
+	 * @return 包含打包成byte[]形式的私钥和公钥的object[],其中,object[0]为私钥byte[],object[1]
+	 *         为公钥byte[]
+	 */
+
+	public static Object[] giveRSAKeyPairInByte() {
+		KeyPair newKeyPair = creatmyKey();
+		if (newKeyPair == null)
+			return null;
+		Object[] re = new Object[2];
+		if (newKeyPair != null) {
+			PrivateKey priv = newKeyPair.getPrivate();
+			byte[] b_priv = priv.getEncoded();
+			PublicKey pub = newKeyPair.getPublic();
+			byte[] b_pub = pub.getEncoded();
+			re[0] = b_priv;
+			re[1] = b_pub;
+			return re;
+		}
+		return null;
+	}
+
+	/**
+	 * 新建密钥对
+	 * 
+	 * @return KeyPair对象
+	 */
+	public static KeyPair creatmyKey() {
+		KeyPair myPair;
+		long mySeed;
+		mySeed = System.currentTimeMillis();
+		try {
+			KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
+			SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
+			random.setSeed(mySeed);
+			keyGen.initialize(1024, random);
+			myPair = keyGen.generateKeyPair();
+		} catch (Exception e1) {
+			return null;
+		}
+		return myPair;
+	}
+
+	/**
+	 * 使用RSA公钥加密数据
+	 * 
+	 * @param pubKeyInByte
+	 *            打包的byte[]形式公钥
+	 * @param data
+	 *            要加密的数据
+	 * @return 加密数据
+	 */
+	public static byte[] encryptByRSA(byte[] pubKeyInByte, byte[] data) {
+		try {
+			KeyFactory mykeyFactory = KeyFactory.getInstance("RSA");
+			X509EncodedKeySpec pub_spec = new X509EncodedKeySpec(pubKeyInByte);
+			PublicKey pubKey = mykeyFactory.generatePublic(pub_spec);
+			Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
+			cipher.init(Cipher.ENCRYPT_MODE, pubKey);
+			return cipher.doFinal(data);
+		} catch (Exception e) {
+			return null;
+		}
+	}
+
+	/**
+	 * 用RSA私钥解密
+	 * 
+	 * @param privKeyInByte
+	 *            私钥打包成byte[]形式
+	 * @param data
+	 *            要解密的数据
+	 * @return 解密数据
+	 */
+	public static byte[] decryptByRSA(byte[] privKeyInByte, byte[] data) {
+		try {
+			PKCS8EncodedKeySpec priv_spec = new PKCS8EncodedKeySpec(privKeyInByte);
+			KeyFactory mykeyFactory = KeyFactory.getInstance("RSA");
+			PrivateKey privKey = mykeyFactory.generatePrivate(priv_spec);
+			Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
+			cipher.init(Cipher.DECRYPT_MODE, privKey);
+			return cipher.doFinal(data);
+		} catch (Exception e) {
+			return null;
+		}
+
+	}
+
+	/**
+	 * 使用RSA私钥加密数据
+	 * 
+	 * @param pubKeyInByte
+	 *            打包的byte[]形式私钥
+	 * @param data
+	 *            要加密的数据
+	 * @return 加密数据
+	 */
+
+	public static byte[] encryptByRSA1(byte[] privKeyInByte, byte[] data) {
+		try {
+			PKCS8EncodedKeySpec priv_spec = new PKCS8EncodedKeySpec(privKeyInByte);
+			KeyFactory mykeyFactory = KeyFactory.getInstance("RSA");
+			PrivateKey privKey = mykeyFactory.generatePrivate(priv_spec);
+			Cipher cipher = Cipher.getInstance(mykeyFactory.getAlgorithm());
+			cipher.init(Cipher.ENCRYPT_MODE, privKey);
+			return cipher.doFinal(data);
+		} catch (Exception e) {
+			return null;
+		}
+
+	}
+
+	/**
+	 * 用RSA公钥解密
+	 * 
+	 * @param privKeyInByte
+	 *            公钥打包成byte[]形式
+	 * @param data
+	 *            要解密的数据
+	 * @return 解密数据
+	 */
+
+	public static byte[] decryptByRSA1(byte[] pubKeyInByte, byte[] data) {
+		try {
+			KeyFactory mykeyFactory = KeyFactory.getInstance("RSA");
+			X509EncodedKeySpec pub_spec = new X509EncodedKeySpec(pubKeyInByte);
+			PublicKey pubKey = mykeyFactory.generatePublic(pub_spec);
+			Cipher cipher = Cipher.getInstance(mykeyFactory.getAlgorithm());
+			cipher.init(Cipher.DECRYPT_MODE, pubKey);
+			return cipher.doFinal(data);
+		} catch (Exception e) {
+			return null;
+		}
+	}
+
+	/**
+	 * 计算字符串的SHA数字摘要,以byte[]形式返回
+	 */
+	public static byte[] MdigestSHA(String source) {
+		// byte[] nullreturn = { 0 };
+		try {
+			MessageDigest thisMD = MessageDigest.getInstance("SHA");
+			byte[] digest = thisMD.digest(source.getBytes("UTF-8"));
+			return digest;
+		} catch (Exception e) {
+			return null;
+		}
+	}
+
+	/**
+	 * 测试
+	 * 
+	 */
+	public static void main(String[] args) {
+		try {
+			// 私钥加密 公钥解密
+			// 生成私钥-公钥对
+			Object[] v = giveRSAKeyPairInByte();
+			// 获得摘要
+			byte[] source = MdigestSHA("假设这是要加密的客户数据");
+			// 使用私钥对摘要进行加密 获得密文 即数字签名
+			byte[] sign = sign((byte[]) v[0], source);
+			// 使用公钥对密文进行解密,解密后与摘要进行匹配
+			boolean yes = verify((byte[]) v[1], source, sign);
+			if (yes)
+				System.out.println("匹配成功 合法的签名!");
+
+			// 公钥加密私钥解密
+			// 获得摘要
+			byte[] sourcepub_pri = ("13265986584||316494646546486498||01||public").getBytes("UTF-8");
+
+			// 使用公钥对摘要进行加密 获得密文
+			byte[] signpub_pri = encryptByRSA((byte[]) v[1], sourcepub_pri);
+			// System.out.println("公钥加密密文:"+new
+			// String(Base64.encodeBase64(signpub_pri)));
+
+			// 使用私钥对密文进行解密 返回解密后的数据
+			byte[] newSourcepub_pri = decryptByRSA((byte[]) v[0], signpub_pri);
+
+			System.out.println("私钥解密:" + new String(newSourcepub_pri, "UTF-8"));
+			// 对比源数据与解密后的数据
+			if (Arrays.equals(sourcepub_pri, newSourcepub_pri))
+				System.out.println("匹配成功 合法的私钥!");
+
+			// 私钥加密公钥解密
+			// 获得摘要
+			// byte[] sourcepri_pub = MdigestSHA("假设这是要加密的客户数据");
+			byte[] sourcepri_pub = ("13265986584||316494646546486498||01||private").getBytes("UTF-8");
+
+			// 使用私钥对摘要进行加密 获得密文
+			byte[] signpri_pub = encryptByRSA1((byte[]) v[0], sourcepri_pub);
+
+			// System.out.println("私钥加密密文:"+new
+			// String(Base64.encodeBase64(sign11)));
+			// 使用公钥对密文进行解密 返回解密后的数据
+			byte[] newSourcepri_pub = decryptByRSA1((byte[]) v[1], signpri_pub);
+
+			System.out.println("公钥解密:" + new String(newSourcepri_pub, "UTF-8"));
+
+			String PUBLICKEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCEGENnf3rdiO20isoLQqezw12FoWXII9FBw8nR1MWQ3X0CVzOsqY1hOmxD/YI9OB7WVIaVax5tj1l+wk6A0v85Z4OpGWqz4B5L3fCUlBwf/M6DXHlSN1OZttvQF3OeWvc6gvJHihR7pp18zc4KfCJx0Ry6IrGH/2SNOVE1AIgvRQIDAQAB";
+			String PRIVATEKEY = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIQYQ2d/et2I7bSKygtCp7PDXYWhZcgj0UHDydHUxZDdfQJXM6ypjWE6bEP9gj04HtZUhpVrHm2PWX7CToDS/zlng6kZarPgHkvd8JSUHB/8zoNceVI3U5m229AXc55a9zqC8keKFHumnXzNzgp8InHRHLoisYf/ZI05UTUAiC9FAgMBAAECgYAGNcHNds/G5G4QY8n1149cwx19b8YCL7Thu5ucUr1q/w6mcoUKY/oyjPWUCLH7wMyqVNTy51NJ4UhazjW0lrbK4ZbPDHFij9CiZ7QFASiQ/TQWaL+KSIWnE6/rK9IdouwFKxk+cvvLteZoAXP6mFcrsa7LzfkENiIMu7mjpTNHAQJBANXv9U5JWOAVhWHDQcEWKn7YKpAVRleXdeUeJrXcdkqBDI+P6suA9j+ahDREfu+x65wUsrJotPHUXgJG0TarJIUCQQCeEPLrv6Qvi5+nbn2Eifn/fjsmIdI0U2WZKDHWJEnLsRUuGDNYxVE/SPDNDedA2OHeFB6j0Kk/ECdsWnUq6zvBAkAgUGViFMwa1MVX1fFZo+p5TFdpef0s/9Cr8djxAULQ0BtAmAFkCa+oPcOYTXxK4jnvUmUHc69ZE7W7bEzvj/wtAkB50X4mClAzBFxK4XCC0QOG0HYtcStbgFpwqvWdn+Hvxc4Y9DW+WHPBXimXHvv2ki+gw8jJX2rQW1bGvwBFz30BAkASPkORJxVWv91StjI2f/HXDO5eG5/su/XIb3eajaLUSEdaQlcs3ywLrrJ0o3VAR0J9aq59cmp6em017AMnmbF7";
+			Base64.Decoder decoder = Base64.getDecoder();
+			byte[] signPrivate = decoder.decode(PRIVATEKEY.getBytes());
+			byte[] signPublic = decoder.decode(PUBLICKEY.getBytes());
+
+			String publicpwd = "N/b4nYbbLFVq0yTAIOpNNydtNQUCQxQy0B7bD6kzxLMW2guYxXtWOC/9Z5dpWecx/y7d5CezUJ6cf/8++msiNie4DcKBaFDFPh5rPbjeEB+DRfhjcdR2BsVGXWLsq3dLYLgZObQXG6Tb9rXakuH34Y+6KIIwCjiODH2QAU+PSiM=";
+			String privatepwd = "MTMyNjU5ODY1ODR8fDMxNjQ5NDY0NjU0NjQ4NjQ5OHx8MDF8fHByaXZhdGU=";
+			// 使用私钥对密文进行解密 返回解密后的数据
+			byte[] newSource111 = decryptByRSA(signPrivate, decoder.decode(publicpwd.getBytes()));
+			System.out.println("私钥解密1:" + new String(newSource111, "UTF-8"));
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+	}
+
+}

+ 76 - 0
src/main/java/com/xynet/pay/util/Reserve.java

@@ -0,0 +1,76 @@
+package com.xynet.pay.util;
+
+import java.util.Date;
+
+public class Reserve {
+    private Integer id;
+
+    private String jqbh;
+
+    private String shbh;
+
+    private String spbh;
+
+    private String spmc;
+
+    private Integer ydsl;
+
+    private Date xgsj;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getJqbh() {
+        return jqbh;
+    }
+
+    public void setJqbh(String jqbh) {
+        this.jqbh = jqbh == null ? null : jqbh.trim();
+    }
+
+    public String getShbh() {
+        return shbh;
+    }
+
+    public void setShbh(String shbh) {
+        this.shbh = shbh == null ? null : shbh.trim();
+    }
+
+    public String getSpbh() {
+        return spbh;
+    }
+
+    public void setSpbh(String spbh) {
+        this.spbh = spbh == null ? null : spbh.trim();
+    }
+
+    public String getSpmc() {
+        return spmc;
+    }
+
+    public void setSpmc(String spmc) {
+        this.spmc = spmc == null ? null : spmc.trim();
+    }
+
+    public Integer getYdsl() {
+        return ydsl;
+    }
+
+    public void setYdsl(Integer ydsl) {
+        this.ydsl = ydsl;
+    }
+
+    public Date getXgsj() {
+        return xgsj;
+    }
+
+    public void setXgsj(Date xgsj) {
+        this.xgsj = xgsj;
+    }
+
+}

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

@@ -0,0 +1,1612 @@
+#配置文件环境配置
+spring:
+  profiles:
+    active: dev
+    
+  #jackson
+  jackson:
+    date-format: yyyy-MM-dd HH:mm:ss
+    time-zone: GMT+8  
+    serialization.indent_output: true
+    
+  application.name: service-pay-third
+  
+  http.multipart:
+    enabled: true #默认支持文件上传.
+    file-size-threshold: 0 #支持文件写入磁盘.
+    location: # 上传文件的临时目录
+    maxFileSize: 20Mb # 最大支持文件大小
+    maxRequestSize: 20Mb # 最大支持请求大小
+    
+  mqtt:
+    #MQTT服务端地址,端口默认为1883,如果有多个,用逗号隔开,如tcp://127.0.0.1:1883,tcp://192.168.60.133:1883
+    url: tcp://8.142.160.185:1883
+    #用户名
+    username: admin
+    #密码
+    password: public
+    #客户端id(不能重复)
+    client:
+      id: provider-id
+    #MQTT默认的消息推送主题,实际可在调用接口时指定
+    default:
+      topic: topic
+  
+mybatis:   
+  mapper-locations: classpath:mapping/*.xml  
+  type-aliases-package: com.xynet.pay.dao
+  config-location: classpath:mybatis/mybatis-config.xml 
+     
+server:
+  port: 8115 
+  tomcat:
+    max-connections: 1000
+    max-threads: 200
+    accept-count: 1000 
+    
+endpoints:
+  metrics:
+    sensitive: false
+  shutdown:
+    enabled: true
+    path: /service-pay-third
+    
+management:
+  security:
+    enabled: false
+    
+monitor:
+  agent:
+    url: http://127.0.0.1:8100
+  plugin:
+    type: application 
+    
+hystrix:
+  command:
+    default:
+      execution:
+        timeout:
+          enabled: true
+        isolation:
+          thread:
+            timeoutInMilliseconds: 300000  #超时时间
+            
+    HystrixCommandKey.execution.isolation.thread.timeoutInMilliseconds: 300000
+                        
+  threadpool:  
+    default:  
+      coreSize: 200  #核心线程数
+      maxQueueSize: 1000
+      queueSizeRejectionThreshold: 1000  #排队线程数量阈值   
+      auto-config: true  
+
+ribbon:
+  ReadTimeout: 60000
+  ConnectTimeout: 60000
+  MaxAutoRetries: 0
+  MaxAutoRetriesNextServer: 1
+  eureka:
+    enabled: true
+
+publickKey: 30819d300d06092a864886f70d010101050003818b0030818702818100b93981389ccd637292047e10a8978792de7a192285cf2b13d90ea7399c21c3924349986e83e7016098f796731c0cfb7260497e98cfb8ece5f511bd24bca86ea96a6314d6314dc33e7db6da0406162c9076b05f5409bfa0056ca1e4ff9aeab7c04816963576c5b924b754fb5a67621f3fdd846482c7da5830dc8184e7430a3e65020111
+notifyUrl: https://xcx.xynetweb.com/service-pay-third/third/pay/api/notify
+#notifyUrl: http://newtest.xyvend.cn/service-pay-third/third/pay/api/notify
+#小麦
+orderNotifyUrl: http://42.193.149.63:8090/service-order/jzgcl/closeDoorState
+closeNotify: http://42.193.149.63:8090/service-order/jzgcl/closeDoor
+key: xInYuAnWaNgLuOsIgN
+companyId: 113
+#中行智慧付
+zhong:
+  notifyUrl: apitest/service-pay-third/third/pay/api/notifyBOC
+  prvateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCMA535xCcPJQ5b9J2nbj01FyG7zLc2Si6Zd0zS6vW5qygm6YwebWpqG37uJEulRjF6q6aGiCFrt7f8Mb5qOuBu/iZ3ByJn/UOGzDJYIl8nXxhCKzudZ8C2yq9hwtVKICzcEXphxtUbA1RutX1EiViFdPVIpCk0NPfzukzX8JaVoS2C4YUCnedpAUzD9if7N1wDYFaNdjuEOH1FznXPBO9unRU5dacVix6rqgFL5Lg5jdHdzra5GRZWdTFI9bL4UPbnOTK7rvt/963qM47F1vTf0KQR8F0pBb5kSsWZvg05bAGeYGi0TOQPRuddD1DZz5i1B71IPhEp23eLahqd5cBZAgMBAAECggEABE6YLXa7PNwG9Q0xTFU3zMpJX12MxT7C8DWbR2Gy7WM2ePv2M3lqLJlr7idvrEXcf8mH9dt6K7YbEsb09I+bF875n++4PzqrORpO8icchjmGpYJu8wieBQF3I6q6pO0YdCyVdyyGoa4Yis9KazFOZ8yRPwrNua1nczfn5TyhZTjkYec2zbWgU0XEk6DDj2NJO7Y9ut7o3+0xeVLE1WR5e324jS1DjHVafBGMnAaA7HBOIHmPp75OwXiFf6S6wwqTH4vMe+ivXq1RVo2M8Y28UvY3WNSkW5drEhDipz//fuMLowHLmTFYWzvq4pS3UjykSj6zWwDDf0HJRwipPtoAAQKBgQDJdBmhVfMLwkP9oHvzn5IZiCnunKymy3fZX5Wu6vjrn4wmDWuUoa53Hj3h2yTHZ4I/DQ29sMFd6M0+kC4aE60ecvD7o+eLRXqlJiuVUf9UijSB7BxznyAN0EGY1AcrNLLVQy/WMBxddMkOTyxAYi6CFwM2YCZNQbtI7gA8CLPpWQKBgQCx7MzhBHxgnda5oMR3Yuc2awZ6Fcka9vdRzU1UE6B5p4xbgKJcZIJgQsBaq0ZsYiSlAIoZX/dnL8eSMWK4ag6+ycCXo1AqNth1/Q+oS+IN9cuWFA0ofj49mJzkoM5oQVpgabzwnPVoj8pG9Y6BXLab1obdChwE64SvhtFz+l6vAQKBgFooPXg40QcIMAmIEzEazvXiPHHvaE1VbhO4dXLM8g3xX3WAOA9StJPW0vcLblBXgLDbFLU6L6/pikFfoWJGQAoKgtL7rZpkw9i5VnQDOHQLTih/FNSh+GR2OYU+Dt9FPGu5H+WJrogcxgZDZJiD2DCcP/HL4hhdPIYNDcnQU0QxAoGBAKhT8ZjIl6sIaMcBdB3GshvnsR77UWFzWJRJeOkcEGxHuSAwWGq0pCvRuw2MkHmleCmqkvxisDstFtAWbOEvZXfWg6ByXzsw3CT0H0YHVHwEmHEJ01EF7nhz06rw/5XejlQ8dQXmWL5tmt77HbEBN7nDgZ/JGq0E7GjrUWk56y4BAoGAKIA5F3e09oFPjfOVfq5cdfWPCVG0wYN//LNzx4REIUVyUCem423WB+TBMw7cQVHbHdYahO6Uqtlk0ONYG8CAxHVvEzJOXrqygf84DPNL06N/5ArH3czroG/mgX5f632xxlS5ppP31jLrSJjCl2sX17RuPRlyYpvbEkTDrlgPlqw=
+  merchantId: 888618050003300
+  trmNo: 97033623
+  publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjqDD+/kZfajDAk6H1KHl1ppar8vDbcza9a0ZaS+ia5JFoWmnZeHjaIowXdEozMdeyiBNxw++grdKzJVZRDx6iWL4q0rdp/OkESrPsrvCwmOpQ2alyZWXS/O6JEJ200Q80V87c7oRYNmaaT3kEmAvBmZ9xqA/t5+dmI0CrySSkzVrYgwltUYeO6I6saJ8XDHNjHly6uanDr/prpe7KWVDQ8TjQA8rAvAH6se3L6TDVru0wA04QHCFApV60pBt3ARp4SS4dHxL4y6CA44L/5C7DxOHG7/F2EzSVb221Oj5EKRV0aU7X/bp3Rm/hZygzfKS0FPAQhT72rSzTSwj34NmuwIDAQAB";//"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjAOd+cQnDyUOW/Sdp249NRchu8y3NkoumXdM0ur1uasoJumMHm1qaht+7iRLpUYxequmhogha7e3/DG+ajrgbv4mdwciZ/1DhswyWCJfJ18YQis7nWfAtsqvYcLVSiAs3BF6YcbVGwNUbrV9RIlYhXT1SKQpNDT387pM1/CWlaEtguGFAp3naQFMw/Yn+zdcA2BWjXY7hDh9Rc51zwTvbp0VOXWnFYseq6oBS+S4OY3R3c62uRkWVnUxSPWy+FD25zkyu677f/et6jOOxdb039CkEfBdKQW+ZErFmb4NOWwBnmBotEzkD0bnXQ9Q2c+YtQe9SD4RKdt3i2oaneXAWQIDAQAB
+
+
+#嗨便利
+hbl:
+ key: Y2HVRKWKU9BokvNH
+ companyId: 120
+
+---
+spring:
+  profiles: dev
+  #mysql
+  datasource:
+      driver-class-name: com.mysql.jdbc.Driver
+      username: root
+      password: root
+      # set password for root@localhost = password('123');
+      #CREATE USER 'xyz'@'127.0.0.1' IDENTIFIED BY "xyz@qaz_123";
+      #GRANT ALL PRIVILEGES ON *.* TO 'xyz'@'127.0.0.1'
+      #url: jdbc:mysql://175.6.4.138:3694/xy-pay?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false
+      url: jdbc:mysql://192.168.1.253:3306/xy-platform?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false
+      type: com.alibaba.druid.pool.DruidDataSource 
+      #test-while-idle: true
+      #time-between-eviction-runs-millis: 300000
+      #min-evictable-idle-time-millis: 1800000
+      
+      initialSize: 5  
+      minIdle: 5  
+      maxActive: 20  
+      maxWait: 60000  
+      timeBetweenEvictionRunsMillis: 60000  
+      minEvictableIdleTimeMillis: 300000  
+      validationQuery: SELECT NOW()  
+      testWhileIdle: true  
+      testOnBorrow: true  
+      testOnReturn: false  
+      poolPreparedStatements: true  
+      maxPoolPreparedStatementPerConnectionSize: 20  
+      filters: stat,wall,log4j 
+      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 
+            
+#redis
+  redis:
+    database: 15
+    host: 192.168.1.253
+    password:  
+    port: 6379
+    pool:
+      min-idle: 1
+      max-idle: 8
+      max-active: 100
+      max-wait: 1    
+    timeout: 10000  
+
+ #log
+logging:
+    level:
+      root: INFO
+      com.xynet: DEBUG
+    file: logs/service-pay-third.log
+      
+#server
+server:
+  port: 8115 
+
+app:
+    fileHome: file/
+    tempFileHome: tmp/
+    xxwAppId: 202310201164921719597563904
+    xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu/W4vOOFFTEYMpVqSASQgqlKsxsgV6UnYf4OhskXXKWwwnZFKcqFh++aW9Aw73s1vZgoXKv/SVYEmrB48qJjZHZzVMg5BI6So8gs7JomwH7rNR9le1Xs3OVP5vML6jDVuCjd61/qyG++A3P+GviOCLny3qiytsVFBA9LfN+P9OoB7tW6FbRTlTRUNB0oKR+Hlg1wRKP+USuRUWzXQxZt0Ie0SmpDcnfAduUPurcODbrkqF5e4ic0mfXFhqPB6o9hUs0onjnc2P0W374rPUcWRxJJa5wT/6XFqYV5OSob6KSA9qBx/tefdvEfnrGFqtAQhPNv5N/uAwRxDMI4NDSWBAgMBAAECggEAHqkjFD0YI4dAwth6LRjsFpkhUUqnJkew+7EkBEHzQMbuQPpqyauaIUv81DhAqIDaaAlt/S84kccPkRIZXjGATpKEt0pE+x7erAd09lFDUMvOdEeBi79GDqAJ2bk8RKAqgHRj0i9jqq+AYIjYcOiB2j6A9cFogKqP/R9JZHkrhmPd34YxkvMvVy5GXsRXeWcruvyu+O1ai5GPUZw1FEPPEBP2ejvD6xX+8LQ6LKuoaTTByrdQpAk66/ykH8+p7aolCbLggFQvUDfqxTXShXZk0Z7mfhJsJnILcj0+k68L3xB19rhJL3NzIuA/8X2Ipo7u1eA6X17hKBhtUUnnmTP7QQKBgQDysl+WGj02pvylAeKKJlFsTXIC5IYbd91uUCmVTVDjGhcyfKKAIfJYxOp9V5dCMz/zG+m+V4EZdDTLNJrnkemGgB5QSN5+5MbRqch3LvX92WoTXs3YBWrxy+kfIZQCdvbIR4kIKXNVpNSqy1EdBlTAwCMJLKh0v/JZC54rGD3ZOQKBgQC4lPc0tkFzlOPD6XbJFMtLp+Mcogz0XW8c/kvrGR3sRs1AnKbYdn9nfR7hUqCXXWYyNuhUO4QwOZKM+VDJz2w1bnpluQpEmUYXgsIok4Tn7zPbuknzG05pw8YwqbkL96FBN7oAWGLW7LIihdcbMOerm3FBGHcrdeMsrFeIipEWiQKBgC87/hSFqNJBL7yhoEiI6qHsdLsRZPRloMf+fAld0ddRVaBy12Geub8DHCwm5v5wYQrcrOJpv2uHzVqbM2bMZCnUN5IijIMf3X4i0Cw6DJBKRzXb5q4bZ9QFfqqba2YLZz5Vhdr7zkGl4eoXxgKjH82f13HKqkKGtREVjMQQZMEpAoGATlhkSQpm45E5z8kDczwRQg6Dln6t8vbJl8vUG3iwu74dlqQnKU+6qglwlwEEStsI6p1lpYMRi4qUSqP0B4S0EEXRS+Xrlsxb9NS6ZpCe4/ci0svSYY6gjMHdGIChm5PC7TSjDUx2v3T98ytN7yul2bADtTaWNms2Ppr0GG+AP8kCgYEA3/y+q801/glLvib8+HR36OUs+9l+E/oyyTjVqB1A/d/LRgE5gGqRw6G1Jy2ZxxJ7zcG0TBvjv65B1Iwt45uNb8Uhw6r6PTHlZUE+F8/Hjzmh3Nk5YVoTQj4PqiSLaxhPao0Dkyrmoxmx9DN097A2AMk1FAvbLE+y9dsu78hH3XI=
+
+auth:
+    #url: http://localhost:8081/remote/authRemoteService
+    url: http://175.6.4.138:3681/authentication/remote/authRemoteService   
+    
+eureka:
+    client:
+      #service-url.defaultZone: http://192.168.0.128:8761/eureka 
+      service-url.defaultZone:  http://admin:123@192.168.1.253:7010/eureka     
+      #service-url.defaultZone: http://admin:123@192.168.1.253:7010/eureka     
+      enabled: true  
+      registerWithEureka: true
+      fetchRegistry: true  
+      healthcheck.enabled: true
+    instance:
+      #status-page-url-path: ${management.context-path}/info
+      #health-check-url-path: ${management.context-path}/health
+      prefer-ip-address: true    
+      instance-id: ${spring.cloud.client.ipAddress}:${server.port} 
+            
+   
+---
+spring:
+  profiles: test
+  #mysql
+  datasource:
+      driver-class-name: com.mysql.jdbc.Driver
+     
+      username: root
+      password: xymysqlroot_2019
+      url: jdbc:mysql://127.0.0.1:3316/xyplatdb?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false #&allowMultiQueries=true
+      type: com.alibaba.druid.pool.DruidDataSource 
+      #test-while-idle: true
+      #time-between-eviction-runs-millis: 300000
+      #min-evictable-idle-time-millis: 1800000
+      
+      initialSize: 5  
+      minIdle: 5  
+      maxActive: 20  
+      maxWait: 60000  
+      timeBetweenEvictionRunsMillis: 60000  
+      minEvictableIdleTimeMillis: 300000  
+      validationQuery: SELECT NOW()  
+      testWhileIdle: true  
+      testOnBorrow: true  
+      testOnReturn: false  
+      poolPreparedStatements: true  
+      maxPoolPreparedStatementPerConnectionSize: 20  
+      filters: stat,wall,log4j 
+      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 
+            
+#redis
+  redis:
+    database: 0
+    host: 127.0.0.1
+    password:  XY#123456@mm
+    port: 6389
+    pool:
+      min-idle: 1
+      max-idle: 8
+      max-active: 100
+      max-wait: 1
+    timeout: 10000
+ #监控 
+  #boot.admin.url: http://localhost:8080     
+ #log
+logging:
+    file: logs/service-pay-third.log
+    level:
+      root: INFO
+      com.xynet: INFO
+    
+#server 
+server:
+  port: 8115
+
+app:
+    fileHome: file/
+    tempFileHome: tmp/
+    xxwAppId: 202310201164921719597563904
+    xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu/W4vOOFFTEYMpVqSASQgqlKsxsgV6UnYf4OhskXXKWwwnZFKcqFh++aW9Aw73s1vZgoXKv/SVYEmrB48qJjZHZzVMg5BI6So8gs7JomwH7rNR9le1Xs3OVP5vML6jDVuCjd61/qyG++A3P+GviOCLny3qiytsVFBA9LfN+P9OoB7tW6FbRTlTRUNB0oKR+Hlg1wRKP+USuRUWzXQxZt0Ie0SmpDcnfAduUPurcODbrkqF5e4ic0mfXFhqPB6o9hUs0onjnc2P0W374rPUcWRxJJa5wT/6XFqYV5OSob6KSA9qBx/tefdvEfnrGFqtAQhPNv5N/uAwRxDMI4NDSWBAgMBAAECggEAHqkjFD0YI4dAwth6LRjsFpkhUUqnJkew+7EkBEHzQMbuQPpqyauaIUv81DhAqIDaaAlt/S84kccPkRIZXjGATpKEt0pE+x7erAd09lFDUMvOdEeBi79GDqAJ2bk8RKAqgHRj0i9jqq+AYIjYcOiB2j6A9cFogKqP/R9JZHkrhmPd34YxkvMvVy5GXsRXeWcruvyu+O1ai5GPUZw1FEPPEBP2ejvD6xX+8LQ6LKuoaTTByrdQpAk66/ykH8+p7aolCbLggFQvUDfqxTXShXZk0Z7mfhJsJnILcj0+k68L3xB19rhJL3NzIuA/8X2Ipo7u1eA6X17hKBhtUUnnmTP7QQKBgQDysl+WGj02pvylAeKKJlFsTXIC5IYbd91uUCmVTVDjGhcyfKKAIfJYxOp9V5dCMz/zG+m+V4EZdDTLNJrnkemGgB5QSN5+5MbRqch3LvX92WoTXs3YBWrxy+kfIZQCdvbIR4kIKXNVpNSqy1EdBlTAwCMJLKh0v/JZC54rGD3ZOQKBgQC4lPc0tkFzlOPD6XbJFMtLp+Mcogz0XW8c/kvrGR3sRs1AnKbYdn9nfR7hUqCXXWYyNuhUO4QwOZKM+VDJz2w1bnpluQpEmUYXgsIok4Tn7zPbuknzG05pw8YwqbkL96FBN7oAWGLW7LIihdcbMOerm3FBGHcrdeMsrFeIipEWiQKBgC87/hSFqNJBL7yhoEiI6qHsdLsRZPRloMf+fAld0ddRVaBy12Geub8DHCwm5v5wYQrcrOJpv2uHzVqbM2bMZCnUN5IijIMf3X4i0Cw6DJBKRzXb5q4bZ9QFfqqba2YLZz5Vhdr7zkGl4eoXxgKjH82f13HKqkKGtREVjMQQZMEpAoGATlhkSQpm45E5z8kDczwRQg6Dln6t8vbJl8vUG3iwu74dlqQnKU+6qglwlwEEStsI6p1lpYMRi4qUSqP0B4S0EEXRS+Xrlsxb9NS6ZpCe4/ci0svSYY6gjMHdGIChm5PC7TSjDUx2v3T98ytN7yul2bADtTaWNms2Ppr0GG+AP8kCgYEA3/y+q801/glLvib8+HR36OUs+9l+E/oyyTjVqB1A/d/LRgE5gGqRw6G1Jy2ZxxJ7zcG0TBvjv65B1Iwt45uNb8Uhw6r6PTHlZUE+F8/Hjzmh3Nk5YVoTQj4PqiSLaxhPao0Dkyrmoxmx9DN097A2AMk1FAvbLE+y9dsu78hH3XI=
+     
+auth:
+    url: http://127.0.0.1:8081/remote/authRemoteService
+    
+eureka:
+  client:
+    service-url.defaultZone: http://eureka:eureka_xyplat@127.0.0.1:8080/eureka
+    enabled: true     
+    registerWithEureka: true
+    fetchRegistry: true
+  instance:
+    prefer-ip-address: true    
+    instance-id: ${spring.cloud.client.ipAddress}:${server.port}
+
+zhong:
+  notifyUrl: apitest/service-pay-third/third/pay/api/notifyBOC
+  prvateKey: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQChSlsRd+721kGVqGRAcTfuL4juQPb0iobS+iXlF/hzlS7qOQ3xYDtY2n23t9nBv8E0sSdIDrMhlJIS/yELPVSGAJIC21KItWXIobZ5pwUhRi89SQ1I6iiPzlLAHoKz1DGUX5G3ULThf9ONTSGQErMMXwI98unM7v8WqKR5+HPZL+yghVqCV8BGHoJtq1hsS01lmdwGmY/9+YiMPt4rdaAq4OeKtT8DfBuNiGLA8TnwN3sevKz2c5FShvbISjwNNUPRYmqb8rMSBbv4rAX4z9Kki1mFm+4MuxtWrcg+/dMRJHm17OlOp8GdzNo33Api7BH1IgnjmG3z7haQx/DzoOstAgMBAAECggEAaV4oDEtro3npMpnllGvifAo1zGBIdQ0icyXUJ8v3FZs6IO3Q/AVAABYM1z6WVYqt73xkCyD/SUrD+wENV0hjtX8d5Bvf2UuYCPAMQ4EnSsuNBN56fU3r3baOPNAx1sUi9qlQio+A+2gEjmT7LiHpMoXG8y2EK8tefjEB8mSrWhB027UXeA+zZhnsmeY5s0Q7mOU8gzKaNjQLVVNr5DZvzJ2znpFCBQIRZ9gjrXzVLzNSdIoOTxbZcEaMOt4/NYTdGN1r/8fBbWlMZ87IMIHwJusifzXwA8u8EUoO1NGV8N8s+ioQLrDqghLu7Zop1HDNqGP8Bw1ZI+Bb8dKtP+dsSQKBgQD0dUZkk0Ro6bylkKh2uGLyndwZahVBv6qJg0igPVnG+srAA/hXQTcmtdo+a0HzE32a9KPCqT33pxxRS8uv1mv/387VgFYlBNRG0swnTNR+Ct0d2r9EdEEP+EjC9raN+Ld16ci5iQwwQ2rJshnu6Cbu4Y1UaWfvmKMjvb1bUA9vEwKBgQCo59jTiKRqYFtLEFhUOOy58Ny8nhOlbfNV5RTNE/fUJZ0bYvnkJU+SwfpYfSU1pDfZx4G3XNUdQadkxO/zn1EZxFVnax1OmodeuxBvIyAluqGPcrOHd5FgbMSqZyQts5JHcJdb2/CihRQ4JoM4S+NeN5QoAvcBxoR7oYEyTnREvwKBgBujzuu8QvXhx7SooIOb4YQxGRu+hNzEQRH/SAzmIup+nMINMN0cwJGd6ik4k2Jah88nbgSqghkoSelfOo6NHfT2Zzp4okTZQO8pEnA3HaeKrumbPBkPU/PsTL3Oi2GOB6BLaKihuEEUvlRD0O7UTOKhmgs7R8ctaPS3lVtnt/cFAoGAe829A4gjo4lPQV0QsWMsOTqQQXzIv7gw5WPNdGhPfmO3nYxVyGGEyvh97ICGVqQw/+MZdHKKDzDBZr5ndzXutylOxEgiKixgTxJkgGHJvX3n0AJuDzyYBYqUOKbzQMBf1xdzCjTTU/yhjmrEQe52EOhCI3XQ4a9GCmyeC2awGHcCgYB441H4Ys+kNP9Zi1nWJCz+vOtWf6gMY6le7kZtPhpyAgANrGmLv/djlAPfrpgZO9EsufnE1YtcVv8f+JNG+o/lPsyYT/5B3K9OFlV80P6x01V8lF1V3PX48TPk1d56bhi4SGwchNVf7u12cj2FOrgRks+e9o5WmGLWdtQgs3bkYQ==
+  merchantId: 138620080012800
+  trmNo: 97027311
+  publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjBSmvi3Xmvrne2heayLd0yPPz1J7JlMCiTg8qVU0vyFAytglP0V3SHGjwwMUI0MAXDENf0FoFlVmltvVtiXqQG4zZUNec2kgM2/uA0dfLr5yyuqTO/IR1B0BrJ3COguMYIM48GE+DIiiCfRYgjSQxCMD8zZriX7p1up2cJRJqGsOxgoiv6HekmQUGfyb4ZoSHAaksniDR1nZ/CEJrhp03S8pLN8OmM2Y5PSZgMx5e4HgTkqDrnijZzVEnPCjXcWlR6+vFuFVqahyr4qAXFuS4wj0/GSXONos5Ihm/Cuj2SaJpyPChSaWfrGQPuxUj/CamjR9KnwqEfwmC6i2qYI95wIDAQAB
+
+
+---
+
+spring:
+  profiles: local
+
+      
+---
+spring:
+  profiles: prod
+  datasource:
+      driver-class-name: com.mysql.jdbc.Driver
+      username: xyplat
+      password: Z4t1k#Hmbo9
+      url: jdbc:mysql://rm-8vb5482le656d20el.mysql.zhangbei.rds.aliyuncs.com:3306/xyplatdb?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false #&allowMultiQueries=true
+      type: com.alibaba.druid.pool.DruidDataSource 
+      
+      initialSize: 5  
+      minIdle: 5  
+      maxActive: 20  
+      maxWait: 60000  
+      timeBetweenEvictionRunsMillis: 60000  
+      minEvictableIdleTimeMillis: 300000  
+      validationQuery: SELECT NOW()  
+      testWhileIdle: true  
+      testOnBorrow: true  
+      testOnReturn: false  
+      poolPreparedStatements: true  
+      maxPoolPreparedStatementPerConnectionSize: 20  
+      filters: stat,wall,log4j 
+      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 
+
+  #jpa
+  jpa: 
+      show-sql: true
+      open-in-view: true  
+      
+  zipkin:
+    enabled: false
+    baseUrl: http://192.168.0.94:8088/
+
+  sleuth:
+     sampler:
+       #  采样率
+       percentage: 0.1
+
+#redis
+  redis:
+    database: 0
+    host: 172.26.239.162
+    password:  mWcMj69novC9
+    port: 7382
+    pool:
+      min-idle: 1
+      max-idel: 8
+      max-active: 100
+      max-wait: 1
+    timeout: 3000
+    
+logging:
+    level:
+      root: INFO
+      com.xynet: INFO
+    file: logs/service-pay-third.log
+    
+#server 
+server:
+  port: 8115
+
+app:
+    fileHome: file/
+    tempFileHome: tmp/
+    xxwAppId: 202310201164921719597563904
+    xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu/W4vOOFFTEYMpVqSASQgqlKsxsgV6UnYf4OhskXXKWwwnZFKcqFh++aW9Aw73s1vZgoXKv/SVYEmrB48qJjZHZzVMg5BI6So8gs7JomwH7rNR9le1Xs3OVP5vML6jDVuCjd61/qyG++A3P+GviOCLny3qiytsVFBA9LfN+P9OoB7tW6FbRTlTRUNB0oKR+Hlg1wRKP+USuRUWzXQxZt0Ie0SmpDcnfAduUPurcODbrkqF5e4ic0mfXFhqPB6o9hUs0onjnc2P0W374rPUcWRxJJa5wT/6XFqYV5OSob6KSA9qBx/tefdvEfnrGFqtAQhPNv5N/uAwRxDMI4NDSWBAgMBAAECggEAHqkjFD0YI4dAwth6LRjsFpkhUUqnJkew+7EkBEHzQMbuQPpqyauaIUv81DhAqIDaaAlt/S84kccPkRIZXjGATpKEt0pE+x7erAd09lFDUMvOdEeBi79GDqAJ2bk8RKAqgHRj0i9jqq+AYIjYcOiB2j6A9cFogKqP/R9JZHkrhmPd34YxkvMvVy5GXsRXeWcruvyu+O1ai5GPUZw1FEPPEBP2ejvD6xX+8LQ6LKuoaTTByrdQpAk66/ykH8+p7aolCbLggFQvUDfqxTXShXZk0Z7mfhJsJnILcj0+k68L3xB19rhJL3NzIuA/8X2Ipo7u1eA6X17hKBhtUUnnmTP7QQKBgQDysl+WGj02pvylAeKKJlFsTXIC5IYbd91uUCmVTVDjGhcyfKKAIfJYxOp9V5dCMz/zG+m+V4EZdDTLNJrnkemGgB5QSN5+5MbRqch3LvX92WoTXs3YBWrxy+kfIZQCdvbIR4kIKXNVpNSqy1EdBlTAwCMJLKh0v/JZC54rGD3ZOQKBgQC4lPc0tkFzlOPD6XbJFMtLp+Mcogz0XW8c/kvrGR3sRs1AnKbYdn9nfR7hUqCXXWYyNuhUO4QwOZKM+VDJz2w1bnpluQpEmUYXgsIok4Tn7zPbuknzG05pw8YwqbkL96FBN7oAWGLW7LIihdcbMOerm3FBGHcrdeMsrFeIipEWiQKBgC87/hSFqNJBL7yhoEiI6qHsdLsRZPRloMf+fAld0ddRVaBy12Geub8DHCwm5v5wYQrcrOJpv2uHzVqbM2bMZCnUN5IijIMf3X4i0Cw6DJBKRzXb5q4bZ9QFfqqba2YLZz5Vhdr7zkGl4eoXxgKjH82f13HKqkKGtREVjMQQZMEpAoGATlhkSQpm45E5z8kDczwRQg6Dln6t8vbJl8vUG3iwu74dlqQnKU+6qglwlwEEStsI6p1lpYMRi4qUSqP0B4S0EEXRS+Xrlsxb9NS6ZpCe4/ci0svSYY6gjMHdGIChm5PC7TSjDUx2v3T98ytN7yul2bADtTaWNms2Ppr0GG+AP8kCgYEA3/y+q801/glLvib8+HR36OUs+9l+E/oyyTjVqB1A/d/LRgE5gGqRw6G1Jy2ZxxJ7zcG0TBvjv65B1Iwt45uNb8Uhw6r6PTHlZUE+F8/Hjzmh3Nk5YVoTQj4PqiSLaxhPao0Dkyrmoxmx9DN097A2AMk1FAvbLE+y9dsu78hH3XI=
+
+eureka:
+  client:
+    service-url.defaultZone: http://eureka:eureka_xyplat@172.26.239.164:8761/eureka
+    registry-fetch-interval-seconds: 5 # 默认为30秒
+    enabled: true  
+    registerWithEureka: true
+    fetchRegistry: true  
+    healthcheck.enabled: true
+    
+  instance:
+    lease-renewal-interval-in-seconds: 5
+    lease-expiration-duration-in-seconds: 5
+    prefer-ip-address: true    
+    instance-id: ${spring.cloud.client.ipAddress}:${server.port}  
+    
+
+#小麦
+orderNotifyUrl: https://xcx.xynetweb.com/service-order/jzgcl/closeDoorState
+closeNotify: https://xcx.xynetweb.com/service-order/jzgcl/closeDoor
+key: xInYuAnWaNgLuOsIgN
+companyId: 113
+#中行智慧付
+zhong:
+  notifyUrl: service-pay-third/third/pay/api/notifyBOC
+  prvateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCMA535xCcPJQ5b9J2nbj01FyG7zLc2Si6Zd0zS6vW5qygm6YwebWpqG37uJEulRjF6q6aGiCFrt7f8Mb5qOuBu/iZ3ByJn/UOGzDJYIl8nXxhCKzudZ8C2yq9hwtVKICzcEXphxtUbA1RutX1EiViFdPVIpCk0NPfzukzX8JaVoS2C4YUCnedpAUzD9if7N1wDYFaNdjuEOH1FznXPBO9unRU5dacVix6rqgFL5Lg5jdHdzra5GRZWdTFI9bL4UPbnOTK7rvt/963qM47F1vTf0KQR8F0pBb5kSsWZvg05bAGeYGi0TOQPRuddD1DZz5i1B71IPhEp23eLahqd5cBZAgMBAAECggEABE6YLXa7PNwG9Q0xTFU3zMpJX12MxT7C8DWbR2Gy7WM2ePv2M3lqLJlr7idvrEXcf8mH9dt6K7YbEsb09I+bF875n++4PzqrORpO8icchjmGpYJu8wieBQF3I6q6pO0YdCyVdyyGoa4Yis9KazFOZ8yRPwrNua1nczfn5TyhZTjkYec2zbWgU0XEk6DDj2NJO7Y9ut7o3+0xeVLE1WR5e324jS1DjHVafBGMnAaA7HBOIHmPp75OwXiFf6S6wwqTH4vMe+ivXq1RVo2M8Y28UvY3WNSkW5drEhDipz//fuMLowHLmTFYWzvq4pS3UjykSj6zWwDDf0HJRwipPtoAAQKBgQDJdBmhVfMLwkP9oHvzn5IZiCnunKymy3fZX5Wu6vjrn4wmDWuUoa53Hj3h2yTHZ4I/DQ29sMFd6M0+kC4aE60ecvD7o+eLRXqlJiuVUf9UijSB7BxznyAN0EGY1AcrNLLVQy/WMBxddMkOTyxAYi6CFwM2YCZNQbtI7gA8CLPpWQKBgQCx7MzhBHxgnda5oMR3Yuc2awZ6Fcka9vdRzU1UE6B5p4xbgKJcZIJgQsBaq0ZsYiSlAIoZX/dnL8eSMWK4ag6+ycCXo1AqNth1/Q+oS+IN9cuWFA0ofj49mJzkoM5oQVpgabzwnPVoj8pG9Y6BXLab1obdChwE64SvhtFz+l6vAQKBgFooPXg40QcIMAmIEzEazvXiPHHvaE1VbhO4dXLM8g3xX3WAOA9StJPW0vcLblBXgLDbFLU6L6/pikFfoWJGQAoKgtL7rZpkw9i5VnQDOHQLTih/FNSh+GR2OYU+Dt9FPGu5H+WJrogcxgZDZJiD2DCcP/HL4hhdPIYNDcnQU0QxAoGBAKhT8ZjIl6sIaMcBdB3GshvnsR77UWFzWJRJeOkcEGxHuSAwWGq0pCvRuw2MkHmleCmqkvxisDstFtAWbOEvZXfWg6ByXzsw3CT0H0YHVHwEmHEJ01EF7nhz06rw/5XejlQ8dQXmWL5tmt77HbEBN7nDgZ/JGq0E7GjrUWk56y4BAoGAKIA5F3e09oFPjfOVfq5cdfWPCVG0wYN//LNzx4REIUVyUCem423WB+TBMw7cQVHbHdYahO6Uqtlk0ONYG8CAxHVvEzJOXrqygf84DPNL06N/5ArH3czroG/mgX5f632xxlS5ppP31jLrSJjCl2sX17RuPRlyYpvbEkTDrlgPlqw=
+  merchantId: 888618050003300
+  trmNo: 97033623
+  publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjAOd+cQnDyUOW/Sdp249NRchu8y3NkoumXdM0ur1uasoJumMHm1qaht+7iRLpUYxequmhogha7e3/DG+ajrgbv4mdwciZ/1DhswyWCJfJ18YQis7nWfAtsqvYcLVSiAs3BF6YcbVGwNUbrV9RIlYhXT1SKQpNDT387pM1/CWlaEtguGFAp3naQFMw/Yn+zdcA2BWjXY7hDh9Rc51zwTvbp0VOXWnFYseq6oBS+S4OY3R3c62uRkWVnUxSPWy+FD25zkyu677f/et6jOOxdb039CkEfBdKQW+ZErFmb4NOWwBnmBotEzkD0bnXQ9Q2c+YtQe9SD4RKdt3i2oaneXAWQIDAQAB
+
+
+---
+spring:
+  profiles: prodlt
+  datasource:
+      driver-class-name: com.mysql.jdbc.Driver
+      username: root
+      password: root
+      url: jdbc:mysql://172.26.239.151:3306/xyplatdb?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&rewriteBatchedStatements=true&autoReconnect=true
+      type: com.alibaba.druid.pool.DruidDataSource 
+      
+      initialSize: 5  
+      minIdle: 5  
+      maxActive: 20  
+      maxWait: 60000  
+      timeBetweenEvictionRunsMillis: 60000  
+      minEvictableIdleTimeMillis: 300000  
+      validationQuery: SELECT NOW()  
+      testWhileIdle: true  
+      testOnBorrow: true  
+      testOnReturn: false  
+      poolPreparedStatements: true  
+      maxPoolPreparedStatementPerConnectionSize: 20  
+      filters: stat,log4j  
+      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000  
+
+  #jpa
+  jpa: 
+      show-sql: true
+      open-in-view: true  
+      
+  zipkin:
+    enabled: false
+    baseUrl: http://192.168.0.94:8088/
+
+  sleuth:
+     sampler:
+       #  采样率
+       percentage: 0.1
+            
+#redis
+  redis:
+    database: 0
+    host: 172.26.239.150
+    password:  XY#123456@mm
+    port: 6379
+    pool:
+      min-idle: 1
+      max-idel: 8
+      max-active: 100
+      max-wait: 1    
+    timeout: 3000 
+    
+logging:
+    level:
+      root: WARN
+      com.xynet: DEBUG
+    file: logs/service-pay-third.log
+    
+#server 
+server:
+  port: 8115
+
+app:
+    fileHome: file/
+    tempFileHome: tmp/
+    xxwAppId: 202310201164921719597563904
+    xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu/W4vOOFFTEYMpVqSASQgqlKsxsgV6UnYf4OhskXXKWwwnZFKcqFh++aW9Aw73s1vZgoXKv/SVYEmrB48qJjZHZzVMg5BI6So8gs7JomwH7rNR9le1Xs3OVP5vML6jDVuCjd61/qyG++A3P+GviOCLny3qiytsVFBA9LfN+P9OoB7tW6FbRTlTRUNB0oKR+Hlg1wRKP+USuRUWzXQxZt0Ie0SmpDcnfAduUPurcODbrkqF5e4ic0mfXFhqPB6o9hUs0onjnc2P0W374rPUcWRxJJa5wT/6XFqYV5OSob6KSA9qBx/tefdvEfnrGFqtAQhPNv5N/uAwRxDMI4NDSWBAgMBAAECggEAHqkjFD0YI4dAwth6LRjsFpkhUUqnJkew+7EkBEHzQMbuQPpqyauaIUv81DhAqIDaaAlt/S84kccPkRIZXjGATpKEt0pE+x7erAd09lFDUMvOdEeBi79GDqAJ2bk8RKAqgHRj0i9jqq+AYIjYcOiB2j6A9cFogKqP/R9JZHkrhmPd34YxkvMvVy5GXsRXeWcruvyu+O1ai5GPUZw1FEPPEBP2ejvD6xX+8LQ6LKuoaTTByrdQpAk66/ykH8+p7aolCbLggFQvUDfqxTXShXZk0Z7mfhJsJnILcj0+k68L3xB19rhJL3NzIuA/8X2Ipo7u1eA6X17hKBhtUUnnmTP7QQKBgQDysl+WGj02pvylAeKKJlFsTXIC5IYbd91uUCmVTVDjGhcyfKKAIfJYxOp9V5dCMz/zG+m+V4EZdDTLNJrnkemGgB5QSN5+5MbRqch3LvX92WoTXs3YBWrxy+kfIZQCdvbIR4kIKXNVpNSqy1EdBlTAwCMJLKh0v/JZC54rGD3ZOQKBgQC4lPc0tkFzlOPD6XbJFMtLp+Mcogz0XW8c/kvrGR3sRs1AnKbYdn9nfR7hUqCXXWYyNuhUO4QwOZKM+VDJz2w1bnpluQpEmUYXgsIok4Tn7zPbuknzG05pw8YwqbkL96FBN7oAWGLW7LIihdcbMOerm3FBGHcrdeMsrFeIipEWiQKBgC87/hSFqNJBL7yhoEiI6qHsdLsRZPRloMf+fAld0ddRVaBy12Geub8DHCwm5v5wYQrcrOJpv2uHzVqbM2bMZCnUN5IijIMf3X4i0Cw6DJBKRzXb5q4bZ9QFfqqba2YLZz5Vhdr7zkGl4eoXxgKjH82f13HKqkKGtREVjMQQZMEpAoGATlhkSQpm45E5z8kDczwRQg6Dln6t8vbJl8vUG3iwu74dlqQnKU+6qglwlwEEStsI6p1lpYMRi4qUSqP0B4S0EEXRS+Xrlsxb9NS6ZpCe4/ci0svSYY6gjMHdGIChm5PC7TSjDUx2v3T98ytN7yul2bADtTaWNms2Ppr0GG+AP8kCgYEA3/y+q801/glLvib8+HR36OUs+9l+E/oyyTjVqB1A/d/LRgE5gGqRw6G1Jy2ZxxJ7zcG0TBvjv65B1Iwt45uNb8Uhw6r6PTHlZUE+F8/Hjzmh3Nk5YVoTQj4PqiSLaxhPao0Dkyrmoxmx9DN097A2AMk1FAvbLE+y9dsu78hH3XI=
+
+eureka:
+  client:
+    service-url.defaultZone: http://eureka:eureka_xyplat@172.26.239.151:8761/eureka
+    registry-fetch-interval-seconds: 5 # 默认为30秒
+    enabled: true  
+    registerWithEureka: true
+    fetchRegistry: true  
+    healthcheck.enabled: true
+    
+  instance:
+    lease-renewal-interval-in-seconds: 5
+    lease-expiration-duration-in-seconds: 5
+    prefer-ip-address: true    
+    instance-id: ${spring.cloud.client.ipAddress}:${server.port}  
+    
+---
+spring:
+  profiles: prodsrx
+  datasource:
+      driver-class-name: com.mysql.jdbc.Driver
+      username: root
+      password: xymysqlroot_2019
+      url: jdbc:mysql://172.31.118.25:3316/xyplatdb?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&rewriteBatchedStatements=true&autoReconnect=true
+      type: com.alibaba.druid.pool.DruidDataSource 
+      
+      initialSize: 5  
+      minIdle: 5  
+      maxActive: 20  
+      maxWait: 60000  
+      timeBetweenEvictionRunsMillis: 60000  
+      minEvictableIdleTimeMillis: 300000  
+      validationQuery: SELECT NOW()  
+      testWhileIdle: true  
+      testOnBorrow: true  
+      testOnReturn: false  
+      poolPreparedStatements: true  
+      maxPoolPreparedStatementPerConnectionSize: 20  
+      filters: stat,log4j  
+      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000  
+
+  #jpa
+  jpa: 
+      show-sql: true
+      open-in-view: true  
+      
+  zipkin:
+    enabled: false
+    baseUrl: http://115.28.187.223:8088/
+
+  sleuth:
+     sampler:
+       #  采样率
+       percentage: 0.1
+            
+#redis
+  redis:
+    database: 0
+    host: 172.31.118.24
+    password:  XY#123456@mm
+    port: 6389
+    pool:
+      min-idle: 1
+      max-idel: 8
+      max-active: 100
+      max-wait: 1    
+    timeout: 3000 
+    
+logging:
+    level:
+      root: WARN
+      com.xynet: DEBUG
+    file: logs/service-pay-third.log
+    
+#server 
+server:
+  port: 80
+
+app:
+    fileHome: file/
+    tempFileHome: tmp/
+    xxwAppId: 202310201164921719597563904
+    xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu/W4vOOFFTEYMpVqSASQgqlKsxsgV6UnYf4OhskXXKWwwnZFKcqFh++aW9Aw73s1vZgoXKv/SVYEmrB48qJjZHZzVMg5BI6So8gs7JomwH7rNR9le1Xs3OVP5vML6jDVuCjd61/qyG++A3P+GviOCLny3qiytsVFBA9LfN+P9OoB7tW6FbRTlTRUNB0oKR+Hlg1wRKP+USuRUWzXQxZt0Ie0SmpDcnfAduUPurcODbrkqF5e4ic0mfXFhqPB6o9hUs0onjnc2P0W374rPUcWRxJJa5wT/6XFqYV5OSob6KSA9qBx/tefdvEfnrGFqtAQhPNv5N/uAwRxDMI4NDSWBAgMBAAECggEAHqkjFD0YI4dAwth6LRjsFpkhUUqnJkew+7EkBEHzQMbuQPpqyauaIUv81DhAqIDaaAlt/S84kccPkRIZXjGATpKEt0pE+x7erAd09lFDUMvOdEeBi79GDqAJ2bk8RKAqgHRj0i9jqq+AYIjYcOiB2j6A9cFogKqP/R9JZHkrhmPd34YxkvMvVy5GXsRXeWcruvyu+O1ai5GPUZw1FEPPEBP2ejvD6xX+8LQ6LKuoaTTByrdQpAk66/ykH8+p7aolCbLggFQvUDfqxTXShXZk0Z7mfhJsJnILcj0+k68L3xB19rhJL3NzIuA/8X2Ipo7u1eA6X17hKBhtUUnnmTP7QQKBgQDysl+WGj02pvylAeKKJlFsTXIC5IYbd91uUCmVTVDjGhcyfKKAIfJYxOp9V5dCMz/zG+m+V4EZdDTLNJrnkemGgB5QSN5+5MbRqch3LvX92WoTXs3YBWrxy+kfIZQCdvbIR4kIKXNVpNSqy1EdBlTAwCMJLKh0v/JZC54rGD3ZOQKBgQC4lPc0tkFzlOPD6XbJFMtLp+Mcogz0XW8c/kvrGR3sRs1AnKbYdn9nfR7hUqCXXWYyNuhUO4QwOZKM+VDJz2w1bnpluQpEmUYXgsIok4Tn7zPbuknzG05pw8YwqbkL96FBN7oAWGLW7LIihdcbMOerm3FBGHcrdeMsrFeIipEWiQKBgC87/hSFqNJBL7yhoEiI6qHsdLsRZPRloMf+fAld0ddRVaBy12Geub8DHCwm5v5wYQrcrOJpv2uHzVqbM2bMZCnUN5IijIMf3X4i0Cw6DJBKRzXb5q4bZ9QFfqqba2YLZz5Vhdr7zkGl4eoXxgKjH82f13HKqkKGtREVjMQQZMEpAoGATlhkSQpm45E5z8kDczwRQg6Dln6t8vbJl8vUG3iwu74dlqQnKU+6qglwlwEEStsI6p1lpYMRi4qUSqP0B4S0EEXRS+Xrlsxb9NS6ZpCe4/ci0svSYY6gjMHdGIChm5PC7TSjDUx2v3T98ytN7yul2bADtTaWNms2Ppr0GG+AP8kCgYEA3/y+q801/glLvib8+HR36OUs+9l+E/oyyTjVqB1A/d/LRgE5gGqRw6G1Jy2ZxxJ7zcG0TBvjv65B1Iwt45uNb8Uhw6r6PTHlZUE+F8/Hjzmh3Nk5YVoTQj4PqiSLaxhPao0Dkyrmoxmx9DN097A2AMk1FAvbLE+y9dsu78hH3XI=
+
+eureka:
+  client:
+    service-url.defaultZone: http://eureka:eureka_xyplat@172.31.118.25:8080/eureka
+    registry-fetch-interval-seconds: 5 # 默认为30秒
+    enabled: true  
+    registerWithEureka: true
+    fetchRegistry: true  
+    healthcheck.enabled: true
+    
+  instance:
+    lease-renewal-interval-in-seconds: 5
+    lease-expiration-duration-in-seconds: 5
+    prefer-ip-address: true    
+    instance-id: ${spring.cloud.client.ipAddress}:${server.port} 
+
+---
+spring:
+  profiles: prodame
+  datasource:
+      driver-class-name: com.mysql.jdbc.Driver
+      username: root
+      password: xymysqlroot_2019
+      url: jdbc:mysql://172.18.162.5:3316/xyplatdb?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&rewriteBatchedStatements=true&autoReconnect=true
+      type: com.alibaba.druid.pool.DruidDataSource 
+      
+      initialSize: 5  
+      minIdle: 5  
+      maxActive: 20  
+      maxWait: 60000  
+      timeBetweenEvictionRunsMillis: 60000  
+      minEvictableIdleTimeMillis: 300000  
+      validationQuery: SELECT NOW()  
+      testWhileIdle: true  
+      testOnBorrow: true  
+      testOnReturn: false  
+      poolPreparedStatements: true  
+      maxPoolPreparedStatementPerConnectionSize: 20  
+      filters: stat,log4j  
+      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000  
+
+  #jpa
+  jpa: 
+      show-sql: true
+      open-in-view: true  
+      
+  zipkin:
+    enabled: false
+    baseUrl: http://115.28.187.223:8088/
+
+  sleuth:
+     sampler:
+       #  采样率
+       percentage: 0.1
+            
+#redis
+  redis:
+    database: 0
+    host: 172.18.162.6
+    password:  XY#123456@mm
+    port: 6389
+    pool:
+      min-idle: 1
+      max-idel: 8
+      max-active: 100
+      max-wait: 1    
+    timeout: 3000 
+    
+logging:
+    level:
+      root: INFO
+      com.xynet: INFO
+    file: logs/service-pay-third.log
+    
+#server 
+server:
+  port: 80
+
+app:
+    fileHome: file/
+    tempFileHome: tmp/
+    xxwAppId: 202310201164921719597563904
+    xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu/W4vOOFFTEYMpVqSASQgqlKsxsgV6UnYf4OhskXXKWwwnZFKcqFh++aW9Aw73s1vZgoXKv/SVYEmrB48qJjZHZzVMg5BI6So8gs7JomwH7rNR9le1Xs3OVP5vML6jDVuCjd61/qyG++A3P+GviOCLny3qiytsVFBA9LfN+P9OoB7tW6FbRTlTRUNB0oKR+Hlg1wRKP+USuRUWzXQxZt0Ie0SmpDcnfAduUPurcODbrkqF5e4ic0mfXFhqPB6o9hUs0onjnc2P0W374rPUcWRxJJa5wT/6XFqYV5OSob6KSA9qBx/tefdvEfnrGFqtAQhPNv5N/uAwRxDMI4NDSWBAgMBAAECggEAHqkjFD0YI4dAwth6LRjsFpkhUUqnJkew+7EkBEHzQMbuQPpqyauaIUv81DhAqIDaaAlt/S84kccPkRIZXjGATpKEt0pE+x7erAd09lFDUMvOdEeBi79GDqAJ2bk8RKAqgHRj0i9jqq+AYIjYcOiB2j6A9cFogKqP/R9JZHkrhmPd34YxkvMvVy5GXsRXeWcruvyu+O1ai5GPUZw1FEPPEBP2ejvD6xX+8LQ6LKuoaTTByrdQpAk66/ykH8+p7aolCbLggFQvUDfqxTXShXZk0Z7mfhJsJnILcj0+k68L3xB19rhJL3NzIuA/8X2Ipo7u1eA6X17hKBhtUUnnmTP7QQKBgQDysl+WGj02pvylAeKKJlFsTXIC5IYbd91uUCmVTVDjGhcyfKKAIfJYxOp9V5dCMz/zG+m+V4EZdDTLNJrnkemGgB5QSN5+5MbRqch3LvX92WoTXs3YBWrxy+kfIZQCdvbIR4kIKXNVpNSqy1EdBlTAwCMJLKh0v/JZC54rGD3ZOQKBgQC4lPc0tkFzlOPD6XbJFMtLp+Mcogz0XW8c/kvrGR3sRs1AnKbYdn9nfR7hUqCXXWYyNuhUO4QwOZKM+VDJz2w1bnpluQpEmUYXgsIok4Tn7zPbuknzG05pw8YwqbkL96FBN7oAWGLW7LIihdcbMOerm3FBGHcrdeMsrFeIipEWiQKBgC87/hSFqNJBL7yhoEiI6qHsdLsRZPRloMf+fAld0ddRVaBy12Geub8DHCwm5v5wYQrcrOJpv2uHzVqbM2bMZCnUN5IijIMf3X4i0Cw6DJBKRzXb5q4bZ9QFfqqba2YLZz5Vhdr7zkGl4eoXxgKjH82f13HKqkKGtREVjMQQZMEpAoGATlhkSQpm45E5z8kDczwRQg6Dln6t8vbJl8vUG3iwu74dlqQnKU+6qglwlwEEStsI6p1lpYMRi4qUSqP0B4S0EEXRS+Xrlsxb9NS6ZpCe4/ci0svSYY6gjMHdGIChm5PC7TSjDUx2v3T98ytN7yul2bADtTaWNms2Ppr0GG+AP8kCgYEA3/y+q801/glLvib8+HR36OUs+9l+E/oyyTjVqB1A/d/LRgE5gGqRw6G1Jy2ZxxJ7zcG0TBvjv65B1Iwt45uNb8Uhw6r6PTHlZUE+F8/Hjzmh3Nk5YVoTQj4PqiSLaxhPao0Dkyrmoxmx9DN097A2AMk1FAvbLE+y9dsu78hH3XI=
+
+eureka:
+  client:
+    service-url.defaultZone: http://eureka:eureka_xyplat@172.18.162.5:8080/eureka
+    registry-fetch-interval-seconds: 5 # 默认为30秒
+    enabled: true  
+    registerWithEureka: true
+    fetchRegistry: true  
+    healthcheck.enabled: true
+    
+  instance:
+    lease-renewal-interval-in-seconds: 5
+    lease-expiration-duration-in-seconds: 5
+    prefer-ip-address: true    
+    instance-id: ${spring.cloud.client.ipAddress}:${server.port}  
+
+zhong:
+  notifyUrl: ame/service-pay-third/third/pay/api/notifyBOC
+  prvateKey: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQChSlsRd+721kGVqGRAcTfuL4juQPb0iobS+iXlF/hzlS7qOQ3xYDtY2n23t9nBv8E0sSdIDrMhlJIS/yELPVSGAJIC21KItWXIobZ5pwUhRi89SQ1I6iiPzlLAHoKz1DGUX5G3ULThf9ONTSGQErMMXwI98unM7v8WqKR5+HPZL+yghVqCV8BGHoJtq1hsS01lmdwGmY/9+YiMPt4rdaAq4OeKtT8DfBuNiGLA8TnwN3sevKz2c5FShvbISjwNNUPRYmqb8rMSBbv4rAX4z9Kki1mFm+4MuxtWrcg+/dMRJHm17OlOp8GdzNo33Api7BH1IgnjmG3z7haQx/DzoOstAgMBAAECggEAaV4oDEtro3npMpnllGvifAo1zGBIdQ0icyXUJ8v3FZs6IO3Q/AVAABYM1z6WVYqt73xkCyD/SUrD+wENV0hjtX8d5Bvf2UuYCPAMQ4EnSsuNBN56fU3r3baOPNAx1sUi9qlQio+A+2gEjmT7LiHpMoXG8y2EK8tefjEB8mSrWhB027UXeA+zZhnsmeY5s0Q7mOU8gzKaNjQLVVNr5DZvzJ2znpFCBQIRZ9gjrXzVLzNSdIoOTxbZcEaMOt4/NYTdGN1r/8fBbWlMZ87IMIHwJusifzXwA8u8EUoO1NGV8N8s+ioQLrDqghLu7Zop1HDNqGP8Bw1ZI+Bb8dKtP+dsSQKBgQD0dUZkk0Ro6bylkKh2uGLyndwZahVBv6qJg0igPVnG+srAA/hXQTcmtdo+a0HzE32a9KPCqT33pxxRS8uv1mv/387VgFYlBNRG0swnTNR+Ct0d2r9EdEEP+EjC9raN+Ld16ci5iQwwQ2rJshnu6Cbu4Y1UaWfvmKMjvb1bUA9vEwKBgQCo59jTiKRqYFtLEFhUOOy58Ny8nhOlbfNV5RTNE/fUJZ0bYvnkJU+SwfpYfSU1pDfZx4G3XNUdQadkxO/zn1EZxFVnax1OmodeuxBvIyAluqGPcrOHd5FgbMSqZyQts5JHcJdb2/CihRQ4JoM4S+NeN5QoAvcBxoR7oYEyTnREvwKBgBujzuu8QvXhx7SooIOb4YQxGRu+hNzEQRH/SAzmIup+nMINMN0cwJGd6ik4k2Jah88nbgSqghkoSelfOo6NHfT2Zzp4okTZQO8pEnA3HaeKrumbPBkPU/PsTL3Oi2GOB6BLaKihuEEUvlRD0O7UTOKhmgs7R8ctaPS3lVtnt/cFAoGAe829A4gjo4lPQV0QsWMsOTqQQXzIv7gw5WPNdGhPfmO3nYxVyGGEyvh97ICGVqQw/+MZdHKKDzDBZr5ndzXutylOxEgiKixgTxJkgGHJvX3n0AJuDzyYBYqUOKbzQMBf1xdzCjTTU/yhjmrEQe52EOhCI3XQ4a9GCmyeC2awGHcCgYB441H4Ys+kNP9Zi1nWJCz+vOtWf6gMY6le7kZtPhpyAgANrGmLv/djlAPfrpgZO9EsufnE1YtcVv8f+JNG+o/lPsyYT/5B3K9OFlV80P6x01V8lF1V3PX48TPk1d56bhi4SGwchNVf7u12cj2FOrgRks+e9o5WmGLWdtQgs3bkYQ==
+  merchantId: 138620080012800
+  trmNo: 97027311
+  publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjBSmvi3Xmvrne2heayLd0yPPz1J7JlMCiTg8qVU0vyFAytglP0V3SHGjwwMUI0MAXDENf0FoFlVmltvVtiXqQG4zZUNec2kgM2/uA0dfLr5yyuqTO/IR1B0BrJ3COguMYIM48GE+DIiiCfRYgjSQxCMD8zZriX7p1up2cJRJqGsOxgoiv6HekmQUGfyb4ZoSHAaksniDR1nZ/CEJrhp03S8pLN8OmM2Y5PSZgMx5e4HgTkqDrnijZzVEnPCjXcWlR6+vFuFVqahyr4qAXFuS4wj0/GSXONos5Ihm/Cuj2SaJpyPChSaWfrGQPuxUj/CamjR9KnwqEfwmC6i2qYI95wIDAQAB
+
+
+---
+spring:
+  profiles: prodsa
+  datasource:
+      driver-class-name: com.mysql.jdbc.Driver
+      username: root
+      password: xymysqlroot_2019
+      url: jdbc:mysql://172.31.110.205:3316/xyplatdb?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&rewriteBatchedStatements=true&autoReconnect=true
+      type: com.alibaba.druid.pool.DruidDataSource 
+      
+      initialSize: 5  
+      minIdle: 5  
+      maxActive: 20  
+      maxWait: 60000  
+      timeBetweenEvictionRunsMillis: 60000  
+      minEvictableIdleTimeMillis: 300000  
+      validationQuery: SELECT NOW()  
+      testWhileIdle: true  
+      testOnBorrow: true  
+      testOnReturn: false  
+      poolPreparedStatements: true  
+      maxPoolPreparedStatementPerConnectionSize: 20  
+      filters: stat,log4j  
+      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000  
+
+  #jpa
+  jpa: 
+      show-sql: true
+      open-in-view: true  
+      
+  zipkin:
+    enabled: false
+    baseUrl: http://115.28.187.223:8088/
+
+  sleuth:
+     sampler:
+       #  采样率
+       percentage: 0.1
+            
+#redis
+  redis:
+    database: 0
+    host: 172.31.110.204
+    password:  XY#123456@mm
+    port: 6389
+    pool:
+      min-idle: 1
+      max-idel: 8
+      max-active: 100
+      max-wait: 1    
+    timeout: 3000 
+    
+logging:
+    level:
+      root: WARN
+      com.xynet: DEBUG
+    file: logs/service-pay-third.log
+    
+#server 
+server:
+  port: 80
+
+app:
+    fileHome: file/
+    tempFileHome: tmp/
+    xxwAppId: 202310201164921719597563904
+    xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu/W4vOOFFTEYMpVqSASQgqlKsxsgV6UnYf4OhskXXKWwwnZFKcqFh++aW9Aw73s1vZgoXKv/SVYEmrB48qJjZHZzVMg5BI6So8gs7JomwH7rNR9le1Xs3OVP5vML6jDVuCjd61/qyG++A3P+GviOCLny3qiytsVFBA9LfN+P9OoB7tW6FbRTlTRUNB0oKR+Hlg1wRKP+USuRUWzXQxZt0Ie0SmpDcnfAduUPurcODbrkqF5e4ic0mfXFhqPB6o9hUs0onjnc2P0W374rPUcWRxJJa5wT/6XFqYV5OSob6KSA9qBx/tefdvEfnrGFqtAQhPNv5N/uAwRxDMI4NDSWBAgMBAAECggEAHqkjFD0YI4dAwth6LRjsFpkhUUqnJkew+7EkBEHzQMbuQPpqyauaIUv81DhAqIDaaAlt/S84kccPkRIZXjGATpKEt0pE+x7erAd09lFDUMvOdEeBi79GDqAJ2bk8RKAqgHRj0i9jqq+AYIjYcOiB2j6A9cFogKqP/R9JZHkrhmPd34YxkvMvVy5GXsRXeWcruvyu+O1ai5GPUZw1FEPPEBP2ejvD6xX+8LQ6LKuoaTTByrdQpAk66/ykH8+p7aolCbLggFQvUDfqxTXShXZk0Z7mfhJsJnILcj0+k68L3xB19rhJL3NzIuA/8X2Ipo7u1eA6X17hKBhtUUnnmTP7QQKBgQDysl+WGj02pvylAeKKJlFsTXIC5IYbd91uUCmVTVDjGhcyfKKAIfJYxOp9V5dCMz/zG+m+V4EZdDTLNJrnkemGgB5QSN5+5MbRqch3LvX92WoTXs3YBWrxy+kfIZQCdvbIR4kIKXNVpNSqy1EdBlTAwCMJLKh0v/JZC54rGD3ZOQKBgQC4lPc0tkFzlOPD6XbJFMtLp+Mcogz0XW8c/kvrGR3sRs1AnKbYdn9nfR7hUqCXXWYyNuhUO4QwOZKM+VDJz2w1bnpluQpEmUYXgsIok4Tn7zPbuknzG05pw8YwqbkL96FBN7oAWGLW7LIihdcbMOerm3FBGHcrdeMsrFeIipEWiQKBgC87/hSFqNJBL7yhoEiI6qHsdLsRZPRloMf+fAld0ddRVaBy12Geub8DHCwm5v5wYQrcrOJpv2uHzVqbM2bMZCnUN5IijIMf3X4i0Cw6DJBKRzXb5q4bZ9QFfqqba2YLZz5Vhdr7zkGl4eoXxgKjH82f13HKqkKGtREVjMQQZMEpAoGATlhkSQpm45E5z8kDczwRQg6Dln6t8vbJl8vUG3iwu74dlqQnKU+6qglwlwEEStsI6p1lpYMRi4qUSqP0B4S0EEXRS+Xrlsxb9NS6ZpCe4/ci0svSYY6gjMHdGIChm5PC7TSjDUx2v3T98ytN7yul2bADtTaWNms2Ppr0GG+AP8kCgYEA3/y+q801/glLvib8+HR36OUs+9l+E/oyyTjVqB1A/d/LRgE5gGqRw6G1Jy2ZxxJ7zcG0TBvjv65B1Iwt45uNb8Uhw6r6PTHlZUE+F8/Hjzmh3Nk5YVoTQj4PqiSLaxhPao0Dkyrmoxmx9DN097A2AMk1FAvbLE+y9dsu78hH3XI=
+
+eureka:
+  client:
+    service-url.defaultZone: http://eureka:eureka_xyplat@172.31.110.205:8080/eureka
+    registry-fetch-interval-seconds: 5 # 默认为30秒
+    enabled: true  
+    registerWithEureka: true
+    fetchRegistry: true  
+    healthcheck.enabled: true
+    
+  instance:
+    lease-renewal-interval-in-seconds: 5
+    lease-expiration-duration-in-seconds: 5
+    prefer-ip-address: true    
+    instance-id: ${spring.cloud.client.ipAddress}:${server.port}  
+    
+    
+---
+#平安宴
+spring:
+  profiles: prodpay
+  datasource:
+      driver-class-name: com.mysql.jdbc.Driver
+      username: root
+      password: xymysqlroot_2019
+      url: jdbc:mysql://172.17.0.4:3316/xyplatdb?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&rewriteBatchedStatements=true&autoReconnect=true
+      type: com.alibaba.druid.pool.DruidDataSource 
+      
+      initialSize: 5  
+      minIdle: 5  
+      maxActive: 20  
+      maxWait: 60000  
+      timeBetweenEvictionRunsMillis: 60000  
+      minEvictableIdleTimeMillis: 300000  
+      validationQuery: SELECT NOW()  
+      testWhileIdle: true  
+      testOnBorrow: true  
+      testOnReturn: false  
+      poolPreparedStatements: true  
+      maxPoolPreparedStatementPerConnectionSize: 20  
+      filters: stat,log4j  
+      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000  
+
+  #jpa
+  jpa: 
+      show-sql: true
+      open-in-view: true  
+      
+  zipkin:
+    enabled: false
+    baseUrl: http://115.28.187.223:8088/
+
+  sleuth:
+     sampler:
+       #  采样率
+       percentage: 0.1
+            
+#redis
+  redis:
+    database: 0
+    host: 172.17.0.10
+    password:  XY#123456@mm
+    port: 6389
+    pool:
+      min-idle: 1
+      max-idel: 8
+      max-active: 100
+      max-wait: 1    
+    timeout: 3000 
+    
+logging:
+    level:
+      root: WARN
+      com.xynet: DEBUG
+    file: logs/service-pay-third.log
+    
+#server 
+server:
+  port: 80
+
+app:
+    fileHome: file/
+    tempFileHome: tmp/
+    xxwAppId: 202310201164921719597563904
+    xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu/W4vOOFFTEYMpVqSASQgqlKsxsgV6UnYf4OhskXXKWwwnZFKcqFh++aW9Aw73s1vZgoXKv/SVYEmrB48qJjZHZzVMg5BI6So8gs7JomwH7rNR9le1Xs3OVP5vML6jDVuCjd61/qyG++A3P+GviOCLny3qiytsVFBA9LfN+P9OoB7tW6FbRTlTRUNB0oKR+Hlg1wRKP+USuRUWzXQxZt0Ie0SmpDcnfAduUPurcODbrkqF5e4ic0mfXFhqPB6o9hUs0onjnc2P0W374rPUcWRxJJa5wT/6XFqYV5OSob6KSA9qBx/tefdvEfnrGFqtAQhPNv5N/uAwRxDMI4NDSWBAgMBAAECggEAHqkjFD0YI4dAwth6LRjsFpkhUUqnJkew+7EkBEHzQMbuQPpqyauaIUv81DhAqIDaaAlt/S84kccPkRIZXjGATpKEt0pE+x7erAd09lFDUMvOdEeBi79GDqAJ2bk8RKAqgHRj0i9jqq+AYIjYcOiB2j6A9cFogKqP/R9JZHkrhmPd34YxkvMvVy5GXsRXeWcruvyu+O1ai5GPUZw1FEPPEBP2ejvD6xX+8LQ6LKuoaTTByrdQpAk66/ykH8+p7aolCbLggFQvUDfqxTXShXZk0Z7mfhJsJnILcj0+k68L3xB19rhJL3NzIuA/8X2Ipo7u1eA6X17hKBhtUUnnmTP7QQKBgQDysl+WGj02pvylAeKKJlFsTXIC5IYbd91uUCmVTVDjGhcyfKKAIfJYxOp9V5dCMz/zG+m+V4EZdDTLNJrnkemGgB5QSN5+5MbRqch3LvX92WoTXs3YBWrxy+kfIZQCdvbIR4kIKXNVpNSqy1EdBlTAwCMJLKh0v/JZC54rGD3ZOQKBgQC4lPc0tkFzlOPD6XbJFMtLp+Mcogz0XW8c/kvrGR3sRs1AnKbYdn9nfR7hUqCXXWYyNuhUO4QwOZKM+VDJz2w1bnpluQpEmUYXgsIok4Tn7zPbuknzG05pw8YwqbkL96FBN7oAWGLW7LIihdcbMOerm3FBGHcrdeMsrFeIipEWiQKBgC87/hSFqNJBL7yhoEiI6qHsdLsRZPRloMf+fAld0ddRVaBy12Geub8DHCwm5v5wYQrcrOJpv2uHzVqbM2bMZCnUN5IijIMf3X4i0Cw6DJBKRzXb5q4bZ9QFfqqba2YLZz5Vhdr7zkGl4eoXxgKjH82f13HKqkKGtREVjMQQZMEpAoGATlhkSQpm45E5z8kDczwRQg6Dln6t8vbJl8vUG3iwu74dlqQnKU+6qglwlwEEStsI6p1lpYMRi4qUSqP0B4S0EEXRS+Xrlsxb9NS6ZpCe4/ci0svSYY6gjMHdGIChm5PC7TSjDUx2v3T98ytN7yul2bADtTaWNms2Ppr0GG+AP8kCgYEA3/y+q801/glLvib8+HR36OUs+9l+E/oyyTjVqB1A/d/LRgE5gGqRw6G1Jy2ZxxJ7zcG0TBvjv65B1Iwt45uNb8Uhw6r6PTHlZUE+F8/Hjzmh3Nk5YVoTQj4PqiSLaxhPao0Dkyrmoxmx9DN097A2AMk1FAvbLE+y9dsu78hH3XI=
+
+eureka:
+  client:
+    service-url.defaultZone: http://eureka:eureka_xyplat@172.17.0.10:8082/eureka
+    registry-fetch-interval-seconds: 5 # 默认为30秒
+    enabled: true  
+    registerWithEureka: true
+    fetchRegistry: true  
+    healthcheck.enabled: true
+    
+  instance:
+    lease-renewal-interval-in-seconds: 5
+    lease-expiration-duration-in-seconds: 5
+    prefer-ip-address: true    
+    instance-id: ${spring.cloud.client.ipAddress}:${server.port}  
+    
+    
+---
+#汉朔
+spring:
+  profiles: prodhans
+  datasource:
+      driver-class-name: com.mysql.jdbc.Driver
+      username: xingyuan
+      password: 123456
+      url: jdbc:mysql://40.73.27.69:53306/xyplatdb?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&rewriteBatchedStatements=true&autoReconnect=true
+      type: com.alibaba.druid.pool.DruidDataSource 
+      
+      initialSize: 5  
+      minIdle: 5  
+      maxActive: 20  
+      maxWait: 60000  
+      timeBetweenEvictionRunsMillis: 60000  
+      minEvictableIdleTimeMillis: 300000  
+      validationQuery: SELECT NOW()  
+      testWhileIdle: true  
+      testOnBorrow: true  
+      testOnReturn: false  
+      poolPreparedStatements: true  
+      maxPoolPreparedStatementPerConnectionSize: 20  
+      filters: stat,log4j  
+      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000  
+
+  #jpa
+  jpa: 
+      show-sql: true
+      open-in-view: true  
+      
+  zipkin:
+    enabled: false
+    baseUrl: http://115.28.187.223:8088/
+
+  sleuth:
+     sampler:
+       #  采样率
+       percentage: 0.1
+            
+#redis
+  redis:
+    database: 0
+    host: 10.1.0.24
+    password:  123456
+    port: 6379
+    pool:
+      min-idle: 1
+      max-idel: 8
+      max-active: 100
+      max-wait: 1    
+    timeout: 3000 
+    
+logging:
+    level:
+      root: WARN
+      com.xynet: DEBUG
+    file: logs/service-pay-third.log
+    
+#server 
+server:
+  port: 80
+
+app:
+    fileHome: file/
+    tempFileHome: tmp/
+    xxwAppId: 202310201164921719597563904
+    xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu/W4vOOFFTEYMpVqSASQgqlKsxsgV6UnYf4OhskXXKWwwnZFKcqFh++aW9Aw73s1vZgoXKv/SVYEmrB48qJjZHZzVMg5BI6So8gs7JomwH7rNR9le1Xs3OVP5vML6jDVuCjd61/qyG++A3P+GviOCLny3qiytsVFBA9LfN+P9OoB7tW6FbRTlTRUNB0oKR+Hlg1wRKP+USuRUWzXQxZt0Ie0SmpDcnfAduUPurcODbrkqF5e4ic0mfXFhqPB6o9hUs0onjnc2P0W374rPUcWRxJJa5wT/6XFqYV5OSob6KSA9qBx/tefdvEfnrGFqtAQhPNv5N/uAwRxDMI4NDSWBAgMBAAECggEAHqkjFD0YI4dAwth6LRjsFpkhUUqnJkew+7EkBEHzQMbuQPpqyauaIUv81DhAqIDaaAlt/S84kccPkRIZXjGATpKEt0pE+x7erAd09lFDUMvOdEeBi79GDqAJ2bk8RKAqgHRj0i9jqq+AYIjYcOiB2j6A9cFogKqP/R9JZHkrhmPd34YxkvMvVy5GXsRXeWcruvyu+O1ai5GPUZw1FEPPEBP2ejvD6xX+8LQ6LKuoaTTByrdQpAk66/ykH8+p7aolCbLggFQvUDfqxTXShXZk0Z7mfhJsJnILcj0+k68L3xB19rhJL3NzIuA/8X2Ipo7u1eA6X17hKBhtUUnnmTP7QQKBgQDysl+WGj02pvylAeKKJlFsTXIC5IYbd91uUCmVTVDjGhcyfKKAIfJYxOp9V5dCMz/zG+m+V4EZdDTLNJrnkemGgB5QSN5+5MbRqch3LvX92WoTXs3YBWrxy+kfIZQCdvbIR4kIKXNVpNSqy1EdBlTAwCMJLKh0v/JZC54rGD3ZOQKBgQC4lPc0tkFzlOPD6XbJFMtLp+Mcogz0XW8c/kvrGR3sRs1AnKbYdn9nfR7hUqCXXWYyNuhUO4QwOZKM+VDJz2w1bnpluQpEmUYXgsIok4Tn7zPbuknzG05pw8YwqbkL96FBN7oAWGLW7LIihdcbMOerm3FBGHcrdeMsrFeIipEWiQKBgC87/hSFqNJBL7yhoEiI6qHsdLsRZPRloMf+fAld0ddRVaBy12Geub8DHCwm5v5wYQrcrOJpv2uHzVqbM2bMZCnUN5IijIMf3X4i0Cw6DJBKRzXb5q4bZ9QFfqqba2YLZz5Vhdr7zkGl4eoXxgKjH82f13HKqkKGtREVjMQQZMEpAoGATlhkSQpm45E5z8kDczwRQg6Dln6t8vbJl8vUG3iwu74dlqQnKU+6qglwlwEEStsI6p1lpYMRi4qUSqP0B4S0EEXRS+Xrlsxb9NS6ZpCe4/ci0svSYY6gjMHdGIChm5PC7TSjDUx2v3T98ytN7yul2bADtTaWNms2Ppr0GG+AP8kCgYEA3/y+q801/glLvib8+HR36OUs+9l+E/oyyTjVqB1A/d/LRgE5gGqRw6G1Jy2ZxxJ7zcG0TBvjv65B1Iwt45uNb8Uhw6r6PTHlZUE+F8/Hjzmh3Nk5YVoTQj4PqiSLaxhPao0Dkyrmoxmx9DN097A2AMk1FAvbLE+y9dsu78hH3XI=
+
+eureka:
+  client:
+    service-url.defaultZone: http://eureka:eureka_xyplat@40.73.27.69:8080/eureka
+    registry-fetch-interval-seconds: 5 # 默认为30秒
+    enabled: true  
+    registerWithEureka: true
+    fetchRegistry: true  
+    healthcheck.enabled: true
+    
+  instance:
+    lease-renewal-interval-in-seconds: 5
+    lease-expiration-duration-in-seconds: 5
+    prefer-ip-address: true    
+    instance-id: ${spring.cloud.client.ipAddress}:${server.port} 
+    
+---
+#腾源
+spring:
+  profiles: prodty
+  datasource:
+      driver-class-name: com.mysql.jdbc.Driver
+      username: root
+      password: xymysqlroot_2019
+      url: jdbc:mysql://172.19.190.64:3316/xyplatdb?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&rewriteBatchedStatements=true&autoReconnect=true
+      type: com.alibaba.druid.pool.DruidDataSource 
+      
+      initialSize: 5  
+      minIdle: 5  
+      maxActive: 20  
+      maxWait: 60000  
+      timeBetweenEvictionRunsMillis: 60000  
+      minEvictableIdleTimeMillis: 300000  
+      validationQuery: SELECT NOW()  
+      testWhileIdle: true  
+      testOnBorrow: true  
+      testOnReturn: false  
+      poolPreparedStatements: true  
+      maxPoolPreparedStatementPerConnectionSize: 20  
+      filters: stat,log4j  
+      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000  
+
+  #jpa
+  jpa: 
+      show-sql: true
+      open-in-view: true  
+      
+  zipkin:
+    enabled: false
+    baseUrl: http://115.28.187.223:8088/
+
+  sleuth:
+     sampler:
+       #  采样率
+       percentage: 0.1
+            
+#redis
+  redis:
+    database: 0
+    host: 101.133.146.122
+    password:  XY#123456@mm
+    port: 6389
+    pool:
+      min-idle: 1
+      max-idel: 8
+      max-active: 100
+      max-wait: 1    
+    timeout: 3000 
+    
+logging:
+    level:
+      root: INFO
+      com.xynet: INFO
+    file: logs/service-pay-third.log
+    
+#server 
+server:
+  port: 80
+
+app:
+    fileHome: file/
+    tempFileHome: tmp/
+    xxwAppId: 202310201164921719597563904
+    xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu/W4vOOFFTEYMpVqSASQgqlKsxsgV6UnYf4OhskXXKWwwnZFKcqFh++aW9Aw73s1vZgoXKv/SVYEmrB48qJjZHZzVMg5BI6So8gs7JomwH7rNR9le1Xs3OVP5vML6jDVuCjd61/qyG++A3P+GviOCLny3qiytsVFBA9LfN+P9OoB7tW6FbRTlTRUNB0oKR+Hlg1wRKP+USuRUWzXQxZt0Ie0SmpDcnfAduUPurcODbrkqF5e4ic0mfXFhqPB6o9hUs0onjnc2P0W374rPUcWRxJJa5wT/6XFqYV5OSob6KSA9qBx/tefdvEfnrGFqtAQhPNv5N/uAwRxDMI4NDSWBAgMBAAECggEAHqkjFD0YI4dAwth6LRjsFpkhUUqnJkew+7EkBEHzQMbuQPpqyauaIUv81DhAqIDaaAlt/S84kccPkRIZXjGATpKEt0pE+x7erAd09lFDUMvOdEeBi79GDqAJ2bk8RKAqgHRj0i9jqq+AYIjYcOiB2j6A9cFogKqP/R9JZHkrhmPd34YxkvMvVy5GXsRXeWcruvyu+O1ai5GPUZw1FEPPEBP2ejvD6xX+8LQ6LKuoaTTByrdQpAk66/ykH8+p7aolCbLggFQvUDfqxTXShXZk0Z7mfhJsJnILcj0+k68L3xB19rhJL3NzIuA/8X2Ipo7u1eA6X17hKBhtUUnnmTP7QQKBgQDysl+WGj02pvylAeKKJlFsTXIC5IYbd91uUCmVTVDjGhcyfKKAIfJYxOp9V5dCMz/zG+m+V4EZdDTLNJrnkemGgB5QSN5+5MbRqch3LvX92WoTXs3YBWrxy+kfIZQCdvbIR4kIKXNVpNSqy1EdBlTAwCMJLKh0v/JZC54rGD3ZOQKBgQC4lPc0tkFzlOPD6XbJFMtLp+Mcogz0XW8c/kvrGR3sRs1AnKbYdn9nfR7hUqCXXWYyNuhUO4QwOZKM+VDJz2w1bnpluQpEmUYXgsIok4Tn7zPbuknzG05pw8YwqbkL96FBN7oAWGLW7LIihdcbMOerm3FBGHcrdeMsrFeIipEWiQKBgC87/hSFqNJBL7yhoEiI6qHsdLsRZPRloMf+fAld0ddRVaBy12Geub8DHCwm5v5wYQrcrOJpv2uHzVqbM2bMZCnUN5IijIMf3X4i0Cw6DJBKRzXb5q4bZ9QFfqqba2YLZz5Vhdr7zkGl4eoXxgKjH82f13HKqkKGtREVjMQQZMEpAoGATlhkSQpm45E5z8kDczwRQg6Dln6t8vbJl8vUG3iwu74dlqQnKU+6qglwlwEEStsI6p1lpYMRi4qUSqP0B4S0EEXRS+Xrlsxb9NS6ZpCe4/ci0svSYY6gjMHdGIChm5PC7TSjDUx2v3T98ytN7yul2bADtTaWNms2Ppr0GG+AP8kCgYEA3/y+q801/glLvib8+HR36OUs+9l+E/oyyTjVqB1A/d/LRgE5gGqRw6G1Jy2ZxxJ7zcG0TBvjv65B1Iwt45uNb8Uhw6r6PTHlZUE+F8/Hjzmh3Nk5YVoTQj4PqiSLaxhPao0Dkyrmoxmx9DN097A2AMk1FAvbLE+y9dsu78hH3XI=
+
+eureka:
+  client:
+    service-url.defaultZone: http://eureka:eureka_xyplat@172.19.190.64:8080/eureka
+    registry-fetch-interval-seconds: 5 # 默认为30秒
+    enabled: true  
+    registerWithEureka: true
+    fetchRegistry: true  
+    healthcheck.enabled: true
+    
+  instance:
+    lease-renewal-interval-in-seconds: 5
+    lease-expiration-duration-in-seconds: 5
+    prefer-ip-address: true    
+    instance-id: ${spring.cloud.client.ipAddress}:${server.port} 
+notifyUrl: http://101.133.149.226:8090/service-pay-third/third/pay/api/notify
+
+
+---
+#领鲜时代
+spring:
+  profiles: prodlxsd
+  datasource:
+      driver-class-name: com.mysql.jdbc.Driver
+      username: xyalldb
+      password: lxsdxy%^&890
+      url: jdbc:mysql://pc-wz98bl099k0lx4tls.rwlb.rds.aliyuncs.com:3306/xyplatdb?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&rewriteBatchedStatements=true&autoReconnect=true
+      type: com.alibaba.druid.pool.DruidDataSource 
+      
+      initialSize: 5  
+      minIdle: 5  
+      maxActive: 20  
+      maxWait: 60000  
+      timeBetweenEvictionRunsMillis: 60000  
+      minEvictableIdleTimeMillis: 300000  
+      validationQuery: SELECT NOW()  
+      testWhileIdle: true  
+      testOnBorrow: true  
+      testOnReturn: false  
+      poolPreparedStatements: true  
+      maxPoolPreparedStatementPerConnectionSize: 20  
+      filters: stat,log4j  
+      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000  
+
+  #jpa
+  jpa: 
+      show-sql: true
+      open-in-view: true  
+      
+  zipkin:
+    enabled: false
+    baseUrl: http://115.28.187.223:8088/
+
+  sleuth:
+     sampler:
+       #  采样率
+       percentage: 0.1
+            
+#redis
+  redis:
+    database: 0
+    host: 127.0.0.1
+    password:  XY#123456@mm
+    port: 6389
+    pool:
+      min-idle: 1
+      max-idel: 8
+      max-active: 100
+      max-wait: 1    
+    timeout: 3000 
+    
+logging:
+    level:
+      root: WARN
+      com.xynet: DEBUG
+    file: logs/service-pay-third.log
+    
+#server 
+server:
+  port: 80
+
+app:
+    fileHome: file/
+    tempFileHome: tmp/
+    xxwAppId: 202310201164921719597563904
+    xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu/W4vOOFFTEYMpVqSASQgqlKsxsgV6UnYf4OhskXXKWwwnZFKcqFh++aW9Aw73s1vZgoXKv/SVYEmrB48qJjZHZzVMg5BI6So8gs7JomwH7rNR9le1Xs3OVP5vML6jDVuCjd61/qyG++A3P+GviOCLny3qiytsVFBA9LfN+P9OoB7tW6FbRTlTRUNB0oKR+Hlg1wRKP+USuRUWzXQxZt0Ie0SmpDcnfAduUPurcODbrkqF5e4ic0mfXFhqPB6o9hUs0onjnc2P0W374rPUcWRxJJa5wT/6XFqYV5OSob6KSA9qBx/tefdvEfnrGFqtAQhPNv5N/uAwRxDMI4NDSWBAgMBAAECggEAHqkjFD0YI4dAwth6LRjsFpkhUUqnJkew+7EkBEHzQMbuQPpqyauaIUv81DhAqIDaaAlt/S84kccPkRIZXjGATpKEt0pE+x7erAd09lFDUMvOdEeBi79GDqAJ2bk8RKAqgHRj0i9jqq+AYIjYcOiB2j6A9cFogKqP/R9JZHkrhmPd34YxkvMvVy5GXsRXeWcruvyu+O1ai5GPUZw1FEPPEBP2ejvD6xX+8LQ6LKuoaTTByrdQpAk66/ykH8+p7aolCbLggFQvUDfqxTXShXZk0Z7mfhJsJnILcj0+k68L3xB19rhJL3NzIuA/8X2Ipo7u1eA6X17hKBhtUUnnmTP7QQKBgQDysl+WGj02pvylAeKKJlFsTXIC5IYbd91uUCmVTVDjGhcyfKKAIfJYxOp9V5dCMz/zG+m+V4EZdDTLNJrnkemGgB5QSN5+5MbRqch3LvX92WoTXs3YBWrxy+kfIZQCdvbIR4kIKXNVpNSqy1EdBlTAwCMJLKh0v/JZC54rGD3ZOQKBgQC4lPc0tkFzlOPD6XbJFMtLp+Mcogz0XW8c/kvrGR3sRs1AnKbYdn9nfR7hUqCXXWYyNuhUO4QwOZKM+VDJz2w1bnpluQpEmUYXgsIok4Tn7zPbuknzG05pw8YwqbkL96FBN7oAWGLW7LIihdcbMOerm3FBGHcrdeMsrFeIipEWiQKBgC87/hSFqNJBL7yhoEiI6qHsdLsRZPRloMf+fAld0ddRVaBy12Geub8DHCwm5v5wYQrcrOJpv2uHzVqbM2bMZCnUN5IijIMf3X4i0Cw6DJBKRzXb5q4bZ9QFfqqba2YLZz5Vhdr7zkGl4eoXxgKjH82f13HKqkKGtREVjMQQZMEpAoGATlhkSQpm45E5z8kDczwRQg6Dln6t8vbJl8vUG3iwu74dlqQnKU+6qglwlwEEStsI6p1lpYMRi4qUSqP0B4S0EEXRS+Xrlsxb9NS6ZpCe4/ci0svSYY6gjMHdGIChm5PC7TSjDUx2v3T98ytN7yul2bADtTaWNms2Ppr0GG+AP8kCgYEA3/y+q801/glLvib8+HR36OUs+9l+E/oyyTjVqB1A/d/LRgE5gGqRw6G1Jy2ZxxJ7zcG0TBvjv65B1Iwt45uNb8Uhw6r6PTHlZUE+F8/Hjzmh3Nk5YVoTQj4PqiSLaxhPao0Dkyrmoxmx9DN097A2AMk1FAvbLE+y9dsu78hH3XI=
+
+eureka:
+  client:
+    service-url.defaultZone: http://eureka:eureka_xyplat@127.0.0.1:8080/eureka
+    registry-fetch-interval-seconds: 5 # 默认为30秒
+    enabled: true  
+    registerWithEureka: true
+    fetchRegistry: true  
+    healthcheck.enabled: true
+    
+  instance:
+    lease-renewal-interval-in-seconds: 5
+    lease-expiration-duration-in-seconds: 5
+    prefer-ip-address: true    
+    instance-id: ${spring.cloud.client.ipAddress}:${server.port} 
+    
+---
+#领鲜时代
+spring:
+  profiles: prodmlxy
+  datasource:
+      driver-class-name: com.mysql.jdbc.Driver
+      username: root
+      password: xymysqlroot_2019
+      url: jdbc:mysql://localhost:3316/xyplatdb?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&rewriteBatchedStatements=true&autoReconnect=true
+      type: com.alibaba.druid.pool.DruidDataSource 
+      
+      initialSize: 5  
+      minIdle: 5  
+      maxActive: 20  
+      maxWait: 60000  
+      timeBetweenEvictionRunsMillis: 60000  
+      minEvictableIdleTimeMillis: 300000  
+      validationQuery: SELECT NOW()  
+      testWhileIdle: true  
+      testOnBorrow: true  
+      testOnReturn: false  
+      poolPreparedStatements: true  
+      maxPoolPreparedStatementPerConnectionSize: 20  
+      filters: stat,log4j  
+      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000  
+
+  #jpa
+  jpa: 
+      show-sql: true
+      open-in-view: true  
+      
+  zipkin:
+    enabled: false
+    baseUrl: http://115.28.187.223:8088/
+
+  sleuth:
+     sampler:
+       #  采样率
+       percentage: 0.1
+            
+#redis
+  redis:
+    database: 0
+    host: localhost
+    password:  XY#123456@mm
+    port: 6389
+    pool:
+      min-idle: 1
+      max-idel: 8
+      max-active: 100
+      max-wait: 1    
+    timeout: 3000 
+    
+logging:
+    level:
+      root: WARN
+      com.xynet: DEBUG
+    file: logs/service-pay-third.log
+    
+#server 
+server:
+  port: 80
+
+app:
+    fileHome: file/
+    tempFileHome: tmp/
+    xxwAppId: 202310201164921719597563904
+    xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu/W4vOOFFTEYMpVqSASQgqlKsxsgV6UnYf4OhskXXKWwwnZFKcqFh++aW9Aw73s1vZgoXKv/SVYEmrB48qJjZHZzVMg5BI6So8gs7JomwH7rNR9le1Xs3OVP5vML6jDVuCjd61/qyG++A3P+GviOCLny3qiytsVFBA9LfN+P9OoB7tW6FbRTlTRUNB0oKR+Hlg1wRKP+USuRUWzXQxZt0Ie0SmpDcnfAduUPurcODbrkqF5e4ic0mfXFhqPB6o9hUs0onjnc2P0W374rPUcWRxJJa5wT/6XFqYV5OSob6KSA9qBx/tefdvEfnrGFqtAQhPNv5N/uAwRxDMI4NDSWBAgMBAAECggEAHqkjFD0YI4dAwth6LRjsFpkhUUqnJkew+7EkBEHzQMbuQPpqyauaIUv81DhAqIDaaAlt/S84kccPkRIZXjGATpKEt0pE+x7erAd09lFDUMvOdEeBi79GDqAJ2bk8RKAqgHRj0i9jqq+AYIjYcOiB2j6A9cFogKqP/R9JZHkrhmPd34YxkvMvVy5GXsRXeWcruvyu+O1ai5GPUZw1FEPPEBP2ejvD6xX+8LQ6LKuoaTTByrdQpAk66/ykH8+p7aolCbLggFQvUDfqxTXShXZk0Z7mfhJsJnILcj0+k68L3xB19rhJL3NzIuA/8X2Ipo7u1eA6X17hKBhtUUnnmTP7QQKBgQDysl+WGj02pvylAeKKJlFsTXIC5IYbd91uUCmVTVDjGhcyfKKAIfJYxOp9V5dCMz/zG+m+V4EZdDTLNJrnkemGgB5QSN5+5MbRqch3LvX92WoTXs3YBWrxy+kfIZQCdvbIR4kIKXNVpNSqy1EdBlTAwCMJLKh0v/JZC54rGD3ZOQKBgQC4lPc0tkFzlOPD6XbJFMtLp+Mcogz0XW8c/kvrGR3sRs1AnKbYdn9nfR7hUqCXXWYyNuhUO4QwOZKM+VDJz2w1bnpluQpEmUYXgsIok4Tn7zPbuknzG05pw8YwqbkL96FBN7oAWGLW7LIihdcbMOerm3FBGHcrdeMsrFeIipEWiQKBgC87/hSFqNJBL7yhoEiI6qHsdLsRZPRloMf+fAld0ddRVaBy12Geub8DHCwm5v5wYQrcrOJpv2uHzVqbM2bMZCnUN5IijIMf3X4i0Cw6DJBKRzXb5q4bZ9QFfqqba2YLZz5Vhdr7zkGl4eoXxgKjH82f13HKqkKGtREVjMQQZMEpAoGATlhkSQpm45E5z8kDczwRQg6Dln6t8vbJl8vUG3iwu74dlqQnKU+6qglwlwEEStsI6p1lpYMRi4qUSqP0B4S0EEXRS+Xrlsxb9NS6ZpCe4/ci0svSYY6gjMHdGIChm5PC7TSjDUx2v3T98ytN7yul2bADtTaWNms2Ppr0GG+AP8kCgYEA3/y+q801/glLvib8+HR36OUs+9l+E/oyyTjVqB1A/d/LRgE5gGqRw6G1Jy2ZxxJ7zcG0TBvjv65B1Iwt45uNb8Uhw6r6PTHlZUE+F8/Hjzmh3Nk5YVoTQj4PqiSLaxhPao0Dkyrmoxmx9DN097A2AMk1FAvbLE+y9dsu78hH3XI=
+
+eureka:
+  client:
+    service-url.defaultZone: http://eureka:eureka_xyplat@localhost:8080/eureka
+    registry-fetch-interval-seconds: 5 # 默认为30秒
+    enabled: true  
+    registerWithEureka: true
+    fetchRegistry: true  
+    healthcheck.enabled: true
+    
+  instance:
+    lease-renewal-interval-in-seconds: 5
+    lease-expiration-duration-in-seconds: 5
+    prefer-ip-address: true    
+    instance-id: ${spring.cloud.client.ipAddress}:${server.port} 
+    
+    
+---
+spring:
+  profiles: prodxxw
+  datasource:
+      driver-class-name: com.mysql.jdbc.Driver
+      username: smart
+      password: 5zAV6qk*KTQfY
+      url: jdbc:mysql://smartbox-db.newhopedairy.cn:3306/xyplatdb?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&rewriteBatchedStatements=true&autoReconnect=true
+      type: com.alibaba.druid.pool.DruidDataSource 
+      
+      initialSize: 5  
+      minIdle: 5  
+      maxActive: 20  
+      maxWait: 60000  
+      timeBetweenEvictionRunsMillis: 60000  
+      minEvictableIdleTimeMillis: 300000  
+      validationQuery: SELECT NOW()  
+      testWhileIdle: true  
+      testOnBorrow: true  
+      testOnReturn: false  
+      poolPreparedStatements: true  
+      maxPoolPreparedStatementPerConnectionSize: 20  
+      filters: stat,log4j  
+      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000  
+
+  #jpa
+  jpa: 
+      show-sql: true
+      open-in-view: true  
+      
+  zipkin:
+    enabled: false
+    baseUrl: http://115.28.187.223:8088/
+
+  sleuth:
+     sampler:
+       #  采样率
+       percentage: 0.1
+            
+#redis
+  redis:
+    database: 0
+    host: 10.6.176.75
+    password:  XY#123456@mm
+    port: 6389
+    pool:
+      min-idle: 1
+      max-idel: 8
+      max-active: 100
+      max-wait: 1    
+    timeout: 3000 
+    
+logging:
+    level:
+      root: INFO
+      com.xynet: INFO
+    file: logs/service-pay-third.log
+    
+#server 
+server:
+  port: 80
+
+app:
+    fileHome: file/
+    tempFileHome: tmp/
+    xxwAppId: 202310251166805156763795456
+    xxwSK: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCD7cA4aQIFICW5NJ1Zoy6z0OzK7W84Oai620GvZjQe0BDcr9ptOuE6wzdolHNHMIP3ULt4PM8E9ZFQUMbd/LdA2cF06dVYFNshtlKjBIt/oQAypSWT7Ryr5MjgUr0x7qPwMYbG8BnMbH7o6GB/aTvIU2eFb8fKZhpNaArC4rlaJAZ2MOmstvK8wkRsebU/5WjFKyV3DMntpqOxmzO1ozfSXFXdVM49OljTVT2atcQ3KwmL8+sP4ugL1SNG4Oj1oxfEYCIO4vWQ2B21VvDqBIe96HgtzHsjBhAhgf5iQdDIiWP5R0dAdmzcDfSdWCOpghvSKx8zWk+35RV0SFc4bm8dAgMBAAECggEAGCT42toM7pc1kDGa4n7E20/PJkxR4H5c7OWXndwcic8WZu0gEoGGGtUDXPZeKpcsb6SsypKGaKfwkjxWSOYpO4sepqDs1JPsjrzpXsBEL3Vtrdcfi3UHnEXgpX0+9tZv1lOaEOp8Ljdk+occsfS2ZjEtbvRIIjiRc70oywXnWiGd97+esXaYoaf4utgh8j6NQyshe3fyz1G9+w9TlGObaXe/t+nx3284YXT7oM9uHt2T/Kb9qVijmFXr2T7CvGtXIxKHqnqfjPc7bcrlGlPPMCbL35t4ARfeZy0us8wYiJPcuHsswzXoF8RhD9YlG2iyQagDBS5JLFHdTTJLVAmOAQKBgQDO4yOrrLA338eyNKwAAkHe234I3lZ5KIVlOHAs8FTotlkxbrF2XnproHdCwRszsDrDKlt/Pkk4m/Et1BlwMIlZ3oVlXt3VDmTfqhteYlvzCMfamxRbBlP9a5dRRJxw/NZUToy26t7+73GnFpLVtAo3PWKdVGDvz9yz8kZMdUpFQQKBgQCjP0OTGMztqBNSbLfgpXz1k/NG4zcDkCRq+tOLiVi6qQdX1fNCfyXelb8CBqjjSvfl29U+sLlh5RRSA4VvDfekvu4aBlQ6LICjUhaABRlfefZPqKzHWgp9nyw/Yv85tCCSKCX7pM5iPBXnPcqI9pUZQCt8gnD6mET2mCvzUckm3QKBgDO8n5396G+AmcrZ2y2BYwGdOC51k4Bm/rzqWTsTutgbScDP4rcsN0cU8N4Ttn69kmReAlWWuO7cKHsCcH4a1S5RNGC+UZFHMTixrHh09nOXfYsQfw2oTnawYj3jf4/N2rdokU3o/G0aafyT65JfnLJlunSHtloiTBn/+06BglpBAoGBAIMue2bhLwxrW9uIcdqcIWZWldAJFlROqHUvSn9+x0Z4PeZfjzOIaS4Mt4kxQNYlkD+uABZ4fQAlzcZ5/efYGYDRzRQssdJtoJGdjWcisdj/cOdibDVmLbf1COGG9AGytdm9WYh2T0Kxdgh0pySYwgeggVF0oMU/R2vBrM/CkRohAoGBALErrUx6hW3vOY1O61FyxFPKHLql3emFo7WTm0YS6jjpGvyzSVMKM90kMbo+EjNiWTcCzm319yne7z7utp8eWb9jhIPULirht11nGreLo0pLRFqNN7DivKMyTWurhi9XtcCiYlTRYFTKxTGUtsx4nbuaiJqRLAnmTO6WCiGS20Ke
+
+eureka:
+  client:
+    service-url.defaultZone: http://eureka:eureka_xyplat@10.6.176.75:8081/eureka
+    registry-fetch-interval-seconds: 5 # 默认为30秒
+    enabled: true  
+    registerWithEureka: true
+    fetchRegistry: true  
+    healthcheck.enabled: true
+    
+  instance:
+    lease-renewal-interval-in-seconds: 5
+    lease-expiration-duration-in-seconds: 5
+    prefer-ip-address: true    
+    instance-id: ${spring.cloud.client.ipAddress}:${server.port}  
+
+zhong:
+  notifyUrl: ame/service-pay-third/third/pay/api/notifyBOC
+  prvateKey: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQChSlsRd+721kGVqGRAcTfuL4juQPb0iobS+iXlF/hzlS7qOQ3xYDtY2n23t9nBv8E0sSdIDrMhlJIS/yELPVSGAJIC21KItWXIobZ5pwUhRi89SQ1I6iiPzlLAHoKz1DGUX5G3ULThf9ONTSGQErMMXwI98unM7v8WqKR5+HPZL+yghVqCV8BGHoJtq1hsS01lmdwGmY/9+YiMPt4rdaAq4OeKtT8DfBuNiGLA8TnwN3sevKz2c5FShvbISjwNNUPRYmqb8rMSBbv4rAX4z9Kki1mFm+4MuxtWrcg+/dMRJHm17OlOp8GdzNo33Api7BH1IgnjmG3z7haQx/DzoOstAgMBAAECggEAaV4oDEtro3npMpnllGvifAo1zGBIdQ0icyXUJ8v3FZs6IO3Q/AVAABYM1z6WVYqt73xkCyD/SUrD+wENV0hjtX8d5Bvf2UuYCPAMQ4EnSsuNBN56fU3r3baOPNAx1sUi9qlQio+A+2gEjmT7LiHpMoXG8y2EK8tefjEB8mSrWhB027UXeA+zZhnsmeY5s0Q7mOU8gzKaNjQLVVNr5DZvzJ2znpFCBQIRZ9gjrXzVLzNSdIoOTxbZcEaMOt4/NYTdGN1r/8fBbWlMZ87IMIHwJusifzXwA8u8EUoO1NGV8N8s+ioQLrDqghLu7Zop1HDNqGP8Bw1ZI+Bb8dKtP+dsSQKBgQD0dUZkk0Ro6bylkKh2uGLyndwZahVBv6qJg0igPVnG+srAA/hXQTcmtdo+a0HzE32a9KPCqT33pxxRS8uv1mv/387VgFYlBNRG0swnTNR+Ct0d2r9EdEEP+EjC9raN+Ld16ci5iQwwQ2rJshnu6Cbu4Y1UaWfvmKMjvb1bUA9vEwKBgQCo59jTiKRqYFtLEFhUOOy58Ny8nhOlbfNV5RTNE/fUJZ0bYvnkJU+SwfpYfSU1pDfZx4G3XNUdQadkxO/zn1EZxFVnax1OmodeuxBvIyAluqGPcrOHd5FgbMSqZyQts5JHcJdb2/CihRQ4JoM4S+NeN5QoAvcBxoR7oYEyTnREvwKBgBujzuu8QvXhx7SooIOb4YQxGRu+hNzEQRH/SAzmIup+nMINMN0cwJGd6ik4k2Jah88nbgSqghkoSelfOo6NHfT2Zzp4okTZQO8pEnA3HaeKrumbPBkPU/PsTL3Oi2GOB6BLaKihuEEUvlRD0O7UTOKhmgs7R8ctaPS3lVtnt/cFAoGAe829A4gjo4lPQV0QsWMsOTqQQXzIv7gw5WPNdGhPfmO3nYxVyGGEyvh97ICGVqQw/+MZdHKKDzDBZr5ndzXutylOxEgiKixgTxJkgGHJvX3n0AJuDzyYBYqUOKbzQMBf1xdzCjTTU/yhjmrEQe52EOhCI3XQ4a9GCmyeC2awGHcCgYB441H4Ys+kNP9Zi1nWJCz+vOtWf6gMY6le7kZtPhpyAgANrGmLv/djlAPfrpgZO9EsufnE1YtcVv8f+JNG+o/lPsyYT/5B3K9OFlV80P6x01V8lF1V3PX48TPk1d56bhi4SGwchNVf7u12cj2FOrgRks+e9o5WmGLWdtQgs3bkYQ==
+  merchantId: 138620080012800
+  trmNo: 97027311
+  publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjBSmvi3Xmvrne2heayLd0yPPz1J7JlMCiTg8qVU0vyFAytglP0V3SHGjwwMUI0MAXDENf0FoFlVmltvVtiXqQG4zZUNec2kgM2/uA0dfLr5yyuqTO/IR1B0BrJ3COguMYIM48GE+DIiiCfRYgjSQxCMD8zZriX7p1up2cJRJqGsOxgoiv6HekmQUGfyb4ZoSHAaksniDR1nZ/CEJrhp03S8pLN8OmM2Y5PSZgMx5e4HgTkqDrnijZzVEnPCjXcWlR6+vFuFVqahyr4qAXFuS4wj0/GSXONos5Ihm/Cuj2SaJpyPChSaWfrGQPuxUj/CamjR9KnwqEfwmC6i2qYI95wIDAQAB
+
+
+
+---
+spring:
+  profiles: prodxxwtest
+  datasource:
+      driver-class-name: com.mysql.jdbc.Driver
+      username: root
+      password: xPhfnzGmQ#5g*K
+      url: jdbc:mysql://smartbox-xy-test-db.newhopedairy.cn:3306/xyplatdb?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&rewriteBatchedStatements=true&autoReconnect=true
+      type: com.alibaba.druid.pool.DruidDataSource 
+      
+      initialSize: 5  
+      minIdle: 5  
+      maxActive: 20  
+      maxWait: 60000  
+      timeBetweenEvictionRunsMillis: 60000  
+      minEvictableIdleTimeMillis: 300000  
+      validationQuery: SELECT NOW()  
+      testWhileIdle: true  
+      testOnBorrow: true  
+      testOnReturn: false  
+      poolPreparedStatements: true  
+      maxPoolPreparedStatementPerConnectionSize: 20  
+      filters: stat,log4j  
+      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000  
+
+  #jpa
+  jpa: 
+      show-sql: true
+      open-in-view: true  
+      
+  zipkin:
+    enabled: false
+    baseUrl: http://115.28.187.223:8088/
+
+  sleuth:
+     sampler:
+       #  采样率
+       percentage: 0.1
+            
+#redis
+  redis:
+    database: 0
+    host: 10.6.189.14
+    password:  XY#123456@mm
+    port: 6389
+    pool:
+      min-idle: 1
+      max-idel: 8
+      max-active: 100
+      max-wait: 1    
+    timeout: 3000 
+    
+logging:
+    level:
+      root: INFO
+      com.xynet: INFO
+    file: logs/service-pay-third.log
+    
+#server 
+server:
+  port: 80
+
+app:
+    fileHome: file/
+    tempFileHome: tmp/
+    #xxwAppId: 202309221154775238081249280
+    #xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCRm1lNYsBDYGs/4HOgGbyOCwhElfBj5tNOqAjm/emKt1dlq9Ty9oGaiyo+nMoUAGuJIx73hWU1ksIoIKXWzrCgvCb3EpxSTfs2SzdeBhtA7YAoaeYNCppeHigBxy0Vm2JktrvlO/HEs2jNz+Ak/4Je2iNVA0OvzYYf8OopIKkzVy1zA1gQXUf50H4QL9bxc1I2rQncHbzas6UlJNkIXbOJaF3hxMWyMlrgWg8SPxmsw2ytgwk53LpwxjFHXcJ0IyFkfu/RnfTKK8wD+pZ3GUxj2r7YonmjUf7//5VhZi1sfTMcoxK8dS6E96IeftO71ljoz9e2IOGaQ0gM6droxo9XAgMBAAECggEAFNTE0e1u1DTXIyxZXm5QK4IojKdm3OQJFxezLljlMJNKTaFntdrOb+24/Xww7OuidtwvcfoDoMZ+QH9rOnAXlOdWK8Ld2miNqBbatPjqrT9NNnrwDq2VqCFoV9jG+nBgg0ghWYpZ7Go+dDNpPeHQJQHQTDlLVbtxlOBCn9+sVUvKug3LYWB+k8wTkkfL8UbIZ6G+Khqam/jh7IVNan77jY6ORAae2ofivALnGtlD0RKokDs6sZtxniqMhzRZQ8M9bP9oEbuoI1C138CDWr/OaSetuGA4O+7YPaekKSQ1Vy5GdxZuC/u2eZ6rC0g4JXRx+WPdgao/Mp76r7+jIUP7AQKBgQD1qzPARTfJuUDwVPRC2OFwfJRufqye+e2UxPLloW8gJhsXrME848CRwtkqqzzwzdI0LG4HCLRyYISuzo3WkPEZL85SYSlBeMMShxF7a6ggqP1cGW03OQuNXCZwRvvRNHZvuQopIJffvv3+sCTIGRAG8wbHfD1lLW7p4y/F5ZcXvQKBgQCXuujITsEEQEUWE5rczcrYmJ4guIGWtW3gLHLFiYrOdV+8hpK+8hU+9gg71fX2yVv9Aymt9uMrZ7uJ2cVsiiviMUgRLRPihua56YOrVn7mdhyK78F5kIaMYlKK3sYkbTmA1wNdv2uoLx41EhXNOnVMVwu29KctAIm8/xHP9sJaowKBgQCdrdT5g3PbNdxIZT6h6TJJUKy0fvms0B19byu313XL3Klm+KrOuh/PbpCUonPq2zAf7KRyP1QSVYDT8h93qHAXCmgS1+ny69/I9Ihz/xVaYRy9EFTZLPQNNyg0yFq4XEPoUYwD+beBFMVRwxzYkb2HuFSRlVySpCacWAVBr6rawQKBgF8N8EF03QTtwpo3BACqSBbzXbUAAedJmCEll21bYoM/ExAHeq12+YptFfFudF37/c3/CkB6+Aw8O0f8DuuVkDJvT0e7Zsa2Xps/yIYxdOSqP+1mkF25BiGygyWOtLEjYC/wA6LahfZiNllnEBN3OP7vVV5z3Lubp66oWR9g5pdjAoGACrcCIRTOFtGYrGlqvYpad6+RDGUEXx4X7NKJA8IC+FQgA9dquDpoqhvbAzxjn7rG62b35KQSUQME/sXMtCwbFv/9zKTrLjNXhRnJWT3aUUiUhbmQfk9CWHLTxeOlW/ecdzbklQD7i4HjPKrmI3XfhgqOagtuKGj9SaCFqRF/jPU=
+    xxwAppId: 202310201164921719597563904
+    xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu/W4vOOFFTEYMpVqSASQgqlKsxsgV6UnYf4OhskXXKWwwnZFKcqFh++aW9Aw73s1vZgoXKv/SVYEmrB48qJjZHZzVMg5BI6So8gs7JomwH7rNR9le1Xs3OVP5vML6jDVuCjd61/qyG++A3P+GviOCLny3qiytsVFBA9LfN+P9OoB7tW6FbRTlTRUNB0oKR+Hlg1wRKP+USuRUWzXQxZt0Ie0SmpDcnfAduUPurcODbrkqF5e4ic0mfXFhqPB6o9hUs0onjnc2P0W374rPUcWRxJJa5wT/6XFqYV5OSob6KSA9qBx/tefdvEfnrGFqtAQhPNv5N/uAwRxDMI4NDSWBAgMBAAECggEAHqkjFD0YI4dAwth6LRjsFpkhUUqnJkew+7EkBEHzQMbuQPpqyauaIUv81DhAqIDaaAlt/S84kccPkRIZXjGATpKEt0pE+x7erAd09lFDUMvOdEeBi79GDqAJ2bk8RKAqgHRj0i9jqq+AYIjYcOiB2j6A9cFogKqP/R9JZHkrhmPd34YxkvMvVy5GXsRXeWcruvyu+O1ai5GPUZw1FEPPEBP2ejvD6xX+8LQ6LKuoaTTByrdQpAk66/ykH8+p7aolCbLggFQvUDfqxTXShXZk0Z7mfhJsJnILcj0+k68L3xB19rhJL3NzIuA/8X2Ipo7u1eA6X17hKBhtUUnnmTP7QQKBgQDysl+WGj02pvylAeKKJlFsTXIC5IYbd91uUCmVTVDjGhcyfKKAIfJYxOp9V5dCMz/zG+m+V4EZdDTLNJrnkemGgB5QSN5+5MbRqch3LvX92WoTXs3YBWrxy+kfIZQCdvbIR4kIKXNVpNSqy1EdBlTAwCMJLKh0v/JZC54rGD3ZOQKBgQC4lPc0tkFzlOPD6XbJFMtLp+Mcogz0XW8c/kvrGR3sRs1AnKbYdn9nfR7hUqCXXWYyNuhUO4QwOZKM+VDJz2w1bnpluQpEmUYXgsIok4Tn7zPbuknzG05pw8YwqbkL96FBN7oAWGLW7LIihdcbMOerm3FBGHcrdeMsrFeIipEWiQKBgC87/hSFqNJBL7yhoEiI6qHsdLsRZPRloMf+fAld0ddRVaBy12Geub8DHCwm5v5wYQrcrOJpv2uHzVqbM2bMZCnUN5IijIMf3X4i0Cw6DJBKRzXb5q4bZ9QFfqqba2YLZz5Vhdr7zkGl4eoXxgKjH82f13HKqkKGtREVjMQQZMEpAoGATlhkSQpm45E5z8kDczwRQg6Dln6t8vbJl8vUG3iwu74dlqQnKU+6qglwlwEEStsI6p1lpYMRi4qUSqP0B4S0EEXRS+Xrlsxb9NS6ZpCe4/ci0svSYY6gjMHdGIChm5PC7TSjDUx2v3T98ytN7yul2bADtTaWNms2Ppr0GG+AP8kCgYEA3/y+q801/glLvib8+HR36OUs+9l+E/oyyTjVqB1A/d/LRgE5gGqRw6G1Jy2ZxxJ7zcG0TBvjv65B1Iwt45uNb8Uhw6r6PTHlZUE+F8/Hjzmh3Nk5YVoTQj4PqiSLaxhPao0Dkyrmoxmx9DN097A2AMk1FAvbLE+y9dsu78hH3XI=
+
+eureka:
+  client:
+    service-url.defaultZone: http://eureka:eureka_xyplat@10.6.189.14:8081/eureka
+    registry-fetch-interval-seconds: 5 # 默认为30秒
+    enabled: true  
+    registerWithEureka: true
+    fetchRegistry: true  
+    healthcheck.enabled: true
+    
+  instance:
+    lease-renewal-interval-in-seconds: 5
+    lease-expiration-duration-in-seconds: 5
+    prefer-ip-address: true    
+    instance-id: ${spring.cloud.client.ipAddress}:${server.port}  
+
+zhong:
+  notifyUrl: ame/service-pay-third/third/pay/api/notifyBOC
+  prvateKey: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQChSlsRd+721kGVqGRAcTfuL4juQPb0iobS+iXlF/hzlS7qOQ3xYDtY2n23t9nBv8E0sSdIDrMhlJIS/yELPVSGAJIC21KItWXIobZ5pwUhRi89SQ1I6iiPzlLAHoKz1DGUX5G3ULThf9ONTSGQErMMXwI98unM7v8WqKR5+HPZL+yghVqCV8BGHoJtq1hsS01lmdwGmY/9+YiMPt4rdaAq4OeKtT8DfBuNiGLA8TnwN3sevKz2c5FShvbISjwNNUPRYmqb8rMSBbv4rAX4z9Kki1mFm+4MuxtWrcg+/dMRJHm17OlOp8GdzNo33Api7BH1IgnjmG3z7haQx/DzoOstAgMBAAECggEAaV4oDEtro3npMpnllGvifAo1zGBIdQ0icyXUJ8v3FZs6IO3Q/AVAABYM1z6WVYqt73xkCyD/SUrD+wENV0hjtX8d5Bvf2UuYCPAMQ4EnSsuNBN56fU3r3baOPNAx1sUi9qlQio+A+2gEjmT7LiHpMoXG8y2EK8tefjEB8mSrWhB027UXeA+zZhnsmeY5s0Q7mOU8gzKaNjQLVVNr5DZvzJ2znpFCBQIRZ9gjrXzVLzNSdIoOTxbZcEaMOt4/NYTdGN1r/8fBbWlMZ87IMIHwJusifzXwA8u8EUoO1NGV8N8s+ioQLrDqghLu7Zop1HDNqGP8Bw1ZI+Bb8dKtP+dsSQKBgQD0dUZkk0Ro6bylkKh2uGLyndwZahVBv6qJg0igPVnG+srAA/hXQTcmtdo+a0HzE32a9KPCqT33pxxRS8uv1mv/387VgFYlBNRG0swnTNR+Ct0d2r9EdEEP+EjC9raN+Ld16ci5iQwwQ2rJshnu6Cbu4Y1UaWfvmKMjvb1bUA9vEwKBgQCo59jTiKRqYFtLEFhUOOy58Ny8nhOlbfNV5RTNE/fUJZ0bYvnkJU+SwfpYfSU1pDfZx4G3XNUdQadkxO/zn1EZxFVnax1OmodeuxBvIyAluqGPcrOHd5FgbMSqZyQts5JHcJdb2/CihRQ4JoM4S+NeN5QoAvcBxoR7oYEyTnREvwKBgBujzuu8QvXhx7SooIOb4YQxGRu+hNzEQRH/SAzmIup+nMINMN0cwJGd6ik4k2Jah88nbgSqghkoSelfOo6NHfT2Zzp4okTZQO8pEnA3HaeKrumbPBkPU/PsTL3Oi2GOB6BLaKihuEEUvlRD0O7UTOKhmgs7R8ctaPS3lVtnt/cFAoGAe829A4gjo4lPQV0QsWMsOTqQQXzIv7gw5WPNdGhPfmO3nYxVyGGEyvh97ICGVqQw/+MZdHKKDzDBZr5ndzXutylOxEgiKixgTxJkgGHJvX3n0AJuDzyYBYqUOKbzQMBf1xdzCjTTU/yhjmrEQe52EOhCI3XQ4a9GCmyeC2awGHcCgYB441H4Ys+kNP9Zi1nWJCz+vOtWf6gMY6le7kZtPhpyAgANrGmLv/djlAPfrpgZO9EsufnE1YtcVv8f+JNG+o/lPsyYT/5B3K9OFlV80P6x01V8lF1V3PX48TPk1d56bhi4SGwchNVf7u12cj2FOrgRks+e9o5WmGLWdtQgs3bkYQ==
+  merchantId: 138620080012800
+  trmNo: 97027311
+  publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjBSmvi3Xmvrne2heayLd0yPPz1J7JlMCiTg8qVU0vyFAytglP0V3SHGjwwMUI0MAXDENf0FoFlVmltvVtiXqQG4zZUNec2kgM2/uA0dfLr5yyuqTO/IR1B0BrJ3COguMYIM48GE+DIiiCfRYgjSQxCMD8zZriX7p1up2cJRJqGsOxgoiv6HekmQUGfyb4ZoSHAaksniDR1nZ/CEJrhp03S8pLN8OmM2Y5PSZgMx5e4HgTkqDrnijZzVEnPCjXcWlR6+vFuFVqahyr4qAXFuS4wj0/GSXONos5Ihm/Cuj2SaJpyPChSaWfrGQPuxUj/CamjR9KnwqEfwmC6i2qYI95wIDAQAB
+
+
+---
+spring:
+  profiles: prodjnss
+  datasource:
+      driver-class-name: com.mysql.jdbc.Driver
+      username: root
+      password: xymysqlroot_2019
+      url: jdbc:mysql://172.29.37.248:3316/xyplatdb?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&rewriteBatchedStatements=true&autoReconnect=true
+      type: com.alibaba.druid.pool.DruidDataSource 
+      
+      initialSize: 5  
+      minIdle: 5  
+      maxActive: 20  
+      maxWait: 60000  
+      timeBetweenEvictionRunsMillis: 60000  
+      minEvictableIdleTimeMillis: 300000  
+      validationQuery: SELECT NOW()  
+      testWhileIdle: true  
+      testOnBorrow: true  
+      testOnReturn: false  
+      poolPreparedStatements: true  
+      maxPoolPreparedStatementPerConnectionSize: 20  
+      filters: stat,log4j  
+      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000  
+
+  #jpa
+  jpa: 
+      show-sql: true
+      open-in-view: true  
+      
+  zipkin:
+    enabled: false
+    baseUrl: http://115.28.187.223:8088/
+
+  sleuth:
+     sampler:
+       #  采样率
+       percentage: 0.1
+            
+#redis
+  redis:
+    database: 0
+    host: 172.29.37.248
+    password:  XY#123456@mm
+    port: 6389
+    pool:
+      min-idle: 1
+      max-idel: 8
+      max-active: 100
+      max-wait: 1    
+    timeout: 3000 
+    
+logging:
+    level:
+      root: INFO
+      com.xynet: INFO
+    file: logs/service-pay-third.log
+    
+#server 
+server:
+  port: 80
+
+app:
+    fileHome: file/
+    tempFileHome: tmp/
+    #xxwAppId: 202309221154775238081249280
+    #xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCRm1lNYsBDYGs/4HOgGbyOCwhElfBj5tNOqAjm/emKt1dlq9Ty9oGaiyo+nMoUAGuJIx73hWU1ksIoIKXWzrCgvCb3EpxSTfs2SzdeBhtA7YAoaeYNCppeHigBxy0Vm2JktrvlO/HEs2jNz+Ak/4Je2iNVA0OvzYYf8OopIKkzVy1zA1gQXUf50H4QL9bxc1I2rQncHbzas6UlJNkIXbOJaF3hxMWyMlrgWg8SPxmsw2ytgwk53LpwxjFHXcJ0IyFkfu/RnfTKK8wD+pZ3GUxj2r7YonmjUf7//5VhZi1sfTMcoxK8dS6E96IeftO71ljoz9e2IOGaQ0gM6droxo9XAgMBAAECggEAFNTE0e1u1DTXIyxZXm5QK4IojKdm3OQJFxezLljlMJNKTaFntdrOb+24/Xww7OuidtwvcfoDoMZ+QH9rOnAXlOdWK8Ld2miNqBbatPjqrT9NNnrwDq2VqCFoV9jG+nBgg0ghWYpZ7Go+dDNpPeHQJQHQTDlLVbtxlOBCn9+sVUvKug3LYWB+k8wTkkfL8UbIZ6G+Khqam/jh7IVNan77jY6ORAae2ofivALnGtlD0RKokDs6sZtxniqMhzRZQ8M9bP9oEbuoI1C138CDWr/OaSetuGA4O+7YPaekKSQ1Vy5GdxZuC/u2eZ6rC0g4JXRx+WPdgao/Mp76r7+jIUP7AQKBgQD1qzPARTfJuUDwVPRC2OFwfJRufqye+e2UxPLloW8gJhsXrME848CRwtkqqzzwzdI0LG4HCLRyYISuzo3WkPEZL85SYSlBeMMShxF7a6ggqP1cGW03OQuNXCZwRvvRNHZvuQopIJffvv3+sCTIGRAG8wbHfD1lLW7p4y/F5ZcXvQKBgQCXuujITsEEQEUWE5rczcrYmJ4guIGWtW3gLHLFiYrOdV+8hpK+8hU+9gg71fX2yVv9Aymt9uMrZ7uJ2cVsiiviMUgRLRPihua56YOrVn7mdhyK78F5kIaMYlKK3sYkbTmA1wNdv2uoLx41EhXNOnVMVwu29KctAIm8/xHP9sJaowKBgQCdrdT5g3PbNdxIZT6h6TJJUKy0fvms0B19byu313XL3Klm+KrOuh/PbpCUonPq2zAf7KRyP1QSVYDT8h93qHAXCmgS1+ny69/I9Ihz/xVaYRy9EFTZLPQNNyg0yFq4XEPoUYwD+beBFMVRwxzYkb2HuFSRlVySpCacWAVBr6rawQKBgF8N8EF03QTtwpo3BACqSBbzXbUAAedJmCEll21bYoM/ExAHeq12+YptFfFudF37/c3/CkB6+Aw8O0f8DuuVkDJvT0e7Zsa2Xps/yIYxdOSqP+1mkF25BiGygyWOtLEjYC/wA6LahfZiNllnEBN3OP7vVV5z3Lubp66oWR9g5pdjAoGACrcCIRTOFtGYrGlqvYpad6+RDGUEXx4X7NKJA8IC+FQgA9dquDpoqhvbAzxjn7rG62b35KQSUQME/sXMtCwbFv/9zKTrLjNXhRnJWT3aUUiUhbmQfk9CWHLTxeOlW/ecdzbklQD7i4HjPKrmI3XfhgqOagtuKGj9SaCFqRF/jPU=
+    xxwAppId: 202310201164921719597563904
+    xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu/W4vOOFFTEYMpVqSASQgqlKsxsgV6UnYf4OhskXXKWwwnZFKcqFh++aW9Aw73s1vZgoXKv/SVYEmrB48qJjZHZzVMg5BI6So8gs7JomwH7rNR9le1Xs3OVP5vML6jDVuCjd61/qyG++A3P+GviOCLny3qiytsVFBA9LfN+P9OoB7tW6FbRTlTRUNB0oKR+Hlg1wRKP+USuRUWzXQxZt0Ie0SmpDcnfAduUPurcODbrkqF5e4ic0mfXFhqPB6o9hUs0onjnc2P0W374rPUcWRxJJa5wT/6XFqYV5OSob6KSA9qBx/tefdvEfnrGFqtAQhPNv5N/uAwRxDMI4NDSWBAgMBAAECggEAHqkjFD0YI4dAwth6LRjsFpkhUUqnJkew+7EkBEHzQMbuQPpqyauaIUv81DhAqIDaaAlt/S84kccPkRIZXjGATpKEt0pE+x7erAd09lFDUMvOdEeBi79GDqAJ2bk8RKAqgHRj0i9jqq+AYIjYcOiB2j6A9cFogKqP/R9JZHkrhmPd34YxkvMvVy5GXsRXeWcruvyu+O1ai5GPUZw1FEPPEBP2ejvD6xX+8LQ6LKuoaTTByrdQpAk66/ykH8+p7aolCbLggFQvUDfqxTXShXZk0Z7mfhJsJnILcj0+k68L3xB19rhJL3NzIuA/8X2Ipo7u1eA6X17hKBhtUUnnmTP7QQKBgQDysl+WGj02pvylAeKKJlFsTXIC5IYbd91uUCmVTVDjGhcyfKKAIfJYxOp9V5dCMz/zG+m+V4EZdDTLNJrnkemGgB5QSN5+5MbRqch3LvX92WoTXs3YBWrxy+kfIZQCdvbIR4kIKXNVpNSqy1EdBlTAwCMJLKh0v/JZC54rGD3ZOQKBgQC4lPc0tkFzlOPD6XbJFMtLp+Mcogz0XW8c/kvrGR3sRs1AnKbYdn9nfR7hUqCXXWYyNuhUO4QwOZKM+VDJz2w1bnpluQpEmUYXgsIok4Tn7zPbuknzG05pw8YwqbkL96FBN7oAWGLW7LIihdcbMOerm3FBGHcrdeMsrFeIipEWiQKBgC87/hSFqNJBL7yhoEiI6qHsdLsRZPRloMf+fAld0ddRVaBy12Geub8DHCwm5v5wYQrcrOJpv2uHzVqbM2bMZCnUN5IijIMf3X4i0Cw6DJBKRzXb5q4bZ9QFfqqba2YLZz5Vhdr7zkGl4eoXxgKjH82f13HKqkKGtREVjMQQZMEpAoGATlhkSQpm45E5z8kDczwRQg6Dln6t8vbJl8vUG3iwu74dlqQnKU+6qglwlwEEStsI6p1lpYMRi4qUSqP0B4S0EEXRS+Xrlsxb9NS6ZpCe4/ci0svSYY6gjMHdGIChm5PC7TSjDUx2v3T98ytN7yul2bADtTaWNms2Ppr0GG+AP8kCgYEA3/y+q801/glLvib8+HR36OUs+9l+E/oyyTjVqB1A/d/LRgE5gGqRw6G1Jy2ZxxJ7zcG0TBvjv65B1Iwt45uNb8Uhw6r6PTHlZUE+F8/Hjzmh3Nk5YVoTQj4PqiSLaxhPao0Dkyrmoxmx9DN097A2AMk1FAvbLE+y9dsu78hH3XI=
+
+eureka:
+  client:
+    service-url.defaultZone: http://eureka:eureka_xyplat@172.29.37.248:8081/eureka
+    registry-fetch-interval-seconds: 5 # 默认为30秒
+    enabled: true  
+    registerWithEureka: true
+    fetchRegistry: true  
+    healthcheck.enabled: true
+    
+  instance:
+    lease-renewal-interval-in-seconds: 5
+    lease-expiration-duration-in-seconds: 5
+    prefer-ip-address: true    
+    instance-id: ${spring.cloud.client.ipAddress}:${server.port}  
+
+zhong:
+  notifyUrl: ame/service-pay-third/third/pay/api/notifyBOC
+  prvateKey: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQChSlsRd+721kGVqGRAcTfuL4juQPb0iobS+iXlF/hzlS7qOQ3xYDtY2n23t9nBv8E0sSdIDrMhlJIS/yELPVSGAJIC21KItWXIobZ5pwUhRi89SQ1I6iiPzlLAHoKz1DGUX5G3ULThf9ONTSGQErMMXwI98unM7v8WqKR5+HPZL+yghVqCV8BGHoJtq1hsS01lmdwGmY/9+YiMPt4rdaAq4OeKtT8DfBuNiGLA8TnwN3sevKz2c5FShvbISjwNNUPRYmqb8rMSBbv4rAX4z9Kki1mFm+4MuxtWrcg+/dMRJHm17OlOp8GdzNo33Api7BH1IgnjmG3z7haQx/DzoOstAgMBAAECggEAaV4oDEtro3npMpnllGvifAo1zGBIdQ0icyXUJ8v3FZs6IO3Q/AVAABYM1z6WVYqt73xkCyD/SUrD+wENV0hjtX8d5Bvf2UuYCPAMQ4EnSsuNBN56fU3r3baOPNAx1sUi9qlQio+A+2gEjmT7LiHpMoXG8y2EK8tefjEB8mSrWhB027UXeA+zZhnsmeY5s0Q7mOU8gzKaNjQLVVNr5DZvzJ2znpFCBQIRZ9gjrXzVLzNSdIoOTxbZcEaMOt4/NYTdGN1r/8fBbWlMZ87IMIHwJusifzXwA8u8EUoO1NGV8N8s+ioQLrDqghLu7Zop1HDNqGP8Bw1ZI+Bb8dKtP+dsSQKBgQD0dUZkk0Ro6bylkKh2uGLyndwZahVBv6qJg0igPVnG+srAA/hXQTcmtdo+a0HzE32a9KPCqT33pxxRS8uv1mv/387VgFYlBNRG0swnTNR+Ct0d2r9EdEEP+EjC9raN+Ld16ci5iQwwQ2rJshnu6Cbu4Y1UaWfvmKMjvb1bUA9vEwKBgQCo59jTiKRqYFtLEFhUOOy58Ny8nhOlbfNV5RTNE/fUJZ0bYvnkJU+SwfpYfSU1pDfZx4G3XNUdQadkxO/zn1EZxFVnax1OmodeuxBvIyAluqGPcrOHd5FgbMSqZyQts5JHcJdb2/CihRQ4JoM4S+NeN5QoAvcBxoR7oYEyTnREvwKBgBujzuu8QvXhx7SooIOb4YQxGRu+hNzEQRH/SAzmIup+nMINMN0cwJGd6ik4k2Jah88nbgSqghkoSelfOo6NHfT2Zzp4okTZQO8pEnA3HaeKrumbPBkPU/PsTL3Oi2GOB6BLaKihuEEUvlRD0O7UTOKhmgs7R8ctaPS3lVtnt/cFAoGAe829A4gjo4lPQV0QsWMsOTqQQXzIv7gw5WPNdGhPfmO3nYxVyGGEyvh97ICGVqQw/+MZdHKKDzDBZr5ndzXutylOxEgiKixgTxJkgGHJvX3n0AJuDzyYBYqUOKbzQMBf1xdzCjTTU/yhjmrEQe52EOhCI3XQ4a9GCmyeC2awGHcCgYB441H4Ys+kNP9Zi1nWJCz+vOtWf6gMY6le7kZtPhpyAgANrGmLv/djlAPfrpgZO9EsufnE1YtcVv8f+JNG+o/lPsyYT/5B3K9OFlV80P6x01V8lF1V3PX48TPk1d56bhi4SGwchNVf7u12cj2FOrgRks+e9o5WmGLWdtQgs3bkYQ==
+  merchantId: 138620080012800
+  trmNo: 97027311
+  publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjBSmvi3Xmvrne2heayLd0yPPz1J7JlMCiTg8qVU0vyFAytglP0V3SHGjwwMUI0MAXDENf0FoFlVmltvVtiXqQG4zZUNec2kgM2/uA0dfLr5yyuqTO/IR1B0BrJ3COguMYIM48GE+DIiiCfRYgjSQxCMD8zZriX7p1up2cJRJqGsOxgoiv6HekmQUGfyb4ZoSHAaksniDR1nZ/CEJrhp03S8pLN8OmM2Y5PSZgMx5e4HgTkqDrnijZzVEnPCjXcWlR6+vFuFVqahyr4qAXFuS4wj0/GSXONos5Ihm/Cuj2SaJpyPChSaWfrGQPuxUj/CamjR9KnwqEfwmC6i2qYI95wIDAQAB
+
+
+
+
+---
+spring:
+  profiles: prodbynn
+  datasource:
+      driver-class-name: com.mysql.jdbc.Driver
+      username: root
+      password: xymysqlroot_2019
+      url: jdbc:mysql://127.0.0.1:3316/xyplatdb?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&rewriteBatchedStatements=true&autoReconnect=true
+      type: com.alibaba.druid.pool.DruidDataSource 
+      
+      initialSize: 5  
+      minIdle: 5  
+      maxActive: 20  
+      maxWait: 60000  
+      timeBetweenEvictionRunsMillis: 60000  
+      minEvictableIdleTimeMillis: 300000  
+      validationQuery: SELECT NOW()  
+      testWhileIdle: true  
+      testOnBorrow: true  
+      testOnReturn: false  
+      poolPreparedStatements: true  
+      maxPoolPreparedStatementPerConnectionSize: 20  
+      filters: stat,log4j  
+      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000  
+
+  #jpa
+  jpa: 
+      show-sql: true
+      open-in-view: true  
+      
+  zipkin:
+    enabled: false
+    baseUrl: http://115.28.187.223:8088/
+
+  sleuth:
+     sampler:
+       #  采样率
+       percentage: 0.1
+            
+#redis
+  redis:
+    database: 0
+    host: 127.0.0.1
+    password:  XY#123456@mm
+    port: 6389
+    pool:
+      min-idle: 1
+      max-idel: 8
+      max-active: 100
+      max-wait: 1    
+    timeout: 3000 
+    
+logging:
+    level:
+      root: INFO
+      com.xynet: INFO
+    file: logs/service-pay-third.log
+    
+#server 
+server:
+  port: 80
+
+app:
+    fileHome: file/
+    tempFileHome: tmp/
+    #xxwAppId: 202309221154775238081249280
+    #xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCRm1lNYsBDYGs/4HOgGbyOCwhElfBj5tNOqAjm/emKt1dlq9Ty9oGaiyo+nMoUAGuJIx73hWU1ksIoIKXWzrCgvCb3EpxSTfs2SzdeBhtA7YAoaeYNCppeHigBxy0Vm2JktrvlO/HEs2jNz+Ak/4Je2iNVA0OvzYYf8OopIKkzVy1zA1gQXUf50H4QL9bxc1I2rQncHbzas6UlJNkIXbOJaF3hxMWyMlrgWg8SPxmsw2ytgwk53LpwxjFHXcJ0IyFkfu/RnfTKK8wD+pZ3GUxj2r7YonmjUf7//5VhZi1sfTMcoxK8dS6E96IeftO71ljoz9e2IOGaQ0gM6droxo9XAgMBAAECggEAFNTE0e1u1DTXIyxZXm5QK4IojKdm3OQJFxezLljlMJNKTaFntdrOb+24/Xww7OuidtwvcfoDoMZ+QH9rOnAXlOdWK8Ld2miNqBbatPjqrT9NNnrwDq2VqCFoV9jG+nBgg0ghWYpZ7Go+dDNpPeHQJQHQTDlLVbtxlOBCn9+sVUvKug3LYWB+k8wTkkfL8UbIZ6G+Khqam/jh7IVNan77jY6ORAae2ofivALnGtlD0RKokDs6sZtxniqMhzRZQ8M9bP9oEbuoI1C138CDWr/OaSetuGA4O+7YPaekKSQ1Vy5GdxZuC/u2eZ6rC0g4JXRx+WPdgao/Mp76r7+jIUP7AQKBgQD1qzPARTfJuUDwVPRC2OFwfJRufqye+e2UxPLloW8gJhsXrME848CRwtkqqzzwzdI0LG4HCLRyYISuzo3WkPEZL85SYSlBeMMShxF7a6ggqP1cGW03OQuNXCZwRvvRNHZvuQopIJffvv3+sCTIGRAG8wbHfD1lLW7p4y/F5ZcXvQKBgQCXuujITsEEQEUWE5rczcrYmJ4guIGWtW3gLHLFiYrOdV+8hpK+8hU+9gg71fX2yVv9Aymt9uMrZ7uJ2cVsiiviMUgRLRPihua56YOrVn7mdhyK78F5kIaMYlKK3sYkbTmA1wNdv2uoLx41EhXNOnVMVwu29KctAIm8/xHP9sJaowKBgQCdrdT5g3PbNdxIZT6h6TJJUKy0fvms0B19byu313XL3Klm+KrOuh/PbpCUonPq2zAf7KRyP1QSVYDT8h93qHAXCmgS1+ny69/I9Ihz/xVaYRy9EFTZLPQNNyg0yFq4XEPoUYwD+beBFMVRwxzYkb2HuFSRlVySpCacWAVBr6rawQKBgF8N8EF03QTtwpo3BACqSBbzXbUAAedJmCEll21bYoM/ExAHeq12+YptFfFudF37/c3/CkB6+Aw8O0f8DuuVkDJvT0e7Zsa2Xps/yIYxdOSqP+1mkF25BiGygyWOtLEjYC/wA6LahfZiNllnEBN3OP7vVV5z3Lubp66oWR9g5pdjAoGACrcCIRTOFtGYrGlqvYpad6+RDGUEXx4X7NKJA8IC+FQgA9dquDpoqhvbAzxjn7rG62b35KQSUQME/sXMtCwbFv/9zKTrLjNXhRnJWT3aUUiUhbmQfk9CWHLTxeOlW/ecdzbklQD7i4HjPKrmI3XfhgqOagtuKGj9SaCFqRF/jPU=
+    xxwAppId: 202310201164921719597563904
+    xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu/W4vOOFFTEYMpVqSASQgqlKsxsgV6UnYf4OhskXXKWwwnZFKcqFh++aW9Aw73s1vZgoXKv/SVYEmrB48qJjZHZzVMg5BI6So8gs7JomwH7rNR9le1Xs3OVP5vML6jDVuCjd61/qyG++A3P+GviOCLny3qiytsVFBA9LfN+P9OoB7tW6FbRTlTRUNB0oKR+Hlg1wRKP+USuRUWzXQxZt0Ie0SmpDcnfAduUPurcODbrkqF5e4ic0mfXFhqPB6o9hUs0onjnc2P0W374rPUcWRxJJa5wT/6XFqYV5OSob6KSA9qBx/tefdvEfnrGFqtAQhPNv5N/uAwRxDMI4NDSWBAgMBAAECggEAHqkjFD0YI4dAwth6LRjsFpkhUUqnJkew+7EkBEHzQMbuQPpqyauaIUv81DhAqIDaaAlt/S84kccPkRIZXjGATpKEt0pE+x7erAd09lFDUMvOdEeBi79GDqAJ2bk8RKAqgHRj0i9jqq+AYIjYcOiB2j6A9cFogKqP/R9JZHkrhmPd34YxkvMvVy5GXsRXeWcruvyu+O1ai5GPUZw1FEPPEBP2ejvD6xX+8LQ6LKuoaTTByrdQpAk66/ykH8+p7aolCbLggFQvUDfqxTXShXZk0Z7mfhJsJnILcj0+k68L3xB19rhJL3NzIuA/8X2Ipo7u1eA6X17hKBhtUUnnmTP7QQKBgQDysl+WGj02pvylAeKKJlFsTXIC5IYbd91uUCmVTVDjGhcyfKKAIfJYxOp9V5dCMz/zG+m+V4EZdDTLNJrnkemGgB5QSN5+5MbRqch3LvX92WoTXs3YBWrxy+kfIZQCdvbIR4kIKXNVpNSqy1EdBlTAwCMJLKh0v/JZC54rGD3ZOQKBgQC4lPc0tkFzlOPD6XbJFMtLp+Mcogz0XW8c/kvrGR3sRs1AnKbYdn9nfR7hUqCXXWYyNuhUO4QwOZKM+VDJz2w1bnpluQpEmUYXgsIok4Tn7zPbuknzG05pw8YwqbkL96FBN7oAWGLW7LIihdcbMOerm3FBGHcrdeMsrFeIipEWiQKBgC87/hSFqNJBL7yhoEiI6qHsdLsRZPRloMf+fAld0ddRVaBy12Geub8DHCwm5v5wYQrcrOJpv2uHzVqbM2bMZCnUN5IijIMf3X4i0Cw6DJBKRzXb5q4bZ9QFfqqba2YLZz5Vhdr7zkGl4eoXxgKjH82f13HKqkKGtREVjMQQZMEpAoGATlhkSQpm45E5z8kDczwRQg6Dln6t8vbJl8vUG3iwu74dlqQnKU+6qglwlwEEStsI6p1lpYMRi4qUSqP0B4S0EEXRS+Xrlsxb9NS6ZpCe4/ci0svSYY6gjMHdGIChm5PC7TSjDUx2v3T98ytN7yul2bADtTaWNms2Ppr0GG+AP8kCgYEA3/y+q801/glLvib8+HR36OUs+9l+E/oyyTjVqB1A/d/LRgE5gGqRw6G1Jy2ZxxJ7zcG0TBvjv65B1Iwt45uNb8Uhw6r6PTHlZUE+F8/Hjzmh3Nk5YVoTQj4PqiSLaxhPao0Dkyrmoxmx9DN097A2AMk1FAvbLE+y9dsu78hH3XI=
+
+eureka:
+  client:
+    service-url.defaultZone: http://eureka:eureka_xyplat@127.0.0.1:8081/eureka
+    registry-fetch-interval-seconds: 5 # 默认为30秒
+    enabled: true  
+    registerWithEureka: true
+    fetchRegistry: true  
+    healthcheck.enabled: true
+    
+  instance:
+    lease-renewal-interval-in-seconds: 5
+    lease-expiration-duration-in-seconds: 5
+    prefer-ip-address: true    
+    instance-id: ${spring.cloud.client.ipAddress}:${server.port}  
+
+zhong:
+  notifyUrl: ame/service-pay-third/third/pay/api/notifyBOC
+  prvateKey: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQChSlsRd+721kGVqGRAcTfuL4juQPb0iobS+iXlF/hzlS7qOQ3xYDtY2n23t9nBv8E0sSdIDrMhlJIS/yELPVSGAJIC21KItWXIobZ5pwUhRi89SQ1I6iiPzlLAHoKz1DGUX5G3ULThf9ONTSGQErMMXwI98unM7v8WqKR5+HPZL+yghVqCV8BGHoJtq1hsS01lmdwGmY/9+YiMPt4rdaAq4OeKtT8DfBuNiGLA8TnwN3sevKz2c5FShvbISjwNNUPRYmqb8rMSBbv4rAX4z9Kki1mFm+4MuxtWrcg+/dMRJHm17OlOp8GdzNo33Api7BH1IgnjmG3z7haQx/DzoOstAgMBAAECggEAaV4oDEtro3npMpnllGvifAo1zGBIdQ0icyXUJ8v3FZs6IO3Q/AVAABYM1z6WVYqt73xkCyD/SUrD+wENV0hjtX8d5Bvf2UuYCPAMQ4EnSsuNBN56fU3r3baOPNAx1sUi9qlQio+A+2gEjmT7LiHpMoXG8y2EK8tefjEB8mSrWhB027UXeA+zZhnsmeY5s0Q7mOU8gzKaNjQLVVNr5DZvzJ2znpFCBQIRZ9gjrXzVLzNSdIoOTxbZcEaMOt4/NYTdGN1r/8fBbWlMZ87IMIHwJusifzXwA8u8EUoO1NGV8N8s+ioQLrDqghLu7Zop1HDNqGP8Bw1ZI+Bb8dKtP+dsSQKBgQD0dUZkk0Ro6bylkKh2uGLyndwZahVBv6qJg0igPVnG+srAA/hXQTcmtdo+a0HzE32a9KPCqT33pxxRS8uv1mv/387VgFYlBNRG0swnTNR+Ct0d2r9EdEEP+EjC9raN+Ld16ci5iQwwQ2rJshnu6Cbu4Y1UaWfvmKMjvb1bUA9vEwKBgQCo59jTiKRqYFtLEFhUOOy58Ny8nhOlbfNV5RTNE/fUJZ0bYvnkJU+SwfpYfSU1pDfZx4G3XNUdQadkxO/zn1EZxFVnax1OmodeuxBvIyAluqGPcrOHd5FgbMSqZyQts5JHcJdb2/CihRQ4JoM4S+NeN5QoAvcBxoR7oYEyTnREvwKBgBujzuu8QvXhx7SooIOb4YQxGRu+hNzEQRH/SAzmIup+nMINMN0cwJGd6ik4k2Jah88nbgSqghkoSelfOo6NHfT2Zzp4okTZQO8pEnA3HaeKrumbPBkPU/PsTL3Oi2GOB6BLaKihuEEUvlRD0O7UTOKhmgs7R8ctaPS3lVtnt/cFAoGAe829A4gjo4lPQV0QsWMsOTqQQXzIv7gw5WPNdGhPfmO3nYxVyGGEyvh97ICGVqQw/+MZdHKKDzDBZr5ndzXutylOxEgiKixgTxJkgGHJvX3n0AJuDzyYBYqUOKbzQMBf1xdzCjTTU/yhjmrEQe52EOhCI3XQ4a9GCmyeC2awGHcCgYB441H4Ys+kNP9Zi1nWJCz+vOtWf6gMY6le7kZtPhpyAgANrGmLv/djlAPfrpgZO9EsufnE1YtcVv8f+JNG+o/lPsyYT/5B3K9OFlV80P6x01V8lF1V3PX48TPk1d56bhi4SGwchNVf7u12cj2FOrgRks+e9o5WmGLWdtQgs3bkYQ==
+  merchantId: 138620080012800
+  trmNo: 97027311
+  publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjBSmvi3Xmvrne2heayLd0yPPz1J7JlMCiTg8qVU0vyFAytglP0V3SHGjwwMUI0MAXDENf0FoFlVmltvVtiXqQG4zZUNec2kgM2/uA0dfLr5yyuqTO/IR1B0BrJ3COguMYIM48GE+DIiiCfRYgjSQxCMD8zZriX7p1up2cJRJqGsOxgoiv6HekmQUGfyb4ZoSHAaksniDR1nZ/CEJrhp03S8pLN8OmM2Y5PSZgMx5e4HgTkqDrnijZzVEnPCjXcWlR6+vFuFVqahyr4qAXFuS4wj0/GSXONos5Ihm/Cuj2SaJpyPChSaWfrGQPuxUj/CamjR9KnwqEfwmC6i2qYI95wIDAQAB
+
+
+---
+spring:
+  profiles: prodsgp
+  datasource:
+      driver-class-name: com.mysql.jdbc.Driver
+      username: root
+      password: E2P4pWD$arB(
+      url: jdbc:mysql://127.0.0.1:3316/xyplatdb?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&rewriteBatchedStatements=true&autoReconnect=true
+      type: com.alibaba.druid.pool.DruidDataSource 
+      
+      initialSize: 5  
+      minIdle: 5  
+      maxActive: 20  
+      maxWait: 60000  
+      timeBetweenEvictionRunsMillis: 60000  
+      minEvictableIdleTimeMillis: 300000  
+      validationQuery: SELECT NOW()  
+      testWhileIdle: true  
+      testOnBorrow: true  
+      testOnReturn: false  
+      poolPreparedStatements: true  
+      maxPoolPreparedStatementPerConnectionSize: 20  
+      filters: stat,log4j  
+      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000  
+
+  #jpa
+  jpa: 
+      show-sql: true
+      open-in-view: true  
+      
+  zipkin:
+    enabled: false
+    baseUrl: http://115.28.187.223:8088/
+
+  sleuth:
+     sampler:
+       #  采样率
+       percentage: 0.1
+            
+#redis
+  redis:
+    database: 0
+    host: 127.0.0.1
+    password:  XY#123456@mm
+    port: 6389
+    pool:
+      min-idle: 1
+      max-idel: 8
+      max-active: 100
+      max-wait: 1    
+    timeout: 3000 
+    
+logging:
+    level:
+      root: INFO
+      com.xynet: INFO
+    file: logs/service-pay-third.log
+    
+#server 
+server:
+  port: 80
+
+app:
+    fileHome: file/
+    tempFileHome: tmp/
+    #xxwAppId: 202309221154775238081249280
+    #xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCRm1lNYsBDYGs/4HOgGbyOCwhElfBj5tNOqAjm/emKt1dlq9Ty9oGaiyo+nMoUAGuJIx73hWU1ksIoIKXWzrCgvCb3EpxSTfs2SzdeBhtA7YAoaeYNCppeHigBxy0Vm2JktrvlO/HEs2jNz+Ak/4Je2iNVA0OvzYYf8OopIKkzVy1zA1gQXUf50H4QL9bxc1I2rQncHbzas6UlJNkIXbOJaF3hxMWyMlrgWg8SPxmsw2ytgwk53LpwxjFHXcJ0IyFkfu/RnfTKK8wD+pZ3GUxj2r7YonmjUf7//5VhZi1sfTMcoxK8dS6E96IeftO71ljoz9e2IOGaQ0gM6droxo9XAgMBAAECggEAFNTE0e1u1DTXIyxZXm5QK4IojKdm3OQJFxezLljlMJNKTaFntdrOb+24/Xww7OuidtwvcfoDoMZ+QH9rOnAXlOdWK8Ld2miNqBbatPjqrT9NNnrwDq2VqCFoV9jG+nBgg0ghWYpZ7Go+dDNpPeHQJQHQTDlLVbtxlOBCn9+sVUvKug3LYWB+k8wTkkfL8UbIZ6G+Khqam/jh7IVNan77jY6ORAae2ofivALnGtlD0RKokDs6sZtxniqMhzRZQ8M9bP9oEbuoI1C138CDWr/OaSetuGA4O+7YPaekKSQ1Vy5GdxZuC/u2eZ6rC0g4JXRx+WPdgao/Mp76r7+jIUP7AQKBgQD1qzPARTfJuUDwVPRC2OFwfJRufqye+e2UxPLloW8gJhsXrME848CRwtkqqzzwzdI0LG4HCLRyYISuzo3WkPEZL85SYSlBeMMShxF7a6ggqP1cGW03OQuNXCZwRvvRNHZvuQopIJffvv3+sCTIGRAG8wbHfD1lLW7p4y/F5ZcXvQKBgQCXuujITsEEQEUWE5rczcrYmJ4guIGWtW3gLHLFiYrOdV+8hpK+8hU+9gg71fX2yVv9Aymt9uMrZ7uJ2cVsiiviMUgRLRPihua56YOrVn7mdhyK78F5kIaMYlKK3sYkbTmA1wNdv2uoLx41EhXNOnVMVwu29KctAIm8/xHP9sJaowKBgQCdrdT5g3PbNdxIZT6h6TJJUKy0fvms0B19byu313XL3Klm+KrOuh/PbpCUonPq2zAf7KRyP1QSVYDT8h93qHAXCmgS1+ny69/I9Ihz/xVaYRy9EFTZLPQNNyg0yFq4XEPoUYwD+beBFMVRwxzYkb2HuFSRlVySpCacWAVBr6rawQKBgF8N8EF03QTtwpo3BACqSBbzXbUAAedJmCEll21bYoM/ExAHeq12+YptFfFudF37/c3/CkB6+Aw8O0f8DuuVkDJvT0e7Zsa2Xps/yIYxdOSqP+1mkF25BiGygyWOtLEjYC/wA6LahfZiNllnEBN3OP7vVV5z3Lubp66oWR9g5pdjAoGACrcCIRTOFtGYrGlqvYpad6+RDGUEXx4X7NKJA8IC+FQgA9dquDpoqhvbAzxjn7rG62b35KQSUQME/sXMtCwbFv/9zKTrLjNXhRnJWT3aUUiUhbmQfk9CWHLTxeOlW/ecdzbklQD7i4HjPKrmI3XfhgqOagtuKGj9SaCFqRF/jPU=
+    xxwAppId: 202310201164921719597563904
+    xxwSK: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu/W4vOOFFTEYMpVqSASQgqlKsxsgV6UnYf4OhskXXKWwwnZFKcqFh++aW9Aw73s1vZgoXKv/SVYEmrB48qJjZHZzVMg5BI6So8gs7JomwH7rNR9le1Xs3OVP5vML6jDVuCjd61/qyG++A3P+GviOCLny3qiytsVFBA9LfN+P9OoB7tW6FbRTlTRUNB0oKR+Hlg1wRKP+USuRUWzXQxZt0Ie0SmpDcnfAduUPurcODbrkqF5e4ic0mfXFhqPB6o9hUs0onjnc2P0W374rPUcWRxJJa5wT/6XFqYV5OSob6KSA9qBx/tefdvEfnrGFqtAQhPNv5N/uAwRxDMI4NDSWBAgMBAAECggEAHqkjFD0YI4dAwth6LRjsFpkhUUqnJkew+7EkBEHzQMbuQPpqyauaIUv81DhAqIDaaAlt/S84kccPkRIZXjGATpKEt0pE+x7erAd09lFDUMvOdEeBi79GDqAJ2bk8RKAqgHRj0i9jqq+AYIjYcOiB2j6A9cFogKqP/R9JZHkrhmPd34YxkvMvVy5GXsRXeWcruvyu+O1ai5GPUZw1FEPPEBP2ejvD6xX+8LQ6LKuoaTTByrdQpAk66/ykH8+p7aolCbLggFQvUDfqxTXShXZk0Z7mfhJsJnILcj0+k68L3xB19rhJL3NzIuA/8X2Ipo7u1eA6X17hKBhtUUnnmTP7QQKBgQDysl+WGj02pvylAeKKJlFsTXIC5IYbd91uUCmVTVDjGhcyfKKAIfJYxOp9V5dCMz/zG+m+V4EZdDTLNJrnkemGgB5QSN5+5MbRqch3LvX92WoTXs3YBWrxy+kfIZQCdvbIR4kIKXNVpNSqy1EdBlTAwCMJLKh0v/JZC54rGD3ZOQKBgQC4lPc0tkFzlOPD6XbJFMtLp+Mcogz0XW8c/kvrGR3sRs1AnKbYdn9nfR7hUqCXXWYyNuhUO4QwOZKM+VDJz2w1bnpluQpEmUYXgsIok4Tn7zPbuknzG05pw8YwqbkL96FBN7oAWGLW7LIihdcbMOerm3FBGHcrdeMsrFeIipEWiQKBgC87/hSFqNJBL7yhoEiI6qHsdLsRZPRloMf+fAld0ddRVaBy12Geub8DHCwm5v5wYQrcrOJpv2uHzVqbM2bMZCnUN5IijIMf3X4i0Cw6DJBKRzXb5q4bZ9QFfqqba2YLZz5Vhdr7zkGl4eoXxgKjH82f13HKqkKGtREVjMQQZMEpAoGATlhkSQpm45E5z8kDczwRQg6Dln6t8vbJl8vUG3iwu74dlqQnKU+6qglwlwEEStsI6p1lpYMRi4qUSqP0B4S0EEXRS+Xrlsxb9NS6ZpCe4/ci0svSYY6gjMHdGIChm5PC7TSjDUx2v3T98ytN7yul2bADtTaWNms2Ppr0GG+AP8kCgYEA3/y+q801/glLvib8+HR36OUs+9l+E/oyyTjVqB1A/d/LRgE5gGqRw6G1Jy2ZxxJ7zcG0TBvjv65B1Iwt45uNb8Uhw6r6PTHlZUE+F8/Hjzmh3Nk5YVoTQj4PqiSLaxhPao0Dkyrmoxmx9DN097A2AMk1FAvbLE+y9dsu78hH3XI=
+
+eureka:
+  client:
+    service-url.defaultZone: http://eureka:eureka_xyplat@127.0.0.1:8761/eureka
+    registry-fetch-interval-seconds: 5 # 默认为30秒
+    enabled: true  
+    registerWithEureka: true
+    fetchRegistry: true  
+    healthcheck.enabled: true
+    
+  instance:
+    lease-renewal-interval-in-seconds: 5
+    lease-expiration-duration-in-seconds: 5
+    prefer-ip-address: true    
+    instance-id: ${spring.cloud.client.ipAddress}:${server.port}  
+
+zhong:
+  notifyUrl: ame/service-pay-third/third/pay/api/notifyBOC
+  prvateKey: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQChSlsRd+721kGVqGRAcTfuL4juQPb0iobS+iXlF/hzlS7qOQ3xYDtY2n23t9nBv8E0sSdIDrMhlJIS/yELPVSGAJIC21KItWXIobZ5pwUhRi89SQ1I6iiPzlLAHoKz1DGUX5G3ULThf9ONTSGQErMMXwI98unM7v8WqKR5+HPZL+yghVqCV8BGHoJtq1hsS01lmdwGmY/9+YiMPt4rdaAq4OeKtT8DfBuNiGLA8TnwN3sevKz2c5FShvbISjwNNUPRYmqb8rMSBbv4rAX4z9Kki1mFm+4MuxtWrcg+/dMRJHm17OlOp8GdzNo33Api7BH1IgnjmG3z7haQx/DzoOstAgMBAAECggEAaV4oDEtro3npMpnllGvifAo1zGBIdQ0icyXUJ8v3FZs6IO3Q/AVAABYM1z6WVYqt73xkCyD/SUrD+wENV0hjtX8d5Bvf2UuYCPAMQ4EnSsuNBN56fU3r3baOPNAx1sUi9qlQio+A+2gEjmT7LiHpMoXG8y2EK8tefjEB8mSrWhB027UXeA+zZhnsmeY5s0Q7mOU8gzKaNjQLVVNr5DZvzJ2znpFCBQIRZ9gjrXzVLzNSdIoOTxbZcEaMOt4/NYTdGN1r/8fBbWlMZ87IMIHwJusifzXwA8u8EUoO1NGV8N8s+ioQLrDqghLu7Zop1HDNqGP8Bw1ZI+Bb8dKtP+dsSQKBgQD0dUZkk0Ro6bylkKh2uGLyndwZahVBv6qJg0igPVnG+srAA/hXQTcmtdo+a0HzE32a9KPCqT33pxxRS8uv1mv/387VgFYlBNRG0swnTNR+Ct0d2r9EdEEP+EjC9raN+Ld16ci5iQwwQ2rJshnu6Cbu4Y1UaWfvmKMjvb1bUA9vEwKBgQCo59jTiKRqYFtLEFhUOOy58Ny8nhOlbfNV5RTNE/fUJZ0bYvnkJU+SwfpYfSU1pDfZx4G3XNUdQadkxO/zn1EZxFVnax1OmodeuxBvIyAluqGPcrOHd5FgbMSqZyQts5JHcJdb2/CihRQ4JoM4S+NeN5QoAvcBxoR7oYEyTnREvwKBgBujzuu8QvXhx7SooIOb4YQxGRu+hNzEQRH/SAzmIup+nMINMN0cwJGd6ik4k2Jah88nbgSqghkoSelfOo6NHfT2Zzp4okTZQO8pEnA3HaeKrumbPBkPU/PsTL3Oi2GOB6BLaKihuEEUvlRD0O7UTOKhmgs7R8ctaPS3lVtnt/cFAoGAe829A4gjo4lPQV0QsWMsOTqQQXzIv7gw5WPNdGhPfmO3nYxVyGGEyvh97ICGVqQw/+MZdHKKDzDBZr5ndzXutylOxEgiKixgTxJkgGHJvX3n0AJuDzyYBYqUOKbzQMBf1xdzCjTTU/yhjmrEQe52EOhCI3XQ4a9GCmyeC2awGHcCgYB441H4Ys+kNP9Zi1nWJCz+vOtWf6gMY6le7kZtPhpyAgANrGmLv/djlAPfrpgZO9EsufnE1YtcVv8f+JNG+o/lPsyYT/5B3K9OFlV80P6x01V8lF1V3PX48TPk1d56bhi4SGwchNVf7u12cj2FOrgRks+e9o5WmGLWdtQgs3bkYQ==
+  merchantId: 138620080012800
+  trmNo: 97027311
+  publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjBSmvi3Xmvrne2heayLd0yPPz1J7JlMCiTg8qVU0vyFAytglP0V3SHGjwwMUI0MAXDENf0FoFlVmltvVtiXqQG4zZUNec2kgM2/uA0dfLr5yyuqTO/IR1B0BrJ3COguMYIM48GE+DIiiCfRYgjSQxCMD8zZriX7p1up2cJRJqGsOxgoiv6HekmQUGfyb4ZoSHAaksniDR1nZ/CEJrhp03S8pLN8OmM2Y5PSZgMx5e4HgTkqDrnijZzVEnPCjXcWlR6+vFuFVqahyr4qAXFuS4wj0/GSXONos5Ihm/Cuj2SaJpyPChSaWfrGQPuxUj/CamjR9KnwqEfwmC6i2qYI95wIDAQAB
+
+

+ 15 - 0
src/main/resources/environment.properties

@@ -0,0 +1,15 @@
+#0 表示测试环境 1 表示正式环境 2 表示本机环境
+env=1
+socketTimeOut=5000
+connectTimeOut=3000
+connectRequestTimeOut=3000
+# http client连接池参数
+maxTotal=20
+defaultMaxPerRoute=20
+maxPerRoute=20
+# OAuth认证token本地缓存文件路径 如调用时使用token为入参则不需要配置
+tokenFilePath=C:\\openapi
+# 认证方式:1-表示使用sig认证方式 2-表示使用OAuth认证方式
+isSig=1
+#sdk自动升级版本号
+sdkVersion = 1.0.14-SNAPSHOT

+ 80 - 0
src/main/resources/logback-spring.xml

@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration status="warn">
+    <property name="logback.logDir" value="logs/"/>
+
+    <!--输出到控制台 ConsoleAppender-->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <!--展示格式 layout-->
+        <encoder>
+            <charset>UTF-8</charset>
+            <pattern>%d [%t] %-5level %logger{36}.%M\(%file:%line\) - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="infoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高,
+            所以我们使用下面的策略,可以避免输出 Error 的日志-->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!--过滤 Error
+            <level>ERROR</level>
+            <onMatch>DENY</onMatch>-->
+            <!--没有匹配到就允许-->
+            <onMismatch>ACCEPT</onMismatch>
+        </filter>
+        <File>${logback.logDir}/service-pay-third.log</File>
+        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
+            <FileNamePattern>${logback.logDir}/info.%d{yyyy-MM-dd}.%i.log.gz</FileNamePattern>
+            <!-- 单个日志文件最多 50MB -->
+            <maxFileSize>10MB</maxFileSize>
+            <!--只保留最近10天的日志-->
+            <maxHistory>30</maxHistory>
+            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
+            <totalSizeCap>1GB</totalSizeCap>
+        </rollingPolicy>
+        <!--日志输出编码格式化-->
+        <encoder>
+            <charset>UTF-8</charset>
+            <pattern>%d [%t] %-5level %logger{36}.%M\(%file:%line\) - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="errorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>ERROR</level>
+        </filter>
+        <!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
+            如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
+            的日志改名为今天的日期。即,<File> 的日志都是当天的。
+        -->
+        <File>${logback.logDir}/error.log</File>
+        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
+            <FileNamePattern>${logback.logDir}/error.%d{yyyy-MM-dd}.%i.log.gz</FileNamePattern>
+            <!-- 单个日志文件最多 100MB -->
+            <maxFileSize>20MB</maxFileSize>
+            <!--只保留最近30天的日志-->
+            <maxHistory>10</maxHistory>
+            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
+            <!--<totalSizeCap>1GB</totalSizeCap>-->
+        </rollingPolicy>
+        <!--日志输出编码格式化-->
+        <encoder>
+            <charset>UTF-8</charset>
+            <pattern>%d [%t] %-5level %logger{36}.%M\(%file:%line\) - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <root level="info">
+        <appender-ref ref="console"/>
+        <appender-ref ref="infoLog"/>
+        <appender-ref ref="errorLog"/>        
+    </root>
+    
+    <logger name="com.cow" level="info" additivity="false">
+        <appender-ref ref="infoLog"/>
+    </logger>
+</Configuration>

+ 30 - 0
src/main/resources/mybatis/mybatis-config.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
+        <configuration>    
+        <!-- 全局参数 -->    
+        <settings>        
+                <!-- 使全局的映射器启用或禁用缓存。 -->        
+                <setting name="cacheEnabled" value="true"/>        
+                <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->        
+                <setting name="lazyLoadingEnabled" value="true"/>        
+                <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->        
+                <setting name="aggressiveLazyLoading" value="true"/>        
+                <!-- 是否允许单条sql 返回多个数据集  (取决于驱动的兼容性) default:true -->        
+                <setting name="multipleResultSetsEnabled" value="true"/>        
+                <!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->        
+                <setting name="useColumnLabel" value="true"/>        
+                <!-- 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。  default:false  -->        
+                <setting name="useGeneratedKeys" value="true"/>        
+                <!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分  FULL:全部  -->        
+                <setting name="autoMappingBehavior" value="PARTIAL"/>        
+                <!-- 这是默认的执行类型  (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新)  -->        
+                <setting name="defaultExecutorType" value="SIMPLE"/>        
+                <!-- 使用驼峰命名法转换字段。 -->        
+                <setting name="mapUnderscoreToCamelCase" value="true"/>        
+                <!-- 设置本地缓存范围 session:就会有数据的共享  statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->        
+                <setting name="localCacheScope" value="SESSION"/>        
+                <!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER,插入空值时不需要指定类型 -->        
+                <setting name="jdbcTypeForNull" value="NULL"/>    
+                <setting name="logImpl" value="STDOUT_LOGGING" /> 
+         </settings>    
+
+</configuration>