阿里云短信服务接入流程

向右看齐 2024-04-08 13:51 234阅读 0赞

背景

在最近的项目需求中, 需要将复用阿里短信能力, 实现用户手机号验证: 如果用户号码验证通过后, 可以让用户上传文件资料并进行打印.
故核心内容就是: 阿里云短信服务接入, 下面我们主要来介绍下阿里云短信服务接入流程

一. 熟悉整个对接流程

  1. 进入阿里云短信服务新手指引页面
    可以看到整个对接流程如下图所示:
    在这里插入图片描述
  2. 每个过程如下图所示:
    在这里插入图片描述

二. 具体搭建过程

准备工作

  1. 注册后登录云通信产品试用界面
  2. 进行实名认证,如下图所示
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  3. 开通短信服务
    购买免费的短信包, 然后零元购后就可以在短信控制台进行配置
    在这里插入图片描述
    点击进入 阿里云短信服务控制台. 这里可以修改每分钟, 每小时, 每天发送信息的频率
    在这里插入图片描述
  4. 获取AccessKey
    在阿里云短信服务控制台右上角点击AccessKey管理
    在这里插入图片描述
    创建用户组
    在这里插入图片描述
    配置用户组权限
    在这里插入图片描述
    在用户组-添加组成员页面新建用户
    在这里插入图片描述
    新建用户
    在这里插入图片描述
    新建用户配置(该用户属于子用户, 用于发送短信)
    在这里插入图片描述
    复制并保存 AccessKey ID和AccessKey Secret, 以便在后续SDK中使用
    (这一步非常重要, 因为AccessKey ID 和 AccessKey Secret只显示一次, 无法找回, 只能重新生成)
    在这里插入图片描述

添加签名

注意: 如果仅仅测试的话, 可以跳过添加签名添加模板步骤. 直接调用sdk, 并使用无限制的测试签名和模板进行测试

  1. 添加签名设置
    在这里插入图片描述
  2. 根据用途选择适用场景和签名用途, 然后进行审核
    在这里插入图片描述

添加模板

  1. 创建模板
    模板就是指短信模板, 具体就是在发送验证短信时, 短信发送内容的模板
    在这里插入图片描述
  2. 配置短信模板内容后进行审核, 审核通过即可使用
    在这里插入图片描述

发送短信(SDK)

注意: 这里因为使用sdk进行测试调用, 因此无需等待签名和模板审核成功. 使用下面短信测试专用的签名和模板编码即可
SignName: 阿里云短信测试,
TemplateCode: SMS_154950909

整体流程
进入OpenApi页面 -> 添加参数 -> 发起调用 -> 复制生成的sdk代码 -> 下载jar包->封装并复用代码

  1. 配置测试手机号
    因为使用的是测试模板和签名, 因此需要我们配置用于测试的手机号
    在这里插入图片描述
    否则则会提示: 只能向已回复授权信息的手机号发送
    在这里插入图片描述
  2. 在线调用sdk
    这里调用成功后, 就会发送短信.
    在这里插入图片描述
  3. 查看是否调用成功(成功后复制sdk代码)
    发起调用成功并收到短信后(如下图), 复制上图右侧生成的sdk示例代码到项目中
    在这里插入图片描述
  4. 添加依赖( 获取sdk的jar包 )
    如果是maven项目. 直接复制下图展示的Maven坐标
    在这里插入图片描述

注意: 如果是SSM/JavaEE项目(需要手动放入jar), 配置过程如下

  1. 直接将下图包放到指定目录下(博客底部会将jar分享)
    在这里插入图片描述
  2. Project Structure->Libraries 中, 将lib下面的jar添加到项目中
    在这里插入图片描述
  3. 选择jar所在目录, 添加后如下图所示
    在这里插入图片描述
  4. 添加成功后, 对应的sdk代码则不会报红, 项目也可以正常运行

