first commit
This commit is contained in:
+33
@@ -0,0 +1,33 @@
|
||||
HELP.md
|
||||
target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**/target/
|
||||
!**/src/test/**/target/
|
||||
|
||||
### STS ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
build/
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
Vendored
BIN
Binary file not shown.
+2
@@ -0,0 +1,2 @@
|
||||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.5/apache-maven-3.9.5-bin.zip
|
||||
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar
|
||||
@@ -0,0 +1,37 @@
|
||||
CREATE TABLE qywechat_appinfo(
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
application_name VARCHAR(255) NOT NULL,
|
||||
agent_id VARCHAR(255) NOT NULL,
|
||||
phone_number VARCHAR(255) NOT NULL,
|
||||
corp_id VARCHAR(255) NOT NULL,
|
||||
corp_secret VARCHAR(255) NOT NULL,
|
||||
access_token VARCHAR(255) NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO qywechat_appinfo (application_name,agent_id,phone_number,corp_id,corp_secret,access_token)
|
||||
VALUES ('MassageBot', '1000002', '18281561650', 'ww2e0e0a2504751c38', 'hFXaFC9tsmPimP_28QV5QZrq2n8Dkz1EloUwS2jb3T8', 'febfnnerbfavrbr');
|
||||
|
||||
CREATE TABLE qywechat_url (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
phone_number VARCHAR(255) NOT NULL,
|
||||
send_text_card_message_url VARCHAR(255) NOT NULL,
|
||||
qy_wechat_get_token_url VARCHAR(255) NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO qywechat_url (phone_number,send_text_card_message_url,qy_wechat_get_token_url)
|
||||
VALUES ('18281561650','https://qyapi.weixin.qq.com/cgi-bin/message','https://qyapi.weixin.qq.com/cgi-bin/gettoken');
|
||||
|
||||
CREATE TABLE api_setting(
|
||||
id INT,
|
||||
phone_number VARCHAR(255) PRIMARY KEY,
|
||||
access_token VARCHAR(255),
|
||||
msgtype VARCHAR(255) NOT NULL,
|
||||
touser VARCHAR(255) NOT NULL,
|
||||
agentid INT NOT NULL,
|
||||
enable_duplicate_check INT NOT NULL,
|
||||
duplicate_check_interval INT NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO api_setting(id,phone_number,access_token,msgtype,touser,agentid,enable_duplicate_check,duplicate_check_interval)
|
||||
VALUES (1,'18281561650','gKGCDSgWV82XbU0H','textcard','@all',1000002,1,1800);
|
||||
|
||||
@@ -0,0 +1,308 @@
|
||||
#!/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
|
||||
#
|
||||
# https://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.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Apache Maven Wrapper startup batch script, version 3.2.0
|
||||
#
|
||||
# Required ENV vars:
|
||||
# ------------------
|
||||
# JAVA_HOME - location of a JDK home dir
|
||||
#
|
||||
# Optional ENV vars
|
||||
# -----------------
|
||||
# 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 /usr/local/etc/mavenrc ] ; then
|
||||
. /usr/local/etc/mavenrc
|
||||
fi
|
||||
|
||||
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
|
||||
JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME
|
||||
else
|
||||
JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -z "$JAVA_HOME" ] ; then
|
||||
if [ -r /etc/gentoo-release ] ; then
|
||||
JAVA_HOME=$(java-config --jre-home)
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Cygwin, ensure paths are in UNIX format before anything is touched
|
||||
if $cygwin ; then
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME=$(cygpath --unix "$JAVA_HOME")
|
||||
[ -n "$CLASSPATH" ] &&
|
||||
CLASSPATH=$(cygpath --path --unix "$CLASSPATH")
|
||||
fi
|
||||
|
||||
# For Mingw, ensure paths are in UNIX format before anything is touched
|
||||
if $mingw ; then
|
||||
[ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] &&
|
||||
JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)"
|
||||
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="$(\unset -f command 2>/dev/null; \command -v 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
|
||||
|
||||
# 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/.." || exit 1; pwd)
|
||||
fi
|
||||
# end of workaround
|
||||
done
|
||||
printf '%s' "$(cd "$basedir" || exit 1; pwd)"
|
||||
}
|
||||
|
||||
# concatenates all lines of a file
|
||||
concat_lines() {
|
||||
if [ -f "$1" ]; then
|
||||
# Remove \r in case we run on Windows within Git Bash
|
||||
# and check out the repository with auto CRLF management
|
||||
# enabled. Otherwise, we may read lines that are delimited with
|
||||
# \r\n and produce $'-Xarg\r' rather than -Xarg due to word
|
||||
# splitting rules.
|
||||
tr -s '\r\n' ' ' < "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
log() {
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
printf '%s\n' "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
BASE_DIR=$(find_maven_basedir "$(dirname "$0")")
|
||||
if [ -z "$BASE_DIR" ]; then
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR
|
||||
log "$MAVEN_PROJECTBASEDIR"
|
||||
|
||||
##########################################################################################
|
||||
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||
# This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||
##########################################################################################
|
||||
wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar"
|
||||
if [ -r "$wrapperJarPath" ]; then
|
||||
log "Found $wrapperJarPath"
|
||||
else
|
||||
log "Couldn't find $wrapperJarPath, downloading it ..."
|
||||
|
||||
if [ -n "$MVNW_REPOURL" ]; then
|
||||
wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
|
||||
else
|
||||
wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
|
||||
fi
|
||||
while IFS="=" read -r key value; do
|
||||
# Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' )
|
||||
safeValue=$(echo "$value" | tr -d '\r')
|
||||
case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;;
|
||||
esac
|
||||
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
|
||||
log "Downloading from: $wrapperUrl"
|
||||
|
||||
if $cygwin; then
|
||||
wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
|
||||
fi
|
||||
|
||||
if command -v wget > /dev/null; then
|
||||
log "Found wget ... using wget"
|
||||
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet"
|
||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||
wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
|
||||
else
|
||||
wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
|
||||
fi
|
||||
elif command -v curl > /dev/null; then
|
||||
log "Found curl ... using curl"
|
||||
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent"
|
||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||
curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
|
||||
else
|
||||
curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
|
||||
fi
|
||||
else
|
||||
log "Falling back to using Java to download"
|
||||
javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java"
|
||||
javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class"
|
||||
# For Cygwin, switch paths to Windows format before running javac
|
||||
if $cygwin; then
|
||||
javaSource=$(cygpath --path --windows "$javaSource")
|
||||
javaClass=$(cygpath --path --windows "$javaClass")
|
||||
fi
|
||||
if [ -e "$javaSource" ]; then
|
||||
if [ ! -e "$javaClass" ]; then
|
||||
log " - Compiling MavenWrapperDownloader.java ..."
|
||||
("$JAVA_HOME/bin/javac" "$javaSource")
|
||||
fi
|
||||
if [ -e "$javaClass" ]; then
|
||||
log " - Running MavenWrapperDownloader.java ..."
|
||||
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
##########################################################################################
|
||||
# End of extension
|
||||
##########################################################################################
|
||||
|
||||
# If specified, validate the SHA-256 sum of the Maven wrapper jar file
|
||||
wrapperSha256Sum=""
|
||||
while IFS="=" read -r key value; do
|
||||
case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;;
|
||||
esac
|
||||
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
|
||||
if [ -n "$wrapperSha256Sum" ]; then
|
||||
wrapperSha256Result=false
|
||||
if command -v sha256sum > /dev/null; then
|
||||
if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then
|
||||
wrapperSha256Result=true
|
||||
fi
|
||||
elif command -v shasum > /dev/null; then
|
||||
if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then
|
||||
wrapperSha256Result=true
|
||||
fi
|
||||
else
|
||||
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available."
|
||||
echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties."
|
||||
exit 1
|
||||
fi
|
||||
if [ $wrapperSha256Result = false ]; then
|
||||
echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2
|
||||
echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2
|
||||
echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
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 "$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
|
||||
|
||||
# Provide a "standardized" way to retrieve the CLI args that will
|
||||
# work with both Windows and non-Windows executions.
|
||||
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*"
|
||||
export MAVEN_CMD_LINE_ARGS
|
||||
|
||||
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||
|
||||
# shellcheck disable=SC2086 # safe args
|
||||
exec "$JAVACMD" \
|
||||
$MAVEN_OPTS \
|
||||
$MAVEN_DEBUG_OPTS \
|
||||
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
|
||||
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
|
||||
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
|
||||
@@ -0,0 +1,205 @@
|
||||
@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 https://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 Apache Maven Wrapper startup batch script, version 3.2.0
|
||||
@REM
|
||||
@REM Required ENV vars:
|
||||
@REM JAVA_HOME - location of a JDK home dir
|
||||
@REM
|
||||
@REM Optional ENV vars
|
||||
@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 keystroke 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 set title of command window
|
||||
title %0
|
||||
@REM enable echoing by 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 "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
|
||||
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\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
|
||||
|
||||
set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
|
||||
|
||||
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
|
||||
IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B
|
||||
)
|
||||
|
||||
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||
if exist %WRAPPER_JAR% (
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Found %WRAPPER_JAR%
|
||||
)
|
||||
) else (
|
||||
if not "%MVNW_REPOURL%" == "" (
|
||||
SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
|
||||
)
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Couldn't find %WRAPPER_JAR%, downloading it ...
|
||||
echo Downloading from: %WRAPPER_URL%
|
||||
)
|
||||
|
||||
powershell -Command "&{"^
|
||||
"$webclient = new-object System.Net.WebClient;"^
|
||||
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
|
||||
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
|
||||
"}"^
|
||||
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^
|
||||
"}"
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Finished downloading %WRAPPER_JAR%
|
||||
)
|
||||
)
|
||||
@REM End of extension
|
||||
|
||||
@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file
|
||||
SET WRAPPER_SHA_256_SUM=""
|
||||
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
|
||||
IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B
|
||||
)
|
||||
IF NOT %WRAPPER_SHA_256_SUM%=="" (
|
||||
powershell -Command "&{"^
|
||||
"$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^
|
||||
"If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^
|
||||
" Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^
|
||||
" Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^
|
||||
" Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^
|
||||
" exit 1;"^
|
||||
"}"^
|
||||
"}"
|
||||
if ERRORLEVEL 1 goto error
|
||||
)
|
||||
|
||||
@REM Provide a "standardized" way to retrieve the CLI args that will
|
||||
@REM work with both Windows and non-Windows executions.
|
||||
set MAVEN_CMD_LINE_ARGS=%*
|
||||
|
||||
%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 "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
|
||||
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\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%
|
||||
|
||||
cmd /C exit /B %ERROR_CODE%
|
||||
@@ -0,0 +1,79 @@
|
||||
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>3.1.6</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
<groupId>com.kimgo</groupId>
|
||||
<artifactId>wePush</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<name>wePush</name>
|
||||
<description>wePush</description>
|
||||
<properties>
|
||||
<java.version>17</java.version>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.18.30</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>jakarta.validation</groupId>
|
||||
<artifactId>jakarta.validation-api</artifactId>
|
||||
<version>3.0.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.googlecode.libphonenumber</groupId>
|
||||
<artifactId>libphonenumber</artifactId>
|
||||
<version>8.13.20</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.squareup.okhttp3</groupId>
|
||||
<artifactId>okhttp</artifactId>
|
||||
<version>4.10.0</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-boot-starter</artifactId>
|
||||
<version>3.5.4</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
|
||||
<dependency>
|
||||
<groupId>com.mysql</groupId>
|
||||
<artifactId>mysql-connector-j</artifactId>
|
||||
<version>8.1.0</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<configuration>
|
||||
<image>
|
||||
<builder>paketobuildpacks/builder-jammy-base:latest</builder>
|
||||
</image>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -0,0 +1,15 @@
|
||||
package com.kimgo.wepush;
|
||||
|
||||
import org.mybatis.spring.annotation.MapperScan;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
@MapperScan("com.kimgo.wepush.mapper")
|
||||
public class WePushApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(WePushApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.kimgo.wepush.common;
|
||||
|
||||
import com.google.i18n.phonenumbers.NumberParseException;
|
||||
import com.google.i18n.phonenumbers.PhoneNumberUtil;
|
||||
import com.google.i18n.phonenumbers.Phonenumber;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class PhoneNumberValidation {
|
||||
private final Logger logger = LoggerFactory.getLogger(PhoneNumberValidation.class);
|
||||
public boolean isValidPhoneNumber(String number) {
|
||||
PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
|
||||
try {
|
||||
Phonenumber.PhoneNumber phoneNumber = phoneNumberUtil.parse(number, "CN");
|
||||
boolean isCorrect = phoneNumberUtil.isValidNumber(phoneNumber);
|
||||
logger.info("号码:{}是一个正确的号码",number);
|
||||
return isCorrect;
|
||||
} catch (NumberParseException e) {
|
||||
logger.error("NumberParseException was thrown: ",e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.kimgo.wepush.common;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class QyWeChatGetAccessTokenApiResponse {
|
||||
long errcode;
|
||||
String errmsg;
|
||||
String access_token;
|
||||
String expires_in;
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package com.kimgo.wepush.common;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class QyWeChatSendMessageApiResponse {
|
||||
private int errcode;
|
||||
private String errmsg;
|
||||
private String msgid;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.kimgo.wepush.config;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
@Component
|
||||
public class URLConfig {
|
||||
@Value("${url.sendTextCardMessageUrl}")
|
||||
private String sendTextCardMessageUrl;
|
||||
|
||||
public String getSendTextCardMessageUrl(){return sendTextCardMessageUrl;}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package com.kimgo.wepush.config;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
@Component
|
||||
public class UserConfig {
|
||||
@Value("${custom.phoneNumber}")
|
||||
private String phoneNumber;
|
||||
public String getPhoneNumber(){return phoneNumber;}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.kimgo.wepush.controller;
|
||||
|
||||
import com.kimgo.wepush.model.CallInfo;
|
||||
import com.kimgo.wepush.response.ServerResponseEntity;
|
||||
import com.kimgo.wepush.service.CallService;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.slf4j.Logger;
|
||||
import jakarta.validation.Valid;
|
||||
@RestController
|
||||
@Validated
|
||||
@RequestMapping(value = "/api",method = RequestMethod.POST)
|
||||
public class CallerController {
|
||||
private final Logger logger = LoggerFactory.getLogger(CallerController.class);
|
||||
@Autowired
|
||||
private CallService callService;
|
||||
@PostMapping("/call")
|
||||
public ServerResponseEntity receiveCall(@RequestHeader("accessToken") String accessToken,
|
||||
@RequestBody @Valid CallInfo callInfo) {
|
||||
logger.info("CallInfoO: {}",callInfo.toString());
|
||||
if(accessToken == null){
|
||||
return ServerResponseEntity.fail("accessToken cannot be empty.");
|
||||
}
|
||||
return callService.getPhoneNumber(accessToken,callInfo);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.kimgo.wepush.controller;
|
||||
|
||||
import com.kimgo.wepush.model.SMSInfo;
|
||||
import com.kimgo.wepush.response.ServerResponseEntity;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import com.kimgo.wepush.service.SMSService;
|
||||
|
||||
|
||||
@RestController
|
||||
@Validated
|
||||
@RequestMapping(value = "/api",method = RequestMethod.POST)
|
||||
public class SMSController {
|
||||
private final Logger logger = LoggerFactory.getLogger(SMSController.class);
|
||||
@Autowired
|
||||
private SMSService smsService;
|
||||
@PostMapping("/sms")
|
||||
public ServerResponseEntity receiveSMS(@RequestHeader("accessToken") String accessToken,
|
||||
@RequestBody SMSInfo smsInfo) {
|
||||
|
||||
logger.info("SMSInfo: {},accessToken: {}",smsInfo.toString(),accessToken);
|
||||
if(accessToken == null){
|
||||
return ServerResponseEntity.fail("accessToken cannot be empty.");
|
||||
}
|
||||
if (smsInfo == null || !smsInfo.validateFields()) {
|
||||
return ServerResponseEntity.fail("SMS info fields must not be blank.");
|
||||
}
|
||||
return smsService.getSMSInfo(accessToken,smsInfo);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.kimgo.wepush.mapper;
|
||||
|
||||
import com.kimgo.wepush.model.ApiSetting;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* @author wangsiyuan
|
||||
* @description 针对表【api_setting】的数据库操作Mapper
|
||||
* @createDate 2023-12-05 01:25:35
|
||||
* @Entity com.kimgo.wepush.model.ApiSetting
|
||||
*/
|
||||
public interface ApiSettingMapper extends BaseMapper<ApiSetting> {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
package com.kimgo.wepush.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.kimgo.wepush.model.QyWeChatAppInfo;
|
||||
|
||||
public interface QyWeChatAppInfoMapper extends BaseMapper<QyWeChatAppInfo> {
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.kimgo.wepush.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.kimgo.wepush.model.QyWeChatURL;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
public interface QyWeChatURLMapper extends BaseMapper<QyWeChatURL> {
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.kimgo.wepush.model;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class CallInfo {
|
||||
private String phoneNumber;
|
||||
private String callTime;
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package com.kimgo.wepush.model;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@TableName(value = "qywechat_appinfo")
|
||||
public class QyWeChatAppInfo {
|
||||
/**
|
||||
*id
|
||||
*/
|
||||
@TableId(type = IdType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
/**
|
||||
*企业微信应用名
|
||||
*/
|
||||
|
||||
private String applicationName;
|
||||
|
||||
/**
|
||||
*企业微信自建应用id
|
||||
*/
|
||||
private String AgentId;
|
||||
|
||||
/**
|
||||
*企业微信绑定电话号码
|
||||
*/
|
||||
private String phoneNumber;
|
||||
|
||||
/**
|
||||
*企业微信应用corpid
|
||||
*/
|
||||
private String corpId;
|
||||
|
||||
/**
|
||||
*企业微信corpsecret
|
||||
*/
|
||||
private String corpSecret;
|
||||
|
||||
/**
|
||||
*企业微信accesstoken
|
||||
*/
|
||||
private String accessToken;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.kimgo.wepush.model;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@TableName("qywechat_url")
|
||||
public class QyWeChatURL {
|
||||
@TableId(type = IdType.AUTO)
|
||||
private Integer id;
|
||||
private String phoneNumber;
|
||||
private String sendTextCardMessageUrl;
|
||||
private String qyWechatGetTokenUrl;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package com.kimgo.wepush.model;
|
||||
|
||||
import io.micrometer.common.util.StringUtils;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@ToString
|
||||
public class SMSInfo {
|
||||
private String smsNumber;
|
||||
private String smsAcceptanceTime;
|
||||
private String smsContent;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "SMSInfo{" +
|
||||
"SMSNumber='" + smsNumber + '\'' +
|
||||
", SMSAcceptanceTime='" + smsNumber + '\'' +
|
||||
", SMSContent='" + smsNumber + '\'' +
|
||||
'}';
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证字段是否非空。
|
||||
*
|
||||
* @return 如果所有字段都非空,则返回 true,否则返回 false。
|
||||
*/
|
||||
public boolean validateFields() {
|
||||
return StringUtils.isNotBlank(smsNumber) &&
|
||||
StringUtils.isNotBlank(smsAcceptanceTime) &&
|
||||
StringUtils.isNotBlank(smsContent);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.kimgo.wepush.model;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Data
|
||||
@TableName("")
|
||||
public class TextCardMessage {
|
||||
|
||||
private String touser;
|
||||
private String msgtype;
|
||||
private long agentid;
|
||||
private TextCard textcard;
|
||||
private int enable_duplicate_check;
|
||||
private long duplicate_check_interval;
|
||||
|
||||
@Data
|
||||
public static class TextCard {
|
||||
private String title;
|
||||
private String description;
|
||||
private String url;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
package com.kimgo.wepush.request;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.kimgo.wepush.common.QyWeChatGetAccessTokenApiResponse;
|
||||
import okhttp3.HttpUrl;
|
||||
import okhttp3.OkHttpClient;
|
||||
import okhttp3.Request;
|
||||
import okhttp3.Response;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import java.io.IOException;
|
||||
|
||||
public class WeChatAPI {
|
||||
private final Logger logger = LoggerFactory.getLogger(WeChatAPI.class);
|
||||
public String getAccessToken(String corpid,String corpsecret){
|
||||
OkHttpClient client = new OkHttpClient();
|
||||
|
||||
String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";
|
||||
HttpUrl.Builder urlBuilder = HttpUrl.parse(url).newBuilder();
|
||||
urlBuilder.addQueryParameter("corpid", corpid);
|
||||
urlBuilder.addQueryParameter("corpsecret", corpsecret);
|
||||
|
||||
Request request = new Request.Builder()
|
||||
.url(urlBuilder.build())
|
||||
.build();
|
||||
|
||||
try (Response response = client.newCall(request).execute()) {
|
||||
String responseBody = response.body().string();
|
||||
logger.info("get qyWeChat AccessToken responseBody: {}", responseBody);
|
||||
|
||||
ObjectMapper objectMapper1 = new ObjectMapper();
|
||||
QyWeChatGetAccessTokenApiResponse qyWeChatGetAccessTokenApiResponse = objectMapper1.readValue(responseBody, QyWeChatGetAccessTokenApiResponse.class);
|
||||
if (qyWeChatGetAccessTokenApiResponse.getErrcode() == 0){
|
||||
logger.info("get qyWeChat AccessToken Success");
|
||||
return qyWeChatGetAccessTokenApiResponse.getAccess_token();
|
||||
} else {
|
||||
logger.error("getAccessToken error: {}",qyWeChatGetAccessTokenApiResponse.getErrmsg());
|
||||
return null;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
logger.error("getAccessToken error:",e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.kimgo.wepush.response;
|
||||
|
||||
public enum ResponseEnum {
|
||||
OK("0","ok"),
|
||||
SHOW_FAIL("-1", "fail");
|
||||
private final String code;
|
||||
private final String msg;
|
||||
|
||||
public String getMsg() {return msg;}
|
||||
|
||||
public String value() {return code;}
|
||||
|
||||
public String getCode(){return code;}
|
||||
|
||||
ResponseEnum(String code, String msg) {
|
||||
this.code = code;
|
||||
this.msg = msg;
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ResponseEnum{" + "code='" + code + '\'' + ", msg='" + msg + '\'' + "} " + super.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.kimgo.wepush.response;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class SendMessageResonse {
|
||||
String msgid;
|
||||
}
|
||||
@@ -0,0 +1,141 @@
|
||||
package com.kimgo.wepush.response;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import java.io.Serializable;
|
||||
import java.util.Objects;
|
||||
import java.time.Instant;
|
||||
|
||||
public class ServerResponseEntity <T> implements Serializable {
|
||||
private static final Logger logger = LoggerFactory.getLogger(ServerResponseEntity.class);
|
||||
/** Response status code. */
|
||||
private String code;
|
||||
|
||||
/** Response message. */
|
||||
private String msg;
|
||||
|
||||
/** Response timestamp. */
|
||||
private Long timestamp;
|
||||
|
||||
/** Response data. */
|
||||
private T data;
|
||||
|
||||
public String getMsg(){return msg;}
|
||||
public void setMsg(String msg){this.msg = msg;}
|
||||
public String getCode(){return code;}
|
||||
public void setCode(String code){this.code = code;}
|
||||
public T getData() {return data;}
|
||||
|
||||
public Long getTimestamp() {return timestamp;}
|
||||
public void setTimestamp(Long timestamp) {this.timestamp = timestamp;
|
||||
}
|
||||
public ServerResponseEntity<T> setData(T data) {
|
||||
this.data = data;
|
||||
return this;
|
||||
}
|
||||
/** Timestamp when the response is created. Defaults to current time. */
|
||||
@JsonIgnore
|
||||
public boolean isSuccess(){return Objects.equals(ResponseEnum.OK.value(),this.code);}
|
||||
@JsonIgnore
|
||||
public boolean isFail(){return Objects.equals(ResponseEnum.SHOW_FAIL.value(),this.code);}
|
||||
/**
|
||||
* Creates a success response with data.
|
||||
*
|
||||
* @param data the response data
|
||||
* @return the API response entity
|
||||
*/
|
||||
public static <T> ServerResponseEntity<T> success(T data){
|
||||
ServerResponseEntity<T> serverResponseEntity = new ServerResponseEntity<>();
|
||||
serverResponseEntity.setData(data);
|
||||
serverResponseEntity.setCode(ResponseEnum.OK.value());
|
||||
serverResponseEntity.setMsg(ResponseEnum.OK.getMsg());
|
||||
serverResponseEntity.setTimestamp(Instant.now().getEpochSecond());
|
||||
return serverResponseEntity;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a success response without data.
|
||||
*
|
||||
* @return the API response entity
|
||||
*/
|
||||
public static <T> ServerResponseEntity<T> success(){
|
||||
ServerResponseEntity<T> serverResponseEntity = new ServerResponseEntity<>();
|
||||
serverResponseEntity.setCode(ResponseEnum.OK.value());
|
||||
serverResponseEntity.getMsg();
|
||||
serverResponseEntity.setTimestamp(Instant.now().getEpochSecond());
|
||||
return serverResponseEntity;
|
||||
}
|
||||
|
||||
public static <T> ServerResponseEntity<T> success(Integer code, T data) {
|
||||
return success(String.valueOf(code), data);
|
||||
}
|
||||
|
||||
public static <T> ServerResponseEntity<T> success(String code, T data) {
|
||||
ServerResponseEntity<T> serverResponseEntity = new ServerResponseEntity<>();
|
||||
serverResponseEntity.setCode(code);
|
||||
serverResponseEntity.setData(data);
|
||||
serverResponseEntity.getMsg();
|
||||
serverResponseEntity.setTimestamp(Instant.now().getEpochSecond());
|
||||
return serverResponseEntity;
|
||||
}
|
||||
|
||||
public static <T> ServerResponseEntity<T> showFailMsg(String msg) {
|
||||
logger.error(msg);
|
||||
ServerResponseEntity<T> serverResponseEntity = new ServerResponseEntity<>();
|
||||
serverResponseEntity.setMsg(msg);
|
||||
serverResponseEntity.setTimestamp(Instant.now().getEpochSecond());
|
||||
serverResponseEntity.setCode(ResponseEnum.SHOW_FAIL.value());
|
||||
return serverResponseEntity;
|
||||
}
|
||||
|
||||
public static <T> ServerResponseEntity<T> fail(ResponseEnum responseEnum) {
|
||||
logger.error(responseEnum.toString());
|
||||
ServerResponseEntity<T> serverResponseEntity = new ServerResponseEntity<>();
|
||||
serverResponseEntity.setMsg(responseEnum.getMsg());
|
||||
serverResponseEntity.setTimestamp(Instant.now().getEpochSecond());
|
||||
serverResponseEntity.setCode(responseEnum.value());
|
||||
return serverResponseEntity;
|
||||
}
|
||||
|
||||
public static <T> ServerResponseEntity<T> fail(ResponseEnum responseEnum, T data) {
|
||||
ServerResponseEntity<T> serverResponseEntity = new ServerResponseEntity<>();
|
||||
serverResponseEntity.setMsg(responseEnum.getMsg());
|
||||
serverResponseEntity.setCode(responseEnum.value());
|
||||
serverResponseEntity.setTimestamp(Instant.now().getEpochSecond());
|
||||
serverResponseEntity.setData(data);
|
||||
return serverResponseEntity;
|
||||
}
|
||||
|
||||
public static <T> ServerResponseEntity<T> fail(Integer code, String msg, T data) {
|
||||
ServerResponseEntity<T> serverResponseEntity = new ServerResponseEntity<>();
|
||||
serverResponseEntity.setMsg(msg);
|
||||
serverResponseEntity.setCode(String.valueOf(code));
|
||||
serverResponseEntity.setData(data);
|
||||
serverResponseEntity.setTimestamp(Instant.now().getEpochSecond());
|
||||
return serverResponseEntity;
|
||||
}
|
||||
public static <T> ServerResponseEntity<T> fail(Integer code, String msg) {
|
||||
return fail(code, msg, null);
|
||||
}
|
||||
public static <T> ServerResponseEntity<T> fail(String msg) {
|
||||
return fail(-1,msg,null);
|
||||
}
|
||||
public static <T> ServerResponseEntity<T> fail(Integer code, T data) {
|
||||
ServerResponseEntity<T> serverResponseEntity = new ServerResponseEntity<>();
|
||||
serverResponseEntity.setCode(String.valueOf(code));
|
||||
serverResponseEntity.setData(data);
|
||||
serverResponseEntity.setMsg("error");
|
||||
serverResponseEntity.setTimestamp(Instant.now().getEpochSecond());
|
||||
return serverResponseEntity;
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ApiResponseEntity{" +
|
||||
"code='" + code + '\'' +
|
||||
", msg='" + msg + '\'' +
|
||||
", timestamp=" + timestamp +
|
||||
", data=" + data +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package com.kimgo.wepush.service;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.kimgo.wepush.config.UserConfig;
|
||||
import com.kimgo.wepush.mapper.ApiSettingMapper;
|
||||
import com.kimgo.wepush.model.ApiSetting;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class ApiSettingService {
|
||||
private final Logger logger = LoggerFactory.getLogger(ApiSettingService.class);
|
||||
private ApiSetting apiSetting;
|
||||
@Autowired
|
||||
private ApiSettingMapper apiSettingMapper;
|
||||
@Autowired
|
||||
private UserConfig userConfig;
|
||||
public ApiSetting getApiSetting() {
|
||||
if (apiSetting == null) {
|
||||
queryApiSetting();
|
||||
}
|
||||
return apiSetting;
|
||||
}
|
||||
private void queryApiSetting(){
|
||||
String phoneNumberToSearch = userConfig.getPhoneNumber();
|
||||
QueryWrapper<ApiSetting> wrapper = new QueryWrapper<>();
|
||||
wrapper.eq("phone_number", phoneNumberToSearch);
|
||||
logger.info("wrapper: {}",wrapper);
|
||||
ApiSetting result = apiSettingMapper.selectOne(wrapper);
|
||||
logger.info("result: {}",result);
|
||||
if (result == null){
|
||||
apiSetting = null;
|
||||
logger.error("updateAccessToken error");
|
||||
}
|
||||
apiSetting = result;
|
||||
logger.info("get apiSetting from mysql,accessToken: {}",apiSetting);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
package com.kimgo.wepush.service;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.kimgo.wepush.common.PhoneNumberValidation;
|
||||
import com.kimgo.wepush.common.QyWeChatSendMessageApiResponse;
|
||||
import com.kimgo.wepush.config.URLConfig;
|
||||
import com.kimgo.wepush.config.UserConfig;
|
||||
import com.kimgo.wepush.mapper.QyWeChatAppInfoMapper;
|
||||
import com.kimgo.wepush.model.CallInfo;
|
||||
import com.kimgo.wepush.model.TextCardMessage;
|
||||
import com.kimgo.wepush.response.SendMessageResonse;
|
||||
import com.kimgo.wepush.response.ServerResponseEntity;
|
||||
import okhttp3.OkHttpClient;
|
||||
import okhttp3.RequestBody;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import okhttp3.*;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@Service
|
||||
public class CallService {
|
||||
private final Logger logger = LoggerFactory.getLogger(CallService.class);
|
||||
|
||||
private ServerResponseEntity serverResponseEntity;
|
||||
@Autowired
|
||||
private UserConfig userConfig;
|
||||
@Autowired
|
||||
private ApiSettingService apiSettingService;
|
||||
@Autowired
|
||||
private URLConfig urlConfig;
|
||||
@Autowired
|
||||
private QyWeChatAppInfoMapper qyWeChatAppInfoMapper;
|
||||
@Autowired
|
||||
TokenService tokenService;
|
||||
public ServerResponseEntity getPhoneNumber(String accessToken, CallInfo callInfo){
|
||||
String correctAccessToken = tokenService.getApiAccessToken();
|
||||
logger.info("accessToken: {} correctAccessToken: {}",accessToken,correctAccessToken);
|
||||
if (!correctAccessToken.equals(accessToken)){
|
||||
return ServerResponseEntity.fail("Invalid accessToken");
|
||||
}
|
||||
PhoneNumberValidation phoneNumberValidation = new PhoneNumberValidation();
|
||||
String phoneNumber = callInfo.getPhoneNumber();
|
||||
String callTime = callInfo.getCallTime();
|
||||
if (!phoneNumberValidation.isValidPhoneNumber(callInfo.getPhoneNumber())){
|
||||
return ServerResponseEntity.fail("Invalid phoneNumber");
|
||||
}
|
||||
String qyAccessToken = tokenService.getAccessToken();
|
||||
QyWeChatSendMessageApiResponse qyWeChatSendMessageApiResponse = requestWithOkhttp(qyAccessToken,phoneNumber,callTime);
|
||||
int code = qyWeChatSendMessageApiResponse.getErrcode();
|
||||
if (code == 0){
|
||||
SendMessageResonse sendMessageResonse = new SendMessageResonse();
|
||||
sendMessageResonse.setMsgid(qyWeChatSendMessageApiResponse.getMsgid());
|
||||
return ServerResponseEntity.success(sendMessageResonse);
|
||||
} else {
|
||||
return ServerResponseEntity.fail("request qyWeChat error,please check server error log.");
|
||||
}
|
||||
}
|
||||
|
||||
public TextCardMessage setTextCardMessage(String phoneNumber, String callTime) {
|
||||
TextCardMessage textCardMessage = new TextCardMessage();
|
||||
textCardMessage.setTouser(apiSettingService.getApiSetting().getTouser());
|
||||
textCardMessage.setMsgtype(apiSettingService.getApiSetting().getMsgtype());
|
||||
textCardMessage.setAgentid(apiSettingService.getApiSetting().getAgentid());
|
||||
textCardMessage.setEnable_duplicate_check(apiSettingService.getApiSetting().getEnable_duplicate_check());
|
||||
textCardMessage.setDuplicate_check_interval(apiSettingService.getApiSetting().getDuplicate_check_interval());
|
||||
TextCardMessage.TextCard textCard = new TextCardMessage.TextCard();
|
||||
textCard.setTitle("新来电通知");
|
||||
textCard.setDescription("<div class='gray'>您有一通新来电</div><div class='highlight'>来电号码: " + phoneNumber + "</div><div class='highlight'>来电时间: " + callTime + "</div>如果您认识这个号码,请及时回电。如果不认识,请注意可能是垃圾电话或诈骗电话。");
|
||||
textCard.setUrl("https://kimgo.cn");
|
||||
// 将TextCard对象设置到TextCardMessage中
|
||||
textCardMessage.setTextcard(textCard);
|
||||
|
||||
logger.info("TextCardMessage: {}", textCardMessage.toString());
|
||||
|
||||
return textCardMessage;
|
||||
}
|
||||
|
||||
public QyWeChatSendMessageApiResponse requestWithOkhttp(String accessToken,String phoneNumber,String callTime){
|
||||
OkHttpClient client = new OkHttpClient();
|
||||
String url = urlConfig.getSendTextCardMessageUrl() + accessToken;
|
||||
|
||||
TextCardMessage textCardMessage = setTextCardMessage(phoneNumber,callTime);
|
||||
// 使用Jackson进行序列化
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
String jsonBody = null;
|
||||
try {
|
||||
jsonBody = objectMapper.writeValueAsString(textCardMessage);
|
||||
logger.info("jsonBody: {}",jsonBody);
|
||||
} catch (JsonProcessingException e) {
|
||||
logger.error("JSON processing error", e);
|
||||
return null;
|
||||
}
|
||||
// 构建请求体
|
||||
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonBody);
|
||||
Request request = new Request.Builder().url(url).post(body).build();
|
||||
try (Response response = client.newCall(request).execute()) {
|
||||
String responseBody = response.body().string();
|
||||
logger.info("request sendMessage api ResponseBody: {}", responseBody);
|
||||
|
||||
ObjectMapper objectMapper1 = new ObjectMapper();
|
||||
QyWeChatSendMessageApiResponse apiResponse = objectMapper1.readValue(responseBody, QyWeChatSendMessageApiResponse.class);
|
||||
|
||||
if (apiResponse.getErrcode() == 0) {
|
||||
return apiResponse;
|
||||
} else if (apiResponse.getErrcode() == 42001 || apiResponse.getErrcode() == 40014) {
|
||||
logger.info("Access token expired. Refreshing token...");
|
||||
tokenService.setAccessToken(); // 一个方法来刷新accessToken
|
||||
String newAccessToken = tokenService.getAccessToken();
|
||||
return requestWithOkhttp(newAccessToken, phoneNumber, callTime);
|
||||
} else {
|
||||
// 处理其他错误情况
|
||||
logger.error("Error: {}", apiResponse.getErrmsg());
|
||||
return apiResponse;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
logger.error("OkHttp request error", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
package com.kimgo.wepush.service;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.kimgo.wepush.config.UserConfig;
|
||||
import com.kimgo.wepush.mapper.QyWeChatAppInfoMapper;
|
||||
import com.kimgo.wepush.mapper.QyWeChatURLMapper;
|
||||
import com.kimgo.wepush.model.QyWeChatAppInfo;
|
||||
import com.kimgo.wepush.model.QyWeChatURL;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
public class QyWeChatURLService {
|
||||
private final Logger logger = LoggerFactory.getLogger(QyWeChatURLService.class);
|
||||
@Autowired
|
||||
private QyWeChatURLMapper qyWeChatURLMapper;
|
||||
@Autowired
|
||||
private UserConfig userConfig;
|
||||
private String urlName;
|
||||
private String sendTextCardMessageUrl;
|
||||
private String qyWechatGetTokenUrl;
|
||||
|
||||
public String getSendTextCardMessageUrl() {
|
||||
if (sendTextCardMessageUrl == null){
|
||||
queryLRL();
|
||||
}
|
||||
return sendTextCardMessageUrl;
|
||||
}
|
||||
private void queryLRL(){
|
||||
String phoneNumberToSearch = userConfig.getPhoneNumber();
|
||||
QueryWrapper<QyWeChatURL> wrapper = new QueryWrapper<>();
|
||||
wrapper.eq("phone_number", phoneNumberToSearch);
|
||||
QyWeChatURL result = qyWeChatURLMapper.selectOne(wrapper);
|
||||
if (result == null){
|
||||
logger.error("queryLRL error");
|
||||
}
|
||||
sendTextCardMessageUrl = result.getSendTextCardMessageUrl();
|
||||
qyWechatGetTokenUrl = result.getQyWechatGetTokenUrl();
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
package com.kimgo.wepush.service;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.kimgo.wepush.common.QyWeChatSendMessageApiResponse;
|
||||
import com.kimgo.wepush.config.URLConfig;
|
||||
import com.kimgo.wepush.model.SMSInfo;
|
||||
import com.kimgo.wepush.model.TextCardMessage;
|
||||
import com.kimgo.wepush.response.ServerResponseEntity;
|
||||
import okhttp3.*;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.kimgo.wepush.config.UserConfig;
|
||||
import java.io.IOException;
|
||||
|
||||
@Service
|
||||
public class SMSService {
|
||||
private final Logger logger = LoggerFactory.getLogger(SMSService.class);
|
||||
@Autowired
|
||||
private UserConfig userConfig;
|
||||
@Autowired
|
||||
private ApiSettingService apiSettingService;
|
||||
@Autowired
|
||||
private TokenService tokenService;
|
||||
@Autowired
|
||||
private URLConfig urlConfig;
|
||||
|
||||
public ServerResponseEntity getSMSInfo(String accessToken, SMSInfo smsInfo){
|
||||
String correctAccessToken = tokenService.getApiAccessToken();
|
||||
logger.info("accessToken: {} correctAccessToken: {}",accessToken,correctAccessToken);
|
||||
if (!correctAccessToken.equals(accessToken)){
|
||||
return ServerResponseEntity.fail("Invalid accessToken");
|
||||
}
|
||||
String qyAccessToken = tokenService.getAccessToken();
|
||||
QyWeChatSendMessageApiResponse qyWeChatSendMessageApiResponse = requestWithOkhttp(qyAccessToken,smsInfo);
|
||||
if (qyWeChatSendMessageApiResponse != null){
|
||||
return ServerResponseEntity.success(qyWeChatSendMessageApiResponse.getMsgid());
|
||||
}
|
||||
return ServerResponseEntity.fail("request qyWeChat error,please check server error log.");
|
||||
}
|
||||
|
||||
public QyWeChatSendMessageApiResponse requestWithOkhttp(String accessToken,SMSInfo smsInfo){
|
||||
OkHttpClient client = new OkHttpClient();
|
||||
String url = urlConfig.getSendTextCardMessageUrl() + accessToken;
|
||||
|
||||
TextCardMessage textCardMessage = setTextCardMessage(smsInfo);
|
||||
// 使用Jackson进行序列化
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
String jsonBody = null;
|
||||
try {
|
||||
jsonBody = objectMapper.writeValueAsString(textCardMessage);
|
||||
logger.info("jsonBody: {}",jsonBody);
|
||||
} catch (JsonProcessingException e) {
|
||||
logger.error("JSON processing error", e);
|
||||
return null;
|
||||
}
|
||||
// 构建请求体
|
||||
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonBody);
|
||||
Request request = new Request.Builder().url(url).post(body).build();
|
||||
try (Response response = client.newCall(request).execute()) {
|
||||
String responseBody = response.body().string();
|
||||
logger.info("Response: {}", responseBody);
|
||||
|
||||
ObjectMapper objectMapper1 = new ObjectMapper();
|
||||
QyWeChatSendMessageApiResponse apiResponse = objectMapper1.readValue(responseBody, QyWeChatSendMessageApiResponse.class);
|
||||
|
||||
if (apiResponse.getErrcode() == 0) {
|
||||
return apiResponse;
|
||||
} else if (apiResponse.getErrcode() == 42001 || apiResponse.getErrcode() == 40014) {
|
||||
logger.info("Access token expired. Refreshing token...");
|
||||
tokenService.setAccessToken(); // 一个方法来刷新accessToken
|
||||
String newAccessToken = tokenService.getAccessToken();
|
||||
return requestWithOkhttp(newAccessToken, smsInfo);
|
||||
} else {
|
||||
// 处理其他错误情况
|
||||
logger.error("Error: {}", apiResponse.getErrmsg());
|
||||
return apiResponse;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
logger.error("OkHttp request error", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public TextCardMessage setTextCardMessage(SMSInfo smsInfo) {
|
||||
TextCardMessage textCardMessage = new TextCardMessage();
|
||||
|
||||
textCardMessage.setTouser(apiSettingService.getApiSetting().getTouser());
|
||||
textCardMessage.setMsgtype(apiSettingService.getApiSetting().getMsgtype());
|
||||
textCardMessage.setAgentid(apiSettingService.getApiSetting().getAgentid());
|
||||
textCardMessage.setEnable_duplicate_check(apiSettingService.getApiSetting().getEnable_duplicate_check());
|
||||
textCardMessage.setDuplicate_check_interval(apiSettingService.getApiSetting().getDuplicate_check_interval());
|
||||
|
||||
TextCardMessage.TextCard textCard = new TextCardMessage.TextCard();
|
||||
textCard.setTitle("新短信通知");
|
||||
textCard.setDescription("<div class='gray'>您有一条新短信</div><div class='highlight'>短信号码: " + smsInfo.getSmsNumber() + "</div><div class='highlight'>接受短信时间: " + smsInfo.getSmsAcceptanceTime() + "</div>" + smsInfo.getSmsContent());
|
||||
textCard.setUrl("https://kimgo.cn");
|
||||
// 将TextCard对象设置到TextCardMessage中
|
||||
textCardMessage.setTextcard(textCard);
|
||||
|
||||
logger.info("TextCardMessage: {}", textCardMessage.toString());
|
||||
|
||||
return textCardMessage;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
package com.kimgo.wepush.service;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||
import com.kimgo.wepush.config.UserConfig;
|
||||
import com.kimgo.wepush.mapper.ApiSettingMapper;
|
||||
import com.kimgo.wepush.mapper.QyWeChatAppInfoMapper;
|
||||
import com.kimgo.wepush.model.QyWeChatAppInfo;
|
||||
import com.kimgo.wepush.request.WeChatAPI;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class TokenService {
|
||||
private final Logger logger = LoggerFactory.getLogger(TokenService.class);
|
||||
@Autowired
|
||||
private UserConfig userConfig;
|
||||
@Autowired
|
||||
private QyWeChatAppInfoMapper qyWeChatAppInfoMapper;
|
||||
@Autowired
|
||||
private ApiSettingMapper apiSettingMapper;
|
||||
private String accessToken;
|
||||
private String apiAccessToken;
|
||||
|
||||
public String getAccessToken() {
|
||||
if (accessToken == null) {
|
||||
updateAccessToken();
|
||||
}
|
||||
return accessToken;
|
||||
}
|
||||
|
||||
public String getApiAccessToken(){
|
||||
if (apiAccessToken == null){
|
||||
updateApiAccessToken();
|
||||
}
|
||||
return apiAccessToken;
|
||||
}
|
||||
|
||||
|
||||
public void updateAccessToken() {
|
||||
String phoneNumberToSearch = userConfig.getPhoneNumber();
|
||||
QueryWrapper<QyWeChatAppInfo> wrapper = new QueryWrapper<>();
|
||||
wrapper.eq("phone_number", phoneNumberToSearch);
|
||||
QyWeChatAppInfo result = qyWeChatAppInfoMapper.selectOne(wrapper);
|
||||
if (result == null){
|
||||
accessToken = null;
|
||||
logger.error("updateAccessToken error");
|
||||
}
|
||||
accessToken = result.getAccessToken();
|
||||
logger.info("get accessToken from mysql,accessToken: {}",accessToken);
|
||||
}
|
||||
public void setAccessToken(){
|
||||
String phoneNumberToSearch = userConfig.getPhoneNumber();
|
||||
QueryWrapper<QyWeChatAppInfo> wrapper = new QueryWrapper<>();
|
||||
wrapper.eq("phone_number", phoneNumberToSearch);
|
||||
QyWeChatAppInfo result = qyWeChatAppInfoMapper.selectOne(wrapper);
|
||||
if (result != null){
|
||||
WeChatAPI weChatAPI = new WeChatAPI();
|
||||
String accessToken1 = weChatAPI.getAccessToken(result.getCorpId(), result.getCorpSecret());
|
||||
if (accessToken1 == null){
|
||||
logger.error("accessToken1 == null");
|
||||
}
|
||||
accessToken = accessToken1;
|
||||
updateAccessTokenToMysql(accessToken,phoneNumberToSearch);
|
||||
}
|
||||
}
|
||||
|
||||
public void updateAccessTokenToMysql(String accessToken,String phoneNumber){
|
||||
UpdateWrapper<QyWeChatAppInfo> updateWrapper = new UpdateWrapper<>();
|
||||
updateWrapper.eq("phone_number", phoneNumber); // 根据 phoneNumber 更新
|
||||
updateWrapper.set("access_token", accessToken); // 设置新的 accessToken
|
||||
|
||||
int result = qyWeChatAppInfoMapper.update(null, updateWrapper);
|
||||
if (result > 0) {
|
||||
logger.info("Update successful");
|
||||
} else {
|
||||
logger.warn("Update failed: No rows affected");
|
||||
}
|
||||
}
|
||||
|
||||
public void updateApiAccessToken(){
|
||||
String phoneNumberToSearch = userConfig.getPhoneNumber();
|
||||
QueryWrapper<ApiSetting> wrapper = new QueryWrapper<>();
|
||||
wrapper.eq("phone_number", phoneNumberToSearch);
|
||||
ApiSetting result = apiSettingMapper.selectOne(wrapper);
|
||||
if (result == null){
|
||||
apiAccessToken = null;
|
||||
logger.error("updateApiAccessToken error");
|
||||
}
|
||||
apiAccessToken = result.getAccessToken();
|
||||
logger.info("get ApiAccessToken from mysql,accessToken: {}",apiAccessToken);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
custom:
|
||||
phoneNumber: "18281561650"
|
||||
accessToken: "gKGCDSgWV82XbU0H"
|
||||
touser: "@all"
|
||||
url:
|
||||
sendTextCardMessageUrl: "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="
|
||||
spring:
|
||||
datasource:
|
||||
url: jdbc:mysql://42.193.20.110:8006/qywechatpush?useSSL=false
|
||||
username: qywechatpush
|
||||
password: JSckhtke1wFdzq3E
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
mybatis-plus:
|
||||
@@ -0,0 +1,6 @@
|
||||
server:
|
||||
address: 127.0.0.1
|
||||
port: 8080
|
||||
spring:
|
||||
profiles:
|
||||
active: dev
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.kimgo.wepush;
|
||||
|
||||
import com.kimgo.wepush.service.ApiSettingService;
|
||||
import com.kimgo.wepush.service.TokenService;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
@SpringBootTest
|
||||
public class ApiSettingServiceTest {
|
||||
|
||||
@Autowired
|
||||
private ApiSettingService apiSettingService;
|
||||
@Test
|
||||
public void testQueryApiSetting(){
|
||||
apiSettingService.getApiSetting();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package com.kimgo.wepush;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.kimgo.wepush.mapper.QyWeChatAppInfoMapper;
|
||||
import com.kimgo.wepush.model.QyWeChatAppInfo;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@SpringBootTest
|
||||
public class QyWeChatAppInfoMapperTest {
|
||||
|
||||
@Autowired
|
||||
private QyWeChatAppInfoMapper qyWeChatAppInfoMapper;
|
||||
@Test
|
||||
public void testSelect() {
|
||||
System.out.println(("----- select by id test ------"));
|
||||
QyWeChatAppInfo qyWeChatAppInfo = qyWeChatAppInfoMapper.selectById("1");
|
||||
System.out.printf(qyWeChatAppInfo.toString());
|
||||
System.out.printf("test complete");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSelectByPhoneNumber() {
|
||||
System.out.println("----- select by phoneNumber test ------");
|
||||
|
||||
QueryWrapper<QyWeChatAppInfo> wrapper = new QueryWrapper<>();
|
||||
wrapper.eq("phone_number", "18281561650");
|
||||
|
||||
QyWeChatAppInfo result = qyWeChatAppInfoMapper.selectOne(wrapper);
|
||||
|
||||
// 打印结果
|
||||
if (result != null) {
|
||||
System.out.println(result);
|
||||
} else {
|
||||
System.out.println("No record found.");
|
||||
}
|
||||
|
||||
System.out.println("Test complete");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.kimgo.wepush;
|
||||
|
||||
import com.kimgo.wepush.service.QyWeChatURLService;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
@SpringBootTest
|
||||
public class QyWeChatURLServiceTest {
|
||||
private QyWeChatURLService qyWeChatURLService;
|
||||
@Test
|
||||
public void testUpdateAccessToken(){
|
||||
System.out.printf(qyWeChatURLService.getSendTextCardMessageUrl());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.kimgo.wepush;
|
||||
|
||||
import com.kimgo.wepush.service.TokenService;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@SpringBootTest
|
||||
public class TokenServiceTest {
|
||||
@Autowired
|
||||
private TokenService tokenService;
|
||||
@Test
|
||||
public void testUpdateAccessToken(){
|
||||
System.out.printf(tokenService.getAccessToken());
|
||||
}
|
||||
@Test
|
||||
public void testUpdateAccessTokenToMysql(){
|
||||
String token = "1dfeibiffekjbfe";
|
||||
String phoneNumber = "18281561650";
|
||||
tokenService.updateAccessTokenToMysql(token,phoneNumber);
|
||||
}
|
||||
@Test
|
||||
public void testSetAccessTokenToMysql(){
|
||||
tokenService.setAccessToken();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateApiAccessToken(){
|
||||
tokenService.updateApiAccessToken();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.kimgo.wepush;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
@SpringBootTest
|
||||
class WePushApplicationTests {
|
||||
|
||||
@Test
|
||||
void contextLoads() {
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user