阿里云短信验证码服务--复用性极强--拉下来直接用

提示:以下是本篇文章正文内容,下面案例可供参考

一、环境要求

最低要求Java 8。

二、导入依赖

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>dysmsapi20170525</artifactId>
  <version>2.0.24</version>
</dependency>

导入依赖后,立即mvn clean package

三、配置

1.yml配置

aliyun:
  sms:
    region-id: cn-hangzhou
    key-id: 自己的keyId
    key-secret: 自己的keySecret
    template-code: 可以填写自己的,也可以和我一样,直接用阿里测试的,和我一样的可以不用填写
    sign-name: 可以填写自己的,也可以和我一样,直接用阿里测试的,和我一样的可以不用填写

2.properties读取配置类

package com.zzyl.properties;

import lombok.Data;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(value = "aliyun.sms")
public class SmsProperties implements InitializingBean {

    private String regionId;
    private String keyId;
    private String keySecret;

    public static String REGION_Id;
    public static String KEY_ID;
    public static String KEY_SECRET;

    //当私有成员被赋值后,此方法自动被调用,从而初始化常量
    @Override
    public void afterPropertiesSet() throws Exception {
        REGION_Id = regionId;
        KEY_ID = keyId;
        KEY_SECRET = keySecret;
    }
}

四、工具类

生成随机验证码工具类

package com.zzyl.utils;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;

/**
 * 获取随机数工具类
 * @author Li.HS
 */
public class RandomUtil {

   private static final Random random = new Random();

   private static final DecimalFormat fourdf = new DecimalFormat("0000");
   
   private static final DecimalFormat sixdf = new DecimalFormat("000000");
   public static String getFourBitRandom() {
      return fourdf.format(random.nextInt(10000));
   }
   public static String getSixBitRandom() {
      return sixdf.format(random.nextInt(1000000));
   }
   
 //给定数组,抽取n个数据
   public static ArrayList getRandom(List list, int n) {
      Random random = new Random();
      HashMap<Object, Object> hashMap = new HashMap<Object, Object>();
      
      // 生成随机数字并存入HashMap
      for (int i = 0; i < list.size(); i++) {
         int number = random.nextInt(100) + 1;
         hashMap.put(number, i);
      }
      
      // 从HashMap导入数组
      Object[] robjs = hashMap.values().toArray();
      ArrayList r = new ArrayList();

      // 遍历数组并打印数据
      for (int i = 0; i < n; i++) {
         r.add(list.get((int) robjs[i]));
         System.out.print(list.get((int) robjs[i]) + "\t");
      }
      System.out.print("\n");
      return r;
   }
}

五、Controller层

1.版本1

package com.zzyl.controller;
import com.zzyl.base.ResponseResult;
import com.zzyl.service.MsmService;
import com.zzyl.utils.RandomUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;

@CrossOrigin
@RestController
@RequestMapping("/aliyun/msm")
public class MsmController {

    @Autowired
    private MsmService msmService;

    @GetMapping("send")
    public ResponseResult sendMsm() throws Exception {
        String code;
        //生成随机数,传递阿里云进行发送
        code = RandomUtil.getFourBitRandom();
        Map<String, Object> param = new HashMap<>();
        param.put("code",code);
        //调用service的方法,发送
        boolean isSend = msmService.send(param);
        if (isSend) {
            return ResponseResult.success();
        }else
            return ResponseResult.error();
    }
}

2.版本2

package com.zzyl.controller;
import com.zzyl.base.ResponseResult;
import com.zzyl.service.MsmService;
import com.zzyl.utils.RandomUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;

@CrossOrigin
@RestController
@RequestMapping("/aliyun/msm")
public class MsmController {

    @Autowired
    private MsmService msmService;

   @GetMapping("aliyun/{phone}")
    public R sendMsm(@PathVariable String phone){
        String code;
        //生成随机数,传递阿里云进行发送
        code = RandomUtil.getFourBitRandom();
        Map<String, Object> param = new HashMap<>();
        param.put("code",code);
        //调用service的方法,发送
        boolean isSend = msmService.send(param,phone);
        if (isSend) {
            return R.ok();
        }else
            return ResponseResult.error();
    }
}

六、service和serviceImpl层

1.service层版本1

package com.zzyl.service;

import java.util.Map;

public interface MsmService {

    boolean send(Map<String, Object> param) throws Exception;
}

2.service层版本2

package com.zzyl.service;

import java.util.Map;

public interface MsmService {

    boolean send(Map<String, Object> param, String phone) throws Exception;
}

3.serviceIMpl层版本1

package com.zzyl.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import com.zzyl.properties.SmsProperties;
import com.zzyl.service.MsmService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Map;

@Transactional
@Service
public class MsmServiceImpl implements MsmService {
    @Autowired
    private SmsProperties smsProperties;

    @Override
    public boolean send(Map<String, Object> param) throws Exception {
        //创建客户端
        Client client = new Client(new Config()
                .setEndpoint("dysmsapi.aliyuncs.com")
                .setAccessKeyId(smsProperties.getKeyId())
                .setAccessKeySecret(smsProperties.getKeySecret()));
        com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
                .setPhoneNumbers("自己在阿里云绑定的测试手机号")
                //我用的测试模板,不需要自己申请资质,直接复用即可
                .setSignName("阿里云短信测试")
                .setTemplateParam(JSONObject.toJSONString(param))
                .setTemplateCode("SMS_154950909")
                .setSmsUpExtendCode("90999")
                .setOutId("abcdefgh");
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            // 复制代码运行请自行打印 API 的返回值
            client.sendSmsWithOptions(sendSmsRequest, runtime);
        } catch (TeaException error) {
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
        return true;
    }
}

4.serviceIMpl层版本2

package com.zzyl.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import com.zzyl.properties.SmsProperties;
import com.zzyl.service.MsmService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Map;

@Transactional
@Service
public class MsmServiceImpl implements MsmService {
    @Autowired
    private SmsProperties smsProperties;

    @Override
    public boolean send(Map<String, Object> param, String phone) throws Exception {
        //创建客户端
        Client client = new Client(new Config()
                .setEndpoint("dysmsapi.aliyuncs.com")
                .setAccessKeyId(smsProperties.getKeyId())
                .setAccessKeySecret(smsProperties.getKeySecret()));
        com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
                .setPhoneNumbers(phone)
                .setSignName("自己申请的测试签名")
                .setTemplateParam(JSONObject.toJSONString(param))
                .setTemplateCode("自己申请的模板")
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            // 复制代码运行请自行打印 API 的返回值
            client.sendSmsWithOptions(sendSmsRequest, runtime);
        } catch (TeaException error) {
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
        return true;
    }
}

总结

步骤
1.初始化配置对象 com.aliyun.teaopenapi.models.Config 。 Config 对象存放 AccessKeyId、AccessKeySecret 、endpoint 等配置,Endpoint 如示例中的 dysmsapi.aliyuncs.com 。

Config config = new Config()
    // 您的AccessKey ID
    .setAccessKeyId(accessKeyId)
    // 您的AccessKey Secret
    .setAccessKeySecret(accessKeySecret);
// 访问的域名
config.endpoint = "dysmsapi.aliyuncs.com";

2.实例化一个客户端,从 com.aliyun.dysmsapi20170525.Client 类生成对象 client 。 后续 request、response 从 com.aliyun.dysmsapi20170525.models 中获得。

Client client = new Client(config);

3.创建对应 API 的 Request 。 类的命名规则为 API 方法名加上 Request 。例如:

SendSmsRequest request = new SendSmsRequest();

4.设置请求类 request 的参数。 通过 request 类的属性设置必要的信息,即 API 中必须要提供的信息。


request.PhoneNumbers = "your_value"; // 该参数值为假设值,请您根据实际情况进行填写

request.SignName = "your_value"; // 该参数值为假设值,请您根据实际情况进行填写

5.通过 client 对象获得对应 request 响应 response 。

SendSmsResponse response = client.sendSms(request);
System.out.println(new Gson().toJson(response.Body));

6.调用 response 中对应的属性获得返回的参数值。 假设您需要获取 requestId :

String requestId = response.Body.requestId;

7.使用 catch() 处理报错。

String requestId = response.Body.requestId;
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值