Browse Source

短信直接阿里云平台

更新sql
dev
wangqing 4 years ago
parent
commit
68bd4caeb5
  1. 2
      doc/v2.1.0.sql
  2. 1
      tduck-api/src/main/resources/application-dev.yml
  3. 49
      tduck-api/src/main/resources/application-prod.yml
  4. 5
      tduck-common/pom.xml
  5. 77
      tduck-common/src/main/java/com/tduck/cloud/common/sms/AliyunSmsServiceImpl.java
  6. 32
      tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsPlatformConfig.java
  7. 47
      tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsPlatformProperties.java
  8. 10
      tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsService.java
  9. 35
      tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsTypeEnum.java
  10. 31
      tduck-common/src/main/java/com/tduck/cloud/common/sms/TencentSmsServiceImpl.java

2
doc/v2.1.0.sql

@ -1,6 +1,6 @@
ALTER TABLE `tduck`.`pr_user_project_result` ALTER TABLE `tduck`.`pr_user_project_result`
ADD COLUMN `wx_open_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '微信openId' AFTER `complete_time`, ADD COLUMN `wx_open_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '微信openId' AFTER `complete_time`,
ADD COLUMN `wx_user_info` json NULL COMMENT '微信用户信息' AFTER `wx_open_id`, ADD COLUMN `wx_user_info` json NULL COMMENT '微信用户信息' AFTER `wx_open_id`;
ALTER TABLE `tduck`.`pr_user_project_setting` ALTER TABLE `tduck`.`pr_user_project_setting`
ADD COLUMN `is_wx_write_once` tinyint(1) NULL AFTER `is_wx_write`; ADD COLUMN `is_wx_write_once` tinyint(1) NULL AFTER `is_wx_write`;

1
tduck-api/src/main/resources/application-dev.yml

@ -44,6 +44,7 @@ platform:
bucketName: tduck-cloud bucketName: tduck-cloud
domain: https://qiniu.smileyi.top domain: https://qiniu.smileyi.top
sms: sms:
type: 1 # 短信平台类型
secretId: mpw:EvC1LR0eGdzeQzkuO7fhEazxGtmdue8FJDzSA1l+gICuOUEDXI8zcjK+VXB2aWKS secretId: mpw:EvC1LR0eGdzeQzkuO7fhEazxGtmdue8FJDzSA1l+gICuOUEDXI8zcjK+VXB2aWKS
secretKey: mpw:W3kvWxvHdgUJPAwqR6mwpfMoQMerAYcxZGHwJc259lK3m+jzceGuu0Tgnx++02Bk secretKey: mpw:W3kvWxvHdgUJPAwqR6mwpfMoQMerAYcxZGHwJc259lK3m+jzceGuu0Tgnx++02Bk
appId: 1400461467 appId: 1400461467

49
tduck-api/src/main/resources/application-prod.yml

@ -1,9 +1,9 @@
spring: spring:
datasource: datasource:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
url: url: jdbc:mysql://127.0.0.1:3306/tduck?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&tinyInt1isBit=false
username: username: tduck
password: password: tduck001
type: com.zaxxer.hikari.HikariDataSource type: com.zaxxer.hikari.HikariDataSource
hikari: hikari:
minimum-idle: 5 minimum-idle: 5
@ -14,8 +14,8 @@ spring:
max-lifetime: 1800000 max-lifetime: 1800000
connection-test-query: SELECT 1 FROM DUAL connection-test-query: SELECT 1 FROM DUAL
redis: redis:
database: 8 database: 0
host: host: 127.0.0.1
port: 6379 port: 6379
password: password:
timeout: 6000ms # 连接超时时长(毫秒) timeout: 6000ms # 连接超时时长(毫秒)
@ -26,9 +26,9 @@ spring:
max-idle: 10 # 连接池中的最大空闲连接 max-idle: 10 # 连接池中的最大空闲连接
min-idle: 5 # 连接池中的最小空闲连接 min-idle: 5 # 连接池中的最小空闲连接
mail: mail:
host: host: smtp.163.com
username: username: test@163.com # 邮箱账号
password: password: DSXFPX24XOBURMDY #邮箱授权码
logging: logging:
level: level:
@ -42,29 +42,32 @@ platform:
appId: appId:
secret: secret:
oss: oss:
ossType: 1 ossType: 3 #本地存储
endpoint: 12 endpoint:
accessKeyId: accessKeyId:
accessKeySecret: accessKeySecret:
bucketName: bucketName:
domain: domain: https://demo.tduckapp.com/profile/ #提供访问的域名
upload-folder: /home/tduck/profile #文件存放的位置
access-path-pattern: /profile/** # 文件访问路径前缀 这里更改domain也需要更改
sms: sms:
secretId: type: 1 # 短信平台类型
secretKey: secretId: Ga2AIryi8174KXz #短信秘钥
secretKey: uHSpKfjtadadaezjwtN6B0dvbelv #短信秘钥
appId: appId:
sign: sign: tduck #短信签名
validateCodeTemplateId: validateCodeTemplateId: SMS_219865038 #验证码模板
retrievePwdValidateCodeTemplateId: retrievePwdValidateCodeTemplateId: SMS_219865039 # 找回密码模板
front: front:
baseUrl: https://tduck.smileyi.top/ baseUrl: https://demo.tduckapp.com/
resetPwdUrl: https://tduck.smileyi.top/forget/password?code={}&email={} resetPwdUrl: https://demo.tduckapp.com/forget/password?code={}&email={}
updateEmailUrl: https://localhost:8888/account/forget/validate?type=updateEmail&code={}&email={} updateEmailUrl: https://demo.tduckapp.com/account/forget/validate?type=updateEmail&code={}&email={}
wx: wx:
mp: mp:
configs: configs:
- appId: - appId: #公众号appId
secret: secret: #公众号秘钥
token: token: dHClTzEAcayUX0Jyy9TwBp89QrdWvvZZ
aesKey: aesKey: 3aNsbtc8wdx92M14YszvQSU4zksx9M1Gl8k655vYOLB

5
tduck-common/pom.xml

@ -73,5 +73,10 @@
<groupId>com.tencentcloudapi</groupId> <groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId> <artifactId>tencentcloud-sdk-java</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>2.0.4</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

77
tduck-common/src/main/java/com/tduck/cloud/common/sms/AliyunSmsServiceImpl.java

@ -0,0 +1,77 @@
package com.tduck.cloud.common.sms;
import cn.hutool.core.util.StrUtil;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.teaopenapi.models.Config;
import com.google.common.collect.ImmutableMap;
import com.tduck.cloud.common.util.JsonUtils;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.util.Map;
/**
* @author : smalljop
* @description : 腾讯云短信
* @create : 2020-12-15 10:33
**/
@Data
@Slf4j
public class AliyunSmsServiceImpl extends SmsService {
private Client client;
public AliyunSmsServiceImpl(SmsPlatformProperties properties) {
Config config = new Config()
// 您的AccessKey ID
.setAccessKeyId(properties.getSecretId())
// 您的AccessKey Secret
.setAccessKeySecret(properties.getSecretKey());
// 访问的域名
config.endpoint = "dysmsapi.aliyuncs.com";
try {
client = new Client(config);
this.properties = properties;
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean sendSms(String phoneNumber, String templateId, String... templateParams) {
Map<String, Object> params = ImmutableMap.of("code", templateParams);
// 1.发送短信
SendSmsRequest sendReq = new SendSmsRequest()
.setPhoneNumbers(phoneNumber)
.setSignName(properties.getSign())
.setTemplateCode(templateId)
.setTemplateParam(JsonUtils.objToJson(params));
SendSmsResponse sendResp = null;
try {
sendResp = client.sendSms(sendReq);
} catch (Exception e) {
e.printStackTrace();
}
String code = sendResp.body.code;
if (!StrUtil.equals(code, "OK")) {
return false;
}
return true;
}
@Override
public boolean sendValidateSms(String phoneNumber, String... templateParams) {
this.sendSms(phoneNumber, properties.getValidateCodeTemplateId(), templateParams);
return true;
}
@Override
public boolean sendRetrievePwdValidateSms(String phoneNumber, String... templateParams) {
this.sendSms(phoneNumber, properties.getValidateCodeTemplateId(), templateParams);
return false;
}
}

32
tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsPlatformConfig.java

@ -0,0 +1,32 @@
package com.tduck.cloud.common.sms;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author : wangqing
* @description : 短信平台配置
* @create : 2021/07/19 10:59
**/
@Configuration
@RequiredArgsConstructor
public class SmsPlatformConfig {
private final SmsPlatformProperties properties;
@Bean
public SmsService xssFilterRegistration() {
SmsService smsService = null;
switch (properties.getType()) {
case ALIYUN:
smsService = new AliyunSmsServiceImpl(properties);
break;
case TENCENT_CLOUD:
smsService = new TencentSmsServiceImpl(properties);
break;
}
return smsService;
}
}

47
tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsPlatformProperties.java

@ -0,0 +1,47 @@
package com.tduck.cloud.common.sms;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* 短信配置类
*
* @author smalljop
*/
@Data
@Configuration
@ConfigurationProperties(prefix = "platform.sms")
public class SmsPlatformProperties {
/**
* secretId
*/
private String secretId;
private SmsTypeEnum type;
/**
* 秘钥
*/
private String secretKey;
/**
* appId 腾讯云使用
*/
private String appId;
/**
* 短信签名 tduck 需要去短信平台申请
*/
private String sign;
/**
* 验证码模板Id
*/
private String validateCodeTemplateId;
/**
* 找回密码验证码
*/
private String retrievePwdValidateCodeTemplateId;
}

10
tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsService.java

@ -5,7 +5,9 @@ package com.tduck.cloud.common.sms;
* @description : 短信服务 * @description : 短信服务
* @create : 2020-12-15 10:30 * @create : 2020-12-15 10:30
**/ **/
public interface SmsService { public abstract class SmsService {
public SmsPlatformProperties properties;
/** /**
* 发送短信 * 发送短信
@ -15,7 +17,7 @@ public interface SmsService {
* @param templateParams 短信模板參數 * @param templateParams 短信模板參數
* @return * @return
*/ */
boolean sendSms(String phoneNumber, String templateId, String... templateParams); public abstract boolean sendSms(String phoneNumber, String templateId, String... templateParams);
/** /**
* 发送验证短信 * 发送验证短信
@ -24,7 +26,7 @@ public interface SmsService {
* @param templateParams 短信模板參數 * @param templateParams 短信模板參數
* @return * @return
*/ */
boolean sendValidateSms(String phoneNumber, String... templateParams); public abstract boolean sendValidateSms(String phoneNumber, String... templateParams);
/** /**
* 发送找回密码验证码 * 发送找回密码验证码
@ -33,6 +35,6 @@ public interface SmsService {
* @param templateParams * @param templateParams
* @return * @return
*/ */
boolean sendRetrievePwdValidateSms(String phoneNumber, String... templateParams); public abstract boolean sendRetrievePwdValidateSms(String phoneNumber, String... templateParams);
} }

35
tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsTypeEnum.java

@ -0,0 +1,35 @@
package com.tduck.cloud.common.sms;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;
/**
* @description: Oss类型
* @author: smalljop
* @create: 2020-02-18 23:06
**/
@Getter
public enum SmsTypeEnum {
/**
* 阿里云
*/
ALIYUN(1),
/**
* 腾讯云
*/
TENCENT_CLOUD(2);
@EnumValue
@JsonValue
public final int value;
@JsonCreator
SmsTypeEnum(int value) {
this.value = value;
}
}

31
tduck-common/src/main/java/com/tduck/cloud/common/sms/TencentSmsServiceImpl.java

@ -8,46 +8,35 @@ import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse; import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/** /**
* @author : smalljop * @author : smalljop
* @description : 腾讯云短信 * @description : 腾讯云短信
* @create : 2020-12-15 10:33 * @create : 2020-12-15 10:33
**/ **/
@ConfigurationProperties(prefix = "platform.sms")
@Component
@Slf4j @Slf4j
@Data @Data
public class TencentSmsServiceImpl implements SmsService { public class TencentSmsServiceImpl extends SmsService {
private String secretId;
private String secretKey;
private String appId;
private String sign;
private String validateCodeTemplateId;
private String retrievePwdValidateCodeTemplateId;
private SmsClient client; private SmsClient client;
@PostConstruct public TencentSmsServiceImpl(SmsPlatformProperties properties) {
public void init() {
/* 必要步骤 /* 必要步骤
* 实例化一个认证对象入参需要传入腾讯云账户密钥对 secretId secretKey * 实例化一个认证对象入参需要传入腾讯云账户密钥对 secretId secretKey
* 本示例采用从环境变量读取的方式需要预先在环境变量中设置这两个值 * 本示例采用从环境变量读取的方式需要预先在环境变量中设置这两个值
* 您也可以直接在代码中写入密钥对但需谨防泄露不要将代码复制上传或者分享给他人 * 您也可以直接在代码中写入密钥对但需谨防泄露不要将代码复制上传或者分享给他人
* CAM 密钥查询https://console.cloud.tencent.com/cam/capi * CAM 密钥查询https://console.cloud.tencent.com/cam/capi
*/ */
Credential cred = new Credential(secretId, secretKey); Credential cred = new Credential(properties.getSecretId(), properties.getSecretKey());
/* 实例化 SMS client 对象 /* 实例化 SMS client 对象
* 第二个参数是地域信息可以直接填写字符串 ap-guangzhou或者引用预设的常量 */ * 第二个参数是地域信息可以直接填写字符串 ap-guangzhou或者引用预设的常量 */
client = new SmsClient(cred, "ap-guangzhou"); client = new SmsClient(cred, "ap-guangzhou");
this.properties = properties;
} }
@Override @Override
public boolean sendSms(String phoneNumber, String templateId, String... templateParams) { public boolean sendSms(String phoneNumber, String templateId, String... templateParams) {
/* 填充请求参数这里 request 对象的成员变量即对应接口的入参 /* 填充请求参数这里 request 对象的成员变量即对应接口的入参
@ -58,10 +47,10 @@ public class TencentSmsServiceImpl implements SmsService {
* sms helperhttps://cloud.tencent.com/document/product/382/3773 */ * sms helperhttps://cloud.tencent.com/document/product/382/3773 */
SendSmsRequest req = new SendSmsRequest(); SendSmsRequest req = new SendSmsRequest();
/* 短信应用 ID: 在 [短信控制台] 添加应用后生成的实际 SDKAppID,例如1400006666 */ /* 短信应用 ID: 在 [短信控制台] 添加应用后生成的实际 SDKAppID,例如1400006666 */
req.setSmsSdkAppid(appId); req.setSmsSdkAppid(properties.getAppId());
/* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名,可登录 [短信控制台] 查看签名信息 */ /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名,可登录 [短信控制台] 查看签名信息 */
req.setSign(sign); req.setSign(properties.getSign());
/* 模板 ID: 必须填写已审核通过的模板 ID,可登录 [短信控制台] 查看模板 ID */ /* 模板 ID: 必须填写已审核通过的模板 ID,可登录 [短信控制台] 查看模板 ID */
req.setTemplateID(templateId); req.setTemplateID(templateId);
@ -90,13 +79,13 @@ public class TencentSmsServiceImpl implements SmsService {
@Override @Override
public boolean sendValidateSms(String phoneNumber, String... templateParams) { public boolean sendValidateSms(String phoneNumber, String... templateParams) {
this.sendSms(phoneNumber, validateCodeTemplateId, templateParams); this.sendSms(phoneNumber, properties.getValidateCodeTemplateId(), templateParams);
return true; return true;
} }
@Override @Override
public boolean sendRetrievePwdValidateSms(String phoneNumber, String... templateParams) { public boolean sendRetrievePwdValidateSms(String phoneNumber, String... templateParams) {
this.sendSms(phoneNumber, retrievePwdValidateCodeTemplateId, templateParams); this.sendSms(phoneNumber, properties.getRetrievePwdValidateCodeTemplateId(), templateParams);
return false; return false;
} }
} }

Loading…
Cancel
Save