first commit
This commit is contained in:
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