阿里雲短信開箱即用

簡介

使用SpringBoot自動裝配簡化對接阿里雲短信過程。html

小工具一枚,歡迎使用和Star支持,如使用過程當中碰到問題,能夠提出Issue,我會盡力完善該Starter。java

版本基礎

aliyun-java-sdk-core:4.1.0git

如何使用

Maven

<dependency>
  <groupId>io.github.gcdd1993</groupId>
  <artifactId>ali-sms-spring-boot-starter</artifactId>
  <version>1.0.0.RELEASE</version>
</dependency>

Gradle

compile 'io.github.gcdd1993:ali-sms-spring-boot-starter:1.0.0.RELEASE'

👉注意:須要引入Jcenter倉庫github

參數配置

application.yml舉例spring

ali:
  sms:
    domain: "dysmsapi.aliyuncs.com" ## 默認dysmsapi.aliyuncs.com
    version: "2017-05-25" ## 默認2017-05-25
    action: "SendSms" ## 默認SendSms
    access-key:
      id: "${阿里雲短信AccessKeyId}"
      secret: "${阿里雲短信AccessKeySecret}"
    region-id: "${阿里雲短信地域}"
    sign-name: "${阿里雲短信簽名}" ## 若是不填,必須在發送方法中指定

基本使用

同步發送短信

爲了方便使用,接口上進行了方法的重載,提供5種不一樣的參數列表供選擇,你能夠自行選擇使用apache

/**
 * 同步發送短信
 * <p>
 *     參數1:使用的短信模板ID
 *     參數2:接收者的手機號,如"17602526129,17602923211"
 *     參數3:Map,key對應模板中的參數名,value對應值(這裏是使用Jackson來序列化)
 * </p>
 */
@Test
public void sendSync() {
    SmsResponse smsResponse = sendService.sendSync(TEMPLATE_ID, PHONE_NUMBER, MAP);
    Assert.assertTrue(smsResponse.isSuccess());
}

/**
 * 同步發送短信
 * <p>
 *     參數1:使用的短信模板ID
 *     參數2:接收者的手機號,如"17602526129,17602923211"
 *     參數3:要發送的短信寫入值,你能夠本身進行json的拼裝。注意要進行json的轉義,例如:"{\"code\":\"112233\"}"
 * </p>
 */
@Test
public void sendSync1() {
    SmsResponse smsResponse = sendService.sendSync(TEMPLATE_ID, PHONE_NUMBER, "{\"code\":\"112233\"}");
    Assert.assertTrue(smsResponse.isSuccess());
}

/**
 * 同步發送短信
 * <p>
 *     參數1:短信簽名,適用於同一模板須要有不一樣短信簽名的
 *     參數2:使用的短信模板ID
 *     參數3:接收者的手機號,如"17602526129,17602923211"
 *     參數4:Map,key對應模板中的參數名,value對應值(這裏是使用Jackson來序列化)
 * </p>
 */
@Test
public void sendSync2() {
    SmsResponse smsResponse = sendService.sendSync(SIGN_NAME, TEMPLATE_ID, PHONE_NUMBER, MAP);
    Assert.assertTrue(smsResponse.isSuccess());
}

/**
 * 同步發送短信
 * <p>
 *     參數1:短信簽名,適用於同一模板須要有不一樣短信簽名的
 *     參數2:使用的短信模板ID
 *     參數3:接收者的手機號,如"17602526129,17602923211"
 *     參數4:要發送的短信寫入值,你能夠本身進行json的拼裝。注意要進行json的轉義,例如:"{\"code\":\"112233\"}"
 * </p>
 */
@Test
public void sendSync3() {
    SmsResponse smsResponse = sendService.sendSync(SIGN_NAME, TEMPLATE_ID, PHONE_NUMBER, "{\"code\":\"112233\"}");
    Assert.assertTrue(smsResponse.isSuccess());
}

最後一個提供了一個參數對象來定義短信發送請求,若是不嫌麻煩,能夠使用這個。json

/**
 * 阿里雲短信請求體
 *
 * @author gaochen
 * @date 2019/6/6
 */
@Data
public class SmsRequest {

    /**
     * 接收短信的手機號碼。以英文逗號(,)分隔。
     */
    private String phoneNumbers;

    /**
     * 短信簽名名稱。請在控制檯簽名管理頁面簽名名稱一列查看。
     */
    private String signName;

    /**
     * 短信模板ID,前綴爲SMS_
     */
    private Integer templateId;

    /**
     * 阿里雲短信內容,key:短信模板中的字段名,value:短信模板字段對應值
     * 使用此字段須要{@link com.fasterxml.jackson.databind.ObjectMapper}
     */
    private Map<String, String> params;

    /**
     * json str of  {@link #getParams()}
     * 使用此字段請設置params爲Null
     */
    private String paramStr;

}

使用:api

@Test
public void sendSync4() {
    SmsRequest smsRequest = new SmsRequest();
    smsRequest.setPhoneNumbers(PHONE_NUMBER);
    smsRequest.setTemplateId(TEMPLATE_ID);
    smsRequest.setParams(MAP);
    SmsResponse smsResponse = sendService.sendSync(smsRequest);
    Assert.assertTrue(smsResponse.isSuccess());
}

異步發送短信

考慮到發短信的需求,通常來講都須要異步加持,對以上5種方法分別提供了異步接口sendAsync,使用方法基本一致,惟一不一樣的是,你能夠異步處理短信發送返回值。app

CompletableFuture<SmsResponse> smsResponse = sendService.sendAsync(TEMPLATE_ID, PHONE_NUMBER, MAP);
smsResponse.thenAcceptAsync(sr -> {
    if (sr.isSuccess()) {
        System.out.println("發短信成功");
    } else {
        System.out.println("發送到消息隊列,準備重試這次短信");
    }
});

高級使用

除了使用以上方法發送短信外,你還能夠使用官方的IAcsClient來發送短信,如dom

package io.github.gcdd1993.demo;

import com.aliyuncs.CommonRequest;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.request;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.github.gcdd1993.alisms.domain.SmsRequest;
import io.github.gcdd1993.alisms.domain.SmsResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * TODO
 *
 * @author gaochen
 * @date 2019/6/8
 */
@Service
public class SendService {

    @Autowired
    private IAcsClient acsClient;

    public SmsResponse sendSync() {
        try {
            CommonRequest request = new CommonRequest();
            request.setMethod(MethodType.POST);
            request.setDomain("dysmsapi.aliyuncs.com");
            request.setVersion("2017-05-25");
            request.setAction("SendSms");
            request.putQueryParameter("RegionId", "region");
            request.putQueryParameter("PhoneNumbers", "1771636783");
            request.putQueryParameter("SignName", "SignName");
            request.putQueryParameter("TemplateCode", "SMS_12345678");
            request.putQueryParameter("TemplateParam", "{\"code\":\"112233\"}");
            CommonResponse commonResponse = acsClient.getCommonResponse(request);

            return SmsResponse.SmsResponseBuilder.build(commonResponse);

        } catch (ClientException e) {
            log.error("send msg error.", e);
            return SmsResponse.SmsResponseBuilder.buildFail(e.getMessage());
        } catch (JsonProcessingException e) {
            log.error("write json failed.", e);
            return SmsResponse.SmsResponseBuilder.buildFail("短信參數在json序列化時出錯");
        }
    }
}

Licenses

The Apache License, Version 2.0

Issues

Issues Welcome

支持

  • Click Github to star, Thanks!

更多參考

阿里雲短信服務API參考

相關文章
相關標籤/搜索