sms
这里介绍一下 sms 的使用。
功能介绍
主要包含在 wmeimob-spring-boot-starter-sms
jar 中。
支持的平台有:
引入公共依赖:
xml
<dependency>
<groupId>com.wmeimob.fastboot</groupId>
<artifactId>wmeimob-spring-boot-starter-sms</artifactId>
</dependency>
公共配置项:
yml
sms:
smsType: xxx # 类型
accessKeyId: xxx #标识用户
accessKeySecret: xxx #用户的密钥
configs:
###场景值(根据业务场景自定义)
MOBILE_LOGIN:
sign: 登录验证 #短信签名
template-code: xxx #模板编号
timeout: 60 #流控时间(秒),流控时间内不能重新发送
expire: 60 #验证码有效时间(秒)
length: 6 #验证码长度
enabledTest: false #启用测试
阿里云
再引入阿里云依赖:
xml
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
</dependency>
填写好公共配置项即可。
腾讯云
再引入腾讯云依赖:
xml
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
</dependency>
除了填写公共配置项外,还需要再填写:
yml
region: xxx # region
smsSdkAppid: xxx # smsSdkAppid
华为云
再引入华为云依赖:
xml
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpasyncclient</artifactId>
</dependency>
除了填写公共配置项外,还需要再填写:
yml
extend:
{ url: "" }, #接入地址+接口访问URI
{ sender: "" } #国内短信签名通道号或国际/港澳台短信通道号
七牛云
暂未遇到有项目在使用,暂时不补充
自定义 spi 扩展
如果使用自定义 spi 扩展,无需引入任何依赖,只需要更改公共配置的 smsType 为自定义 spi 扩展即可。如果上述提供的几种方式不满足的话,可以通过 spi 方式来扩展。此处基于 spring spi 扩展机制来实现。
常见问题
- 特定环境发送开启
针对特定场景值通过 enableTest 来控制是否开启发送
yml
configs:
###场景值(根据业务场景自定义)
MOBILE_LOGIN:
sign: 登录验证 #短信签名
enabledTest: false #启用测试
- 其他控制
针对不同场景值,可以进行如下控制:
yml
sms:
configs:
###场景值(根据业务场景自定义)
MOBILE_LOGIN:
sign: 登录验证 #短信签名
timeout: 60 #流控时间(秒),流控时间内不能重新发送
expire: 60 #验证码有效时间(秒)
length: 6 #验证码长度
所有配置属性
txt
/**
* sms 类型 (qiniu:七牛 aliyun:阿里云 qcloud:腾讯云, huawei:华为云, custom:spi)
*/
smsType;
/**
* accessKeyId
*/
accessKeyId;
/**
* accessKeySecret
*/
accessKeySecret;
/**
* 腾讯 region
*/
region;
/**
* 腾讯SmsSdkAppid
*/
smsSdkAppid;
/**
* 扩展 map 配置
*/
extend;
/**
* 场景值 map 配置
*/
configs
sign
templateCode
length = # 默认生成验证码的长度为6
timeout = # 默认流控为6秒
expire = # 默认过期300秒
enabledTest # 默认 false
与标品的集成
java
@Api(tags = {"短信服务"})
@RestController
@RequestMapping("/api/sms")
public class SmsController extends BaseController {
private final SmsSendHandler smsSendHandler;
@ApiOperation(value = "发送短信验证码")
@GetMapping("sendCode")
public JsonResult<Void> sendCode(SmsScene scene, String mobile) {
AssertUtil.notNull(scene, "验证码场景值不能为空");
AssertUtil.notEmpty(mobile, "手机号不能为空");
this.smsSendHandler.sendCode(scene.name(), mobile);
return JsonResult.ok();
}
}
场景值定义:
java
/**
* 短信场景值
*
* @author mjyang
* @date 2022/4/19 10:39
*/
@Getter
@RequiredArgsConstructor
@ApiModel(description = "短信场景值")
public enum SmsScene {
/**
* 后台商户注册
*/
STORE_REG(1),
/**
* 后台商户忘记密码
*/
STORE_FORGOT(2),
/**
* 小程序会员登录
*/
MEM_LOGIN(4),
/**
* 小程序修改密码
*/
WECHAT_MODIFY_PASSWORD(8),
/**
* 小程序更换绑定手机号
*/
WECHAT_MOBILE_CHANGE(16),
/**
* 手机号登陆
*/
MOBILE_LOGIN(100);
private final Integer value;
}