SpringBoot は Tencent Cloud SMS サービスを統合します

序文

現在、成熟したソフトウェアには、基本的に SMS 検証コードを送信するシナリオがあると言えます。たとえば、次のようなシナリオです。

  1. ユーザーは携帯電話番号で登録します
  2. ユーザーはSMS認証コードを使用してログインします
  3. ユーザーがパスワードを忘れた場合は、携帯電話の認証コードを送信してパスワードをリセットします
  4. 携帯電話番号を変更する
  5. パスワードを変更する

上記のシナリオでは、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

おすすめ

転載: blog.csdn.net/wFitting/article/details/106242142