Skip to content

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;
}