三. 封装sdk方法

  1. 将上一步的sdk方法进行封装
    这里主要有三个方法: 第一个用于使用AK&SK初始化账号Client, 第二个用于生成6位验证码. 第三个用于获取发送短信结果

    1. import com.aliyun.dysmsapi20170525.Client;
    2. import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
    3. import com.aliyun.tea.TeaException;
    4. import com.aliyun.teaopenapi.models.Config;
    5. import org.springframework.stereotype.Component;
    6. /**
    7. * info:
    8. *
    9. * @Author caoHaiYang
    10. * @Date 2022/8/29 11:47
    11. */
    12. @Component
    13. public class SendSms {
  1. public static final String accessKeyId = "你的accessKeyId ";
  2. public static final String accessKeySecret = "你的accessKeySecret ";
  3. public static final String templateCode = "SMS_154950909";
  4. public static final String signName = "阿里云短信测试";
  5. /**
  6. * 使用AK&SK初始化账号Client
  7. * @param accessKeyId
  8. * @param accessKeySecret
  9. * @return Client
  10. * @throws Exception
  11. */
  12. public static com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
  13. Config config = new com.aliyun.teaopenapi.models.Config()
  14. // 您的 AccessKey ID
  15. .setAccessKeyId(accessKeyId)
  16. // 您的 AccessKey Secret
  17. .setAccessKeySecret(accessKeySecret);
  18. // 访问的域名
  19. config.endpoint = "dysmsapi.aliyuncs.com";
  20. return new com.aliyun.dysmsapi20170525.Client(config);
  21. }
  22. /**
  23. * 获取6位验证码
  24. * @return
  25. */
  26. public String getVerifyCode() {
  27. Long codeL = System.nanoTime();
  28. String codeStr = Long.toString(codeL);
  29. String verifyCode = codeStr.substring(codeStr.length() - 6);
  30. System.out.println("生成的6位验证码为:" + verifyCode);
  31. return verifyCode;
  32. }
  33. /**
  34. * 发送短信
  35. * @param phoneNumber 手机号
  36. * @throws Exception
  37. * @return 短信验证码(如果为null说明出现错误)
  38. */
  39. public String sendMessage(String phoneNumber) throws Exception {
  40. //随机生成6位验证码
  41. String verifyCode = this.getVerifyCode();
  42. Client client = SendSms.createClient(accessKeyId, accessKeySecret);
  43. com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
  44. .setPhoneNumbers(phoneNumber)
  45. .setSignName(signName)
  46. .setTemplateCode(templateCode)
  47. .setTemplateParam("{\"code\":\""+verifyCode+"\"}");
  48. com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
  49. try {
  50. // 复制代码运行请自行打印 API 的返回值
  51. SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, runtime);
  52. System.out.println(sendSmsResponse.getBody().getMessage());
  53. return verifyCode;
  54. } catch (TeaException error) {
  55. // 如有需要,请打印 error
  56. com.aliyun.teautil.Common.assertAsString(error.message);
  57. } catch (Exception _error) {
  58. TeaException error = new TeaException(_error.getMessage(), _error);
  59. // 如有需要,请打印 error
  60. com.aliyun.teautil.Common.assertAsString(error.message);
  61. }
  62. return null;
  63. }
  64. }
  1. 新建短信发送业务

    1. /**
    2. * 发送短信业务
    3. * @Author caoHaiYang
    4. * @Date 2022/8/29 13:47
    5. */
    6. public interface SendMessageService {
  1. /**
  2. * 短信发送接口
  3. * @param phoneNumber
  4. * @return
  5. */
  6. int sendMessage(String phoneNumber) throws Exception;
  7. /**
  8. * 验证短信码
  9. * @param phoneNumber
  10. * @param verifyCode
  11. * @return
  12. */
  13. int verifyMessageCode(String phoneNumber, String verifyCode);
  14. }
  1. 创建业务实现类

    这里的逻辑就是:
    发送短信接口传入手机号之后, 调用 sendSms.sendMessage 返回验证码, 然后将手机号作为key验证码作为value放入redis中并设置过期时间. 而在验证短信码接口调用时: 根据传入的手机号去redis中查验证码, 将查询到的验证码和接口传入的验证码进行比对. 成功返回1, 不成功返回0

    1. import com.ring.config.Constants;
    2. import com.ring.config.JedisPoolUtil;
    3. import com.ring.model.BannerBean;
    4. import com.ring.service.SendMessageService;
    5. import com.ring.sms.SendSms;
    6. import org.apache.commons.lang3.StringUtils;
    7. import org.springframework.stereotype.Service;
    8. import redis.clients.jedis.Jedis;
    9. import javax.annotation.Resource;
    10. /**
    11. * info:
    12. *
    13. * @Author caoHaiYang
    14. * @Date 2022/8/29 16:07
    15. */
    16. @Service
    17. public class SendMessageServiceImpl implements SendMessageService {
    18. @Resource
    19. private SendSms sendSms;
  1. @Override
  2. public int sendMessage(String phoneNumber) throws Exception {
  3. //通过阿里sms发送短信
  4. String verifyCode = sendSms.sendMessage(phoneNumber);
  5. if (StringUtils.isEmpty(verifyCode)) {
  6. return 0;
  7. }
  8. //将短信保存到redis中
  9. Jedis jedis = null;
  10. try {
  11. jedis = JedisPoolUtil.getJedis();
  12. jedis.auth(Constants.REDIS_PASSWORD);
  13. jedis.select(Constants.REDIS_DB);
  14. jedis.setex(phoneNumber, 600, verifyCode);
  15. return 1;
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. }
  19. return -1;
  20. }
  21. @Override
  22. public int verifyMessageCode(String phoneNumber, String verifyCode) {
  23. Jedis jedis = null;
  24. try {
  25. jedis = JedisPoolUtil.getJedis();
  26. jedis.auth(Constants.REDIS_PASSWORD);
  27. jedis.select(Constants.REDIS_DB);
  28. String currentVerifyCode = jedis.get(phoneNumber);
  29. if (verifyCode.equals(currentVerifyCode)) {
  30. return 1;
  31. }
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. }
  35. return 0;
  36. }
  37. }
  1. 生成代码操作
    在测试完短信验证码后, 我们可以根据以下流程流程编写其他接口代码
    进入OpenApi页面 -> 添加参数 -> 发起调用 -> 复制生成的sdk代码 -> 封装并复用代码
  2. 当前阿里云短信服务可以提供的接口如下图所示
    在这里插入图片描述
    在这里插入图片描述

查询发送详情

发送成功后, 可以在短信服务控制台查看发送详情
查看指定时段短信发送量
在这里插入图片描述
查看短信具体发送内容
在这里插入图片描述 https://pan.baidu.com/s/1a3FeYANNIEo8ZvO5tIPeJg?pwd=pces


链接:https://pan.baidu.com/s/1a3FeYANNIEo8ZvO5tIPeJg
关注后进入私聊, 回复括号内关键字[ 短信服务 ] 获取阿里云短信服务jar包提取码

发表评论

表情:
评论列表 (有 0 条评论,234人围观)

还没有评论,来说两句吧...

相关阅读

    相关 阿里服务

    在开发过程中遇到过短信服务,推荐使用阿里云。个人申请阿里云短信服务确实有些困难,下面我先来简单说一下我的个人申请过程(仅供参考)。 1、申请签名流程 作为开发者,我们大

    相关 应用接入阿里服务

    背景        在日常开发中,我们可能会遇到短信验证之类的需求,这也是我们使用各类app或系统中比较常见的。在对比了各个平台提供的短信服务后,从价格,稳定性,接入便捷