Java实现短信发送业务

1、业务需求

发送短信功能是一个很普遍的需求,比如验证码,快递单号,通知信息一类。 而在Java中实现短信功能相对简单,只需要调用短信服务商提供的API。接下来以阿里云为例,介绍如何实现短信发送功能,其他短信服务商也是类似的操作。

2、短信发送逻辑

阿里云短信发送逻辑大致总结为:提供登录阿里云的账号(AccessKey ID)和密码(AccessKey Secret)登录后,选择对应的短信签名模版,填充对应的短信内容(模版参数),然后将短信发送到指定的手机号

签名:短信开头时【】内的公司信息

模板:短信内容的骨架,可填充对应参数

注意:阿里云短信服务申请签名主要针对企业开发,个人申请时有一定难度,在审核时会审核资质,需要上传营业执。但阿里云提供了测试签名和测试模板,开发测试时只需要获取对应的测试签名和测试模板。

  • 获取AccessKeyId和AccessKeySecret,点击头像右上角的AccessKey管理按钮后获取。

Java实现短信发送业务_第1张图片

  • 获取测试签名和模板

Java实现短信发送业务_第2张图片

3、代码实现

目前阿里云短信服务的SDK分为1.0版本和2.0版本,1.0已经不再维护,推荐使用2.0版本,下面列举了两种方式的实现代码。

  • 2.0版本

(1) Maven方式引入pom依赖


    com.aliyun
    dysmsapi20170525
    2.0.24

(2) 代码编写

代码逻辑:创建发送短信的客户端,提供参数调用对应方法即可。 需要提供下面几个参数:

  • AccessKey ID:类似登录阿里云时的账号
  • AccessKey Secret:类似登录阿里云的密码
  • phone:接收短信的号码
  • signName:短信签名,即短信开头时【】内的公司信息
  • templateCode:模版编码,即短信内容的骨架
  • templateParam:模版参数,即要往短信模版骨架中填充的内容
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.teautil.models.RuntimeOptions;

public class SMSUtils {
    /**
     * 阿里云登录id
     */
    private final static String ACCESS_KEY_ID = "your access key id";

    /**
     * 阿里云登录密码
     */
    private final static String ACCESS_KEY_SECRET = "your access key secret";

    /**
     * 初始化登录阿里云的Client
     *
     * @param accessKeyId
     * @param accessKeySecret
     * @return Client
     */
    public static com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
        .setAccessKeyId(accessKeyId)
        .setAccessKeySecret(accessKeySecret);
        // 可指定登录的服务器地址,可参考 https://api.aliyun.com/product/Dysmsapi
        config.endpoint = "dysmsapi.aliyuncs.com";
        return new com.aliyun.dysmsapi20170525.Client(config);
    }

    /**
     * 发送短信方法
     * @param phoneNumbers 手机号
     * @param signName 签名
     * @param templateCode  模板编号
     * @param param 模板参数
     * @throws Exception
     */
    public static void sendMessage(String phoneNumbers, String signName, String templateCode, String param) throws Exception {
        com.aliyun.dysmsapi20170525.Client client = SMSUtils.createClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
        .setPhoneNumbers(phoneNumbers)
        .setSignName(signName)
        .setTemplateCode(templateCode)
        .setTemplateParam(param);
        SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, new RuntimeOptions());
        System.out.println("短信发送成功,返回结果是:"+sendSmsResponse);
    }

    public static void main(String[] args) {
        try {
            SMSUtils.sendMessage("15179068888", "阿里云短信测试", "SMS_154958888", "{\"code\":\"7777\"}");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}

  • 1.0版本

(1) Maven方式引入pom依赖


    com.aliyun
    aliyun-java-sdk-core
    4.5.16


    com.aliyun
    aliyun-java-sdk-dysmsapi
    2.1.0

(2) 代码编写

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;

/**
 * 短信发送工具类
 */
public class SMSUtils {
   /**
    * 发送短信
    * @param signName 签名
    * @param templateCode 模板
    * @param phoneNumbers 手机号
    * @param param 模板参数
    */
   public static void sendMessage(String signName, String templateCode,String phoneNumbers,String param){
      // client的参数,服务器ip, accessKeyId, accessKeySecret 
      DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "xxxxxxxxxxxxxxxx", "xxxxxxxxxxxxxx");
      // 登录client
      IAcsClient client = new DefaultAcsClient(profile);

      SendSmsRequest request = new SendSmsRequest();
      request.setSysRegionId("cn-hangzhou");
      request.setPhoneNumbers(phoneNumbers);
      request.setSignName(signName);
      request.setTemplateCode(templateCode);
      request.setTemplateParam("{\"code\":\""+param+"\"}");
      try {
         SendSmsResponse response = client.getAcsResponse(request);
         System.out.println("短信发送成功");
      }catch (ClientException e) {
         e.printStackTrace();
      }
   }
}

你可能感兴趣的:(java)