SpringBoot は Tencent Cloud SMS サービスを統合します
序文
現在、成熟したソフトウェアには、基本的に SMS 検証コードを送信するシナリオがあると言えます。たとえば、次のようなシナリオです。
- ユーザーは携帯電話番号で登録します
- ユーザーはSMS認証コードを使用してログインします
- ユーザーがパスワードを忘れた場合は、携帯電話の認証コードを送信してパスワードをリセットします
- 携帯電話番号を変更する
- パスワードを変更する
上記のシナリオでは、SMS サービスを統合する必要があります。現在、Tencent Cloud、Alibaba Cloud など、多くの SMS サービスがあります。
この記事では、SpringBoot を使用して Tencent Cloud の SMS サービスを統合します。
統合を開始する
準備段階
まず Tencent Cloud アカウントを登録し、Tencent Cloud の製品で SMS を検索する必要があります。
対応する SMS パッケージから選択できます。新規ユーザーの場合は、一定数の無料 SMS メッセージがあります。次に、SMS コンソール ページに入ります。まずSMS 署名を
作成する必要があります。ここには、実際の状況に応じて署名の目的、署名の種類、署名の内容が入力されます。注: 署名の内容は、SMS 認証コード [] の角かっこ内の内容です。たとえば、[xxx] 1234 は認証コードです。5 分以内に入力してください。その署名コンテンツは xxx です。入力後、「OK」をクリックします。署名管理では、作成したばかりの SMS 署名を確認できます。表示ステータスがApprovedに変わると、署名を使用できるようになります。次に、SMS のテンプレートを作成する必要があります。テキスト テンプレートを作成するオプションを選択し、実際の状況に応じて入力します。入力して確認します。このうち、SMS コンテンツ部分の {1}{2} などの変数パラメータは動的パラメータであり、コード内で Tencent Cloud SMS サービスをリクエストするときに保持する必要があります。作成されたテンプレートのステータスは、合格し、使用できることを示します。
コーディング段階
pomファイル
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.junwei</groupId>
<artifactId>smsdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>smsdemo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<qcloudsms.version>1.0.6</qcloudsms.version>
<lombok.versino>1.18.8</lombok.versino>
<httpclient.version>4.5.9</httpclient.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.github.qcloudsms</groupId>
<artifactId>qcloudsms</artifactId>
<version>${qcloudsms.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.versino}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${httpclient.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
アプリケーション.yml
注: Redis キャッシュ データベースが必要です
server:
port: 9016
spring:
application:
name: sms-service
redis:
host: 127.0.0.1
port: 6379
smsconfig:
appId: 腾讯云短信应用id
appkey: 腾讯云短信应用key
smsSign: 腾讯云创建的短信签名
templateid: 腾讯云短信模板id
invalidtime: 验证码失效时间
# redis存储前缀,根据不同类型做区分
phone-prefix: LOGIN,REGIST,FORGET_PASSWORD,UPDATE_MOBILE,UPDATE_PASSWORD,WX_UN_TYING,UPDATE_NEW_MOBILE
logging:
level:
root: info
上記の構成が成功すると、SMS 署名と SMS テンプレート ID が表示されます。Tencent Cloud AppId と AppKey は次のとおりです。
コントローラ
@RestController
@RequestMapping("sms")
public class SmsController {
@Autowired
private SmsService smsService;
@PostMapping("send")
public Result send(@RequestBody SendSmsDto sendSmsDto) {
smsService.sendSmsCode(sendSmsDto);
return Result.success("");
}
@PostMapping("verify")
public Result verify(@RequestBody VerifyCodeDto verifyCodeDto) {
smsService.verifyCode(verifyCodeDto);
return Result.success("");
}
}
SmsConfig
@Configuration
public class SmsConfig {
/**
* 初始化主账号名称
**/
@Value("${smsconfig.appkey}")
private String APP_KEY;
/**
* 初始化应用ID
**/
@Value("${smsconfig.appId}")
private int APP_ID;
@Bean
public SmsSingleSender ssender() {
return new SmsSingleSender(APP_ID, APP_KEY);
}
}
サービス実装
@Service
@Slf4j
public class SmsServiceImpl implements SmsService {
@Autowired
private SmsSingleSender smsSingleSender;
@Autowired
private RedisUtil redisUtil;
/**
* 短信模板ID
**/
@Value("${smsconfig.templateid}")
private int TEMPLATE_ID;
/**
* 短信签名内容
*/
@Value("${smsconfig.smsSign}")
private String SMS_SIGN;
@Value("${smsconfig.invalidtime}")
private String INVALID_TIME;
@Value("${smsconfig.phone-prefix}")
private String PHONE_PREFIX;
@Override
public void sendSmsCode(SendSmsDto sendSmsDto) {
// 可以在发送验证码之前对当前手机号做一些验证,如该手机号是否注册过
// 为了防止短信轰炸可以根据业务需求在此做一些限制
String code = SmsUtil.getCode();
try {
ArrayList<String> params = new ArrayList<>();
params.add(code);
params.add(INVALID_TIME);
SmsSingleSenderResult senderResult = smsSingleSender
.sendWithParam("86", sendSmsDto.getMobile(),
TEMPLATE_ID, params, SMS_SIGN, "", "");
int statusCode = senderResult.result;
String statusMsg = senderResult.errMsg;
log.info("发送短信,腾讯云返回状态码:" + statusCode);
log.info("发送短信,腾讯云返回信息:" + statusMsg);
// 过于频繁
if (Constants.SEND_SMS_CODE_FREQUENT == statusCode) {
throw new SmsException(R.USER_LOGIN_ERROR3, "");
}
// 达到上限
if (Constants.SEND_SMS_CODE_UPPER == statusCode) {
throw new SmsException(R.USER_CODE_TOOMANY, "");
}
if (Constants.SEND_SMS_CODE_SUCCESS != statusCode) {
throw new SmsException(R.sms_send_error, "");
}
if (!redisUtil.setCacheObject(SmsUtil.map.get(sendSmsDto.getType()) + sendSmsDto.getMobile(),
code, 60 * Integer.parseInt(INVALID_TIME))) {
throw new SmsException(R.sms_send_error, "");
}
} catch (Exception e) {
throw new SmsException(R.sms_send_error, "");
}
}
@Override
public void verifyCode(VerifyCodeDto verifyCodeDto) {
String redisCode = (String) redisUtil.getCacheObject(SmsUtil.map
.get(verifyCodeDto.getType()) + verifyCodeDto.getMobile());
AssertUtil.isNull(redisCode, R.USER_LOGIN_ERROR4);
if (redisCode.equals(verifyCodeDto.getCode())) {
redisUtil.delete(SmsUtil.map.get(verifyCodeDto.getType()) + verifyCodeDto.getMobile());
} else {
throw new SmsException(R.USER_CODE_ERROR, "");
}
}
}
記事にはコードの重要な部分のみが示されています。詳細なコードが必要な場合は、ウェアハウスを複製してください: SpringBoot は Tencent Cloud SMS サービスを統合します
機能テスト段階
ここでは、Postman を使用してインターフェイスをテストします。
最初にテストするのは、SMS 検証コード送信インターフェイスです。
インターフェイスとパラメータ設定に従って、ここではポスト リクエスト メソッドが使用され、携帯電話番号と SMS 検証コード タイプの 2 つのパラメータを渡す必要があります。テストリクエストは成功しました。
送信は成功し、携帯電話は確認コードを受信します。
次に、検証検証コード インターフェイスをテストします。
インターフェイスとパラメーターの設定に従って、ここではポスト リクエスト メソッドが使用され、携帯電話番号、受信した SMS 検証コード、およびメッセージの種類の 3 つのパラメーターを渡す必要があります。 SMS 認証コードがあり、認証は成功しました。
これまでのところ、SMS サービスは統合されており、SMS の送信前または送信後にビジネス ニーズに応じて対応する処理を実行できます。
最後に、詳細なコードの git アドレスが提供されます。https://gitee.com/junweiw/tx_send_sms.git