commit 767b08a025ff7a7a7ec1035853b04e01c64b6cdc Author: wangsiyuan <2392948297@qq.com> Date: Tue Dec 5 01:39:52 2023 +0800 first commit diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..a85a00d Binary files /dev/null and b/.DS_Store differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/.gitignore @@ -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/ diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000..cb28b0e Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..5f0536e --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -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 diff --git a/db/qywecahtpush.sql b/db/qywecahtpush.sql new file mode 100644 index 0000000..856be1b --- /dev/null +++ b/db/qywecahtpush.sql @@ -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); + diff --git a/mvnw b/mvnw new file mode 100755 index 0000000..66df285 --- /dev/null +++ b/mvnw @@ -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 "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..95ba6f5 --- /dev/null +++ b/mvnw.cmd @@ -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% diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..f5e8296 --- /dev/null +++ b/pom.xml @@ -0,0 +1,79 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.1.6 + + + com.kimgo + wePush + 0.0.1-SNAPSHOT + wePush + wePush + + 17 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.projectlombok + lombok + 1.18.30 + + + jakarta.validation + jakarta.validation-api + 3.0.2 + + + com.googlecode.libphonenumber + libphonenumber + 8.13.20 + + + com.squareup.okhttp3 + okhttp + 4.10.0 + + + + com.baomidou + mybatis-plus-boot-starter + 3.5.4 + + + + com.mysql + mysql-connector-j + 8.1.0 + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + paketobuildpacks/builder-jammy-base:latest + + + + + + + diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000..7b0d367 Binary files /dev/null and b/src/.DS_Store differ diff --git a/src/main/.DS_Store b/src/main/.DS_Store new file mode 100644 index 0000000..55c1fcb Binary files /dev/null and b/src/main/.DS_Store differ diff --git a/src/main/java/.DS_Store b/src/main/java/.DS_Store new file mode 100644 index 0000000..35a54bf Binary files /dev/null and b/src/main/java/.DS_Store differ diff --git a/src/main/java/com/.DS_Store b/src/main/java/com/.DS_Store new file mode 100644 index 0000000..2111697 Binary files /dev/null and b/src/main/java/com/.DS_Store differ diff --git a/src/main/java/com/kimgo/.DS_Store b/src/main/java/com/kimgo/.DS_Store new file mode 100644 index 0000000..60cd60d Binary files /dev/null and b/src/main/java/com/kimgo/.DS_Store differ diff --git a/src/main/java/com/kimgo/wepush/.DS_Store b/src/main/java/com/kimgo/wepush/.DS_Store new file mode 100644 index 0000000..ee7d3e9 Binary files /dev/null and b/src/main/java/com/kimgo/wepush/.DS_Store differ diff --git a/src/main/java/com/kimgo/wepush/WePushApplication.java b/src/main/java/com/kimgo/wepush/WePushApplication.java new file mode 100644 index 0000000..55b3fe0 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/WePushApplication.java @@ -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); + } + +} diff --git a/src/main/java/com/kimgo/wepush/common/PhoneNumberValidation.java b/src/main/java/com/kimgo/wepush/common/PhoneNumberValidation.java new file mode 100644 index 0000000..17d714c --- /dev/null +++ b/src/main/java/com/kimgo/wepush/common/PhoneNumberValidation.java @@ -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; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/kimgo/wepush/common/QyWeChatGetAccessTokenApiResponse.java b/src/main/java/com/kimgo/wepush/common/QyWeChatGetAccessTokenApiResponse.java new file mode 100644 index 0000000..539c419 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/common/QyWeChatGetAccessTokenApiResponse.java @@ -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; +} diff --git a/src/main/java/com/kimgo/wepush/common/QyWeChatSendMessageApiResponse.java b/src/main/java/com/kimgo/wepush/common/QyWeChatSendMessageApiResponse.java new file mode 100644 index 0000000..521f6c1 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/common/QyWeChatSendMessageApiResponse.java @@ -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; +} \ No newline at end of file diff --git a/src/main/java/com/kimgo/wepush/config/URLConfig.java b/src/main/java/com/kimgo/wepush/config/URLConfig.java new file mode 100644 index 0000000..e8981e4 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/config/URLConfig.java @@ -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;} +} diff --git a/src/main/java/com/kimgo/wepush/config/UserConfig.java b/src/main/java/com/kimgo/wepush/config/UserConfig.java new file mode 100644 index 0000000..11b1357 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/config/UserConfig.java @@ -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;} +} diff --git a/src/main/java/com/kimgo/wepush/controller/CallerController.java b/src/main/java/com/kimgo/wepush/controller/CallerController.java new file mode 100644 index 0000000..e031cef --- /dev/null +++ b/src/main/java/com/kimgo/wepush/controller/CallerController.java @@ -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); + } +} + diff --git a/src/main/java/com/kimgo/wepush/controller/SMSController.java b/src/main/java/com/kimgo/wepush/controller/SMSController.java new file mode 100644 index 0000000..8d033ee --- /dev/null +++ b/src/main/java/com/kimgo/wepush/controller/SMSController.java @@ -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); + } +} \ No newline at end of file diff --git a/src/main/java/com/kimgo/wepush/mapper/ApiSettingMapper.java b/src/main/java/com/kimgo/wepush/mapper/ApiSettingMapper.java new file mode 100644 index 0000000..14e8ea8 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/mapper/ApiSettingMapper.java @@ -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 { + +} + + + + diff --git a/src/main/java/com/kimgo/wepush/mapper/QyWeChatAppInfoMapper.java b/src/main/java/com/kimgo/wepush/mapper/QyWeChatAppInfoMapper.java new file mode 100644 index 0000000..f70f9a1 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/mapper/QyWeChatAppInfoMapper.java @@ -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 { +} diff --git a/src/main/java/com/kimgo/wepush/mapper/QyWeChatURLMapper.java b/src/main/java/com/kimgo/wepush/mapper/QyWeChatURLMapper.java new file mode 100644 index 0000000..52b4e3e --- /dev/null +++ b/src/main/java/com/kimgo/wepush/mapper/QyWeChatURLMapper.java @@ -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 { +} diff --git a/src/main/java/com/kimgo/wepush/model/CallInfo.java b/src/main/java/com/kimgo/wepush/model/CallInfo.java new file mode 100644 index 0000000..91737e9 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/model/CallInfo.java @@ -0,0 +1,9 @@ +package com.kimgo.wepush.model; + +import lombok.Data; + +@Data +public class CallInfo { + private String phoneNumber; + private String callTime; +} \ No newline at end of file diff --git a/src/main/java/com/kimgo/wepush/model/QyWeChatAppInfo.java b/src/main/java/com/kimgo/wepush/model/QyWeChatAppInfo.java new file mode 100644 index 0000000..00f479a --- /dev/null +++ b/src/main/java/com/kimgo/wepush/model/QyWeChatAppInfo.java @@ -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; + +} diff --git a/src/main/java/com/kimgo/wepush/model/QyWeChatURL.java b/src/main/java/com/kimgo/wepush/model/QyWeChatURL.java new file mode 100644 index 0000000..de28d0d --- /dev/null +++ b/src/main/java/com/kimgo/wepush/model/QyWeChatURL.java @@ -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; + +} diff --git a/src/main/java/com/kimgo/wepush/model/SMSInfo.java b/src/main/java/com/kimgo/wepush/model/SMSInfo.java new file mode 100644 index 0000000..e9e607f --- /dev/null +++ b/src/main/java/com/kimgo/wepush/model/SMSInfo.java @@ -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); + } +} \ No newline at end of file diff --git a/src/main/java/com/kimgo/wepush/model/TextCardMessage.java b/src/main/java/com/kimgo/wepush/model/TextCardMessage.java new file mode 100644 index 0000000..d7d6708 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/model/TextCardMessage.java @@ -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; + } +} \ No newline at end of file diff --git a/src/main/java/com/kimgo/wepush/request/WeChatAPI.java b/src/main/java/com/kimgo/wepush/request/WeChatAPI.java new file mode 100644 index 0000000..7c407ef --- /dev/null +++ b/src/main/java/com/kimgo/wepush/request/WeChatAPI.java @@ -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; + } + } +} + diff --git a/src/main/java/com/kimgo/wepush/response/ResponseEnum.java b/src/main/java/com/kimgo/wepush/response/ResponseEnum.java new file mode 100644 index 0000000..c81b905 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/response/ResponseEnum.java @@ -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(); + } +} \ No newline at end of file diff --git a/src/main/java/com/kimgo/wepush/response/SendMessageResonse.java b/src/main/java/com/kimgo/wepush/response/SendMessageResonse.java new file mode 100644 index 0000000..8c99e18 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/response/SendMessageResonse.java @@ -0,0 +1,8 @@ +package com.kimgo.wepush.response; + +import lombok.Data; + +@Data +public class SendMessageResonse { + String msgid; +} \ No newline at end of file diff --git a/src/main/java/com/kimgo/wepush/response/ServerResponseEntity.java b/src/main/java/com/kimgo/wepush/response/ServerResponseEntity.java new file mode 100644 index 0000000..445dbbf --- /dev/null +++ b/src/main/java/com/kimgo/wepush/response/ServerResponseEntity.java @@ -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 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 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 ServerResponseEntity success(T data){ + ServerResponseEntity 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 ServerResponseEntity success(){ + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setCode(ResponseEnum.OK.value()); + serverResponseEntity.getMsg(); + serverResponseEntity.setTimestamp(Instant.now().getEpochSecond()); + return serverResponseEntity; + } + + public static ServerResponseEntity success(Integer code, T data) { + return success(String.valueOf(code), data); + } + + public static ServerResponseEntity success(String code, T data) { + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setCode(code); + serverResponseEntity.setData(data); + serverResponseEntity.getMsg(); + serverResponseEntity.setTimestamp(Instant.now().getEpochSecond()); + return serverResponseEntity; + } + + public static ServerResponseEntity showFailMsg(String msg) { + logger.error(msg); + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setMsg(msg); + serverResponseEntity.setTimestamp(Instant.now().getEpochSecond()); + serverResponseEntity.setCode(ResponseEnum.SHOW_FAIL.value()); + return serverResponseEntity; + } + + public static ServerResponseEntity fail(ResponseEnum responseEnum) { + logger.error(responseEnum.toString()); + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setMsg(responseEnum.getMsg()); + serverResponseEntity.setTimestamp(Instant.now().getEpochSecond()); + serverResponseEntity.setCode(responseEnum.value()); + return serverResponseEntity; + } + + public static ServerResponseEntity fail(ResponseEnum responseEnum, T data) { + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setMsg(responseEnum.getMsg()); + serverResponseEntity.setCode(responseEnum.value()); + serverResponseEntity.setTimestamp(Instant.now().getEpochSecond()); + serverResponseEntity.setData(data); + return serverResponseEntity; + } + + public static ServerResponseEntity fail(Integer code, String msg, T data) { + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setMsg(msg); + serverResponseEntity.setCode(String.valueOf(code)); + serverResponseEntity.setData(data); + serverResponseEntity.setTimestamp(Instant.now().getEpochSecond()); + return serverResponseEntity; + } + public static ServerResponseEntity fail(Integer code, String msg) { + return fail(code, msg, null); + } + public static ServerResponseEntity fail(String msg) { + return fail(-1,msg,null); + } + public static ServerResponseEntity fail(Integer code, T data) { + ServerResponseEntity 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 + + '}'; + } +} diff --git a/src/main/java/com/kimgo/wepush/service/ApiSettingService.java b/src/main/java/com/kimgo/wepush/service/ApiSettingService.java new file mode 100644 index 0000000..0d382fd --- /dev/null +++ b/src/main/java/com/kimgo/wepush/service/ApiSettingService.java @@ -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 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); + } +} diff --git a/src/main/java/com/kimgo/wepush/service/CallService.java b/src/main/java/com/kimgo/wepush/service/CallService.java new file mode 100644 index 0000000..198ab48 --- /dev/null +++ b/src/main/java/com/kimgo/wepush/service/CallService.java @@ -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("
您有一通新来电
来电号码: " + phoneNumber + "
来电时间: " + callTime + "
如果您认识这个号码,请及时回电。如果不认识,请注意可能是垃圾电话或诈骗电话。"); + 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; + } + } +} + diff --git a/src/main/java/com/kimgo/wepush/service/QyWeChatURLService.java b/src/main/java/com/kimgo/wepush/service/QyWeChatURLService.java new file mode 100644 index 0000000..28c55bc --- /dev/null +++ b/src/main/java/com/kimgo/wepush/service/QyWeChatURLService.java @@ -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 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(); + }; +} diff --git a/src/main/java/com/kimgo/wepush/service/SMSService.java b/src/main/java/com/kimgo/wepush/service/SMSService.java new file mode 100644 index 0000000..cfdabeb --- /dev/null +++ b/src/main/java/com/kimgo/wepush/service/SMSService.java @@ -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("
您有一条新短信
短信号码: " + smsInfo.getSmsNumber() + "
接受短信时间: " + smsInfo.getSmsAcceptanceTime() + "
" + smsInfo.getSmsContent()); + textCard.setUrl("https://kimgo.cn"); + // 将TextCard对象设置到TextCardMessage中 + textCardMessage.setTextcard(textCard); + + logger.info("TextCardMessage: {}", textCardMessage.toString()); + + return textCardMessage; + } +} \ No newline at end of file diff --git a/src/main/java/com/kimgo/wepush/service/TokenService.java b/src/main/java/com/kimgo/wepush/service/TokenService.java new file mode 100644 index 0000000..5de768d --- /dev/null +++ b/src/main/java/com/kimgo/wepush/service/TokenService.java @@ -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 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 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 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 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); + } +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..8ca7728 --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -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: diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..9064036 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,6 @@ +server: + address: 127.0.0.1 + port: 8080 +spring: + profiles: + active: dev \ No newline at end of file diff --git a/src/test/java/com/kimgo/wepush/ApiSettingServiceTest.java b/src/test/java/com/kimgo/wepush/ApiSettingServiceTest.java new file mode 100644 index 0000000..69c7ef5 --- /dev/null +++ b/src/test/java/com/kimgo/wepush/ApiSettingServiceTest.java @@ -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(); + } +} diff --git a/src/test/java/com/kimgo/wepush/QyWeChatAppInfoMapperTest.java b/src/test/java/com/kimgo/wepush/QyWeChatAppInfoMapperTest.java new file mode 100644 index 0000000..88d5a24 --- /dev/null +++ b/src/test/java/com/kimgo/wepush/QyWeChatAppInfoMapperTest.java @@ -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 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"); + } +} diff --git a/src/test/java/com/kimgo/wepush/QyWeChatURLServiceTest.java b/src/test/java/com/kimgo/wepush/QyWeChatURLServiceTest.java new file mode 100644 index 0000000..cc62ce3 --- /dev/null +++ b/src/test/java/com/kimgo/wepush/QyWeChatURLServiceTest.java @@ -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()); + } +} diff --git a/src/test/java/com/kimgo/wepush/TokenServiceTest.java b/src/test/java/com/kimgo/wepush/TokenServiceTest.java new file mode 100644 index 0000000..8f01c48 --- /dev/null +++ b/src/test/java/com/kimgo/wepush/TokenServiceTest.java @@ -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(); + } +} diff --git a/src/test/java/com/kimgo/wepush/WePushApplicationTests.java b/src/test/java/com/kimgo/wepush/WePushApplicationTests.java new file mode 100644 index 0000000..0957a09 --- /dev/null +++ b/src/test/java/com/kimgo/wepush/WePushApplicationTests.java @@ -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() { + } + +}