本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(3)

Java

发布于2020-11-19 20:24     阅读(1300)     评论(0)     点赞(20)     收藏(2)


Java实现短信发送功能(阿里云服务)

温馨提示: 需要成本(本人充值了1元)

信息别泄露!信息别泄露!信息别泄露!

个人使用的是SpringBoot来做的

1. 准备阿里云账号

这里就不再示范
代码中需要用到:Access_key_id,Secret

2. 开通阿里云短信服务

2.1 短信签名申请

注意:代码中的许多参数和这里面是对应的
在这里插入图片描述

2.2 短信模板申请

在这里插入图片描述

3. 具体实现

3.1 导包

<!--阿里云短信服务-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.5.3</version>
        </dependency>

3.2 方法实现

注意:这里只放了实现的代码,代码中的其他相关类未贴出来!!!
SmsServiceImpl.java

package com.zwulle.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.zwulle.enums.VerificationType;
import com.zwulle.service.ISmsService;
import com.zwulle.utils.VerificationCodeUtil;
import com.zwulle.vo.BaseVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;

/**
 * SmsServiceImpl
 *
 * @author ZWulle
 * @date 2020-11-16
 */
@Service
public class SmsServiceImpl implements ISmsService {
    /**
     * ACCESS_KEY_ID
     */
    private final static String ACCESS_KEY_ID = "这里是阿里云的accessKeyId";
    /**
     * SECRET
     */
    private final static String SECRET = "密钥";
    /**
     * Redis验证码头 CODE_HEADER
     */
    private final static String CODE_HEADER = "CODE_HEADER:";
    /**
     * APP_NAME,会传值给SignName,签名名称
     */
    private final static String APP_NAME = "签名名称";
    /**
     * TemplateCode 模板CODE
     */
    private final static String TEMPLATE_CODE = "模板CODE";

    /**
     * 注入redis
     */
    @Autowired
    private StringRedisTemplate redisTemplate;


    @Override
    public BaseVO sms(String phone) {
		//这里可以通过帮助文档里的demo获取
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", ACCESS_KEY_ID, SECRET);
        IAcsClient client = new DefaultAcsClient(profile);

        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("dysmsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        request.setSysAction("SendSms");

        //自定义参数,这里会用到
        request.putQueryParameter("PhoneNumbers", phone);
        request.putQueryParameter("SignName", APP_NAME);
        request.putQueryParameter("TemplateCode", TEMPLATE_CODE);
        //构建一个长度为4的纯数字随机验证码,这是自己写的工具类
        String code = VerificationCodeUtil.getVerification(4, VerificationType.NUMCODE);
        //短信模板中的code值,短信内容里的验证码值,我因为这个参数没写导致短信一直没发送成功
        //可以自己看看阿里云的帮助文档,看看短信参数是哪些,这里好像是要一个json串;我就构建了这个参数
        //如果注释掉这行,会返回一个“isv.TEMPLATE_MISSING_PARAMETERS”提示(模板变量缺少对应参数值)
        request.putQueryParameter("TemplateParam", "{ " + "code" + ":" + code + "}");
        JSONObject jsonObject = null;
        try {
            CommonResponse response = client.getCommonResponse(request);
			//response.getData()返回短信执行的结果,如:{"Message":"模板变量缺少对应参数值","RequestId":"025FAB7F-9103-4469-B483-7698521A1A66","Code":"isv.TEMPLATE_MISSING_PARAMETERS"}
            jsonObject = JSON.parseObject(response.getData());

            String result = (String) jsonObject.get("Code");

            if ("OK".equalsIgnoreCase(result)) {
                //将验证码放入redis中,设置过期时间10分钟
                String key = CODE_HEADER + phone;
                redisTemplate.opsForValue().set(key, code, 10, TimeUnit.MINUTES);
                return new BaseVO(BaseVO.SUCCESS_CODE, "验证码已发送,10分钟内有效!", jsonObject);
            }
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return new BaseVO(BaseVO.SEND_CODE_FAILED, "验证码发送失败,请稍候再试!!!", jsonObject);
    }
}

SmsController.java

package com.zwulle.controller;

import com.zwulle.service.ISmsService;
import com.zwulle.vo.BaseVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SmsController {
    /**
     * 注入smsService
     */
    @Autowired
    private ISmsService smsService;

    /**
     * 短信测试接口
     *
     * @param phone 手机号
     * @return
     */
    @PostMapping("/sms")
    public BaseVO sms(@RequestParam String phone) {
		//这里可以自己写一个手机号校验工具类,反正也是学习
		//return smsService.sms(phone);
        return new BaseVO("测试接口,不能直接访问!");
    }
}

4. 测试

使用postman进行测试

postman结果(这里是其他接口调用了service,没有使用/sms来测试;效果一样)

在这里插入图片描述

手机接收短信如下:

在这里插入图片描述

5. 结语

学会使用,学会学习!要从使用中提示自己的排错能力!
当然啦!公司这类功能应该不会这么简单,但是个人的项目练习还是可以满足的!!!
学会分享也是一种进步!!!



所属网站分类: 技术文章 > 博客

作者:天使之恋

链接:http://www.javaheidong.com/blog/article/876/01b7bceb7fe10b3a52d7/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

20 0
收藏该文
已收藏

评论内容:(最多支持255个字符)