SMS短信服务

标签: 微服务  阿里云短信服务  SMS  sms

接下来,通过“短信验证码”功能来演示阿里云短信服务的集成和使用。大体流程如下:

关于阿里云的注册与实名认证,不再赘述。

目录

一、开通短信服务

二、申请认证密钥

三、申请短信签名

四、申请短信模板

五、短信服务API介绍

六、功能测试


一、开通短信服务

二、申请认证密钥

AccessKey就是阿里云颁发给你的一套用户名密码,发送短信要收费吧,所以发送短信时要求带上认证密钥,方便扣钱。

三、申请短信签名

四、申请短信模板

五、短信服务API介绍

此处不再赘述,参考官方的帮助文档下的开发指南:https://help.aliyun.com/product/44282.html?spm=5176.12212976.0.0.7bf81cbeB1BMoP

六、功能测试

第一步:引入阿里云服务依赖

        <!--短信服务-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alicloud-sms</artifactId>
        </dependency>

 

第二步:短信发送工具类

package cn.jack.util;

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;
import com.aliyuncs.profile.IClientProfile;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class SmsUtils {

    //产品名称:云通信短信API产品,开发者无需替换
    static final String product = "Dysmsapi";
    //产品域名,开发者无需替换
    static final String domain = "dysmsapi.aliyuncs.com";

    // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
    static final String accessKeyId = "xxx";
    static final String accessKeySecret = "xxx";

    /**
     * 发送短信
     * @param phoneNumber   必填:待发送手机号
     * @param signName      必填:短信签名-可在短信控制台中找到
     * @param templateCode  必填:短信模板-可在短信控制台中找到
     * @param templateParam 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为{"name":"abc", "code": "123"}
     * @return
     * @throws Exception
     */
    public static SendSmsResponse sendSms(String phoneNumber, String signName, String templateCode, String templateParam) throws ClientException {

        //可自助调整超时时间
        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
        System.setProperty("sun.net.client.defaultReadTimeout", "10000");

        //初始化acsClient,暂不支持region化
        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
        IAcsClient acsClient = new DefaultAcsClient(profile);

        //组装请求对象-具体描述见控制台-文档部分内容
        SendSmsRequest request = new SendSmsRequest();
        //必填:待发送手机号
        request.setPhoneNumbers(phoneNumber);
        //必填:短信签名-可在短信控制台中找到
        request.setSignName(signName);
        //必填:短信模板-可在短信控制台中找到
        request.setTemplateCode(templateCode);
        //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
        request.setTemplateParam(templateParam);

        //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
        //request.setSmsUpExtendCode("90997");

        //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
        request.setOutId("yourOutId");

        //hint 此处可能会抛出异常,注意catch
        SendSmsResponse sendSmsResponse = null;
        try {
            sendSmsResponse = acsClient.getAcsResponse(request);
        } catch (Exception e) {
            log.error("短信发送失败", e);
            throw new RuntimeException("短信发送失败", e);
        }

        return sendSmsResponse;
    }
}

 

第三步:商品下单成功后,发送短信给用户

package cn.jack.service;

import cn.jack.dao.UserDao;
import cn.jack.domain.Order;
import cn.jack.domain.User;
import cn.jack.util.SmsUtils;
import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Random;

@Slf4j
@Service("shopSmsService")      // alibaba内部有个bean叫SmsService,避免重名导致应用启动失败
@RocketMQMessageListener(
        consumerGroup = "jack-consumer-group",
        topic = "jack_ts_topic",
        consumeMode = ConsumeMode.CONCURRENTLY,
        messageModel = MessageModel.CLUSTERING)
public class SmsService implements RocketMQListener<Order> {

    @Autowired
    private UserDao userDao;

    @Override
    public void onMessage(Order order) {
        try {
            log.info("收到订单信息,内容如下:{}, 接下来进行短信发送", order);

            // TODO 根据订单中的用户id,查询用户信息,获取手机号
            User user = this.userDao.findById(order.getUid()).get();
            // TODO 生成验证码:6位数,[1-9]
            StringBuffer buffer = new StringBuffer();
            for (int i = 0; i < 6; i++) {
                int tmp = new Random().nextInt(9) + 1;
                buffer.append(tmp);
            }
            Param templateParam = new Param(buffer.toString());

            // TODO 发送短信
            SmsUtils.sendSms(
                    user.getTelephone(),
                    "短信签名",
                    "模板code",
                    JSON.toJSONString(templateParam)
            );

            log.info("短信发送成功");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    class Param{
        private String code;
    }
}

访问下单接口http://localhost:8091/order/prod/1 下单成功后,手机收到短信提醒。

 

 

 

版权声明:本文为qq_31155349原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_31155349/article/details/108814386