开发者学堂课程【全面讲解 Spring Cloud Alibaba 技术栈(知识精讲+项目实战)第四阶段:发送下单成功短信案例】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/686/detail/11916
发送下单成功短信案例
下单之后发送短信
1、短信通知
使用的场景是短信通知,在申请签名的时候如果是短信通知,应该选通用,如果选择通用会让提供签名来源,签名来源是需要上传各种各样资质,资质没有所以只能选择发送一条验证码跟实际场景不符。如果到企业中资质都能拿到可以选择通用,然后发送一个短信通知。
短信通知模板可以修改,里面有模板名称、模板内容、申请说明。
跟验证码的模板很相似
订单已经成功但是不能用,因为有场景的限制,所以模拟的是一旦发现有订单下单成功,就发送一个验证码到用户的手机上去。
2、在 shop-user 模块中加入 sms 依赖
<!--短信发送-->
<dependency>
<groupId>com.alibaba.c1oud</groupId>
<artifactId>spring-c1oud-alicloud-sms</artifactid>
</dependency>
3、将阿里短信给出的 demo 封装成工具类
public class Smsutil {
//替换成自己申请的accessKeyId
private static string accessKeyId="LTAIML1f8NKYXn1M"
//替换成自己申请的accessKeySecret
private static String accessKeySecret
="hqyW0zTNzeSIFnZhM
EkOaZXVVcr 3Gj";
static final string product = "Dysmsapi";
static final string domain ="dysmsapi.aliyuncs.com";
4、代码
(1)代码
import lombok.extern.slf4i.Slf4i;
import
org.apache.rocketmg.spring.annotation.ConsumeMod
e;
import
org.apache.rocketmg.spring.annotation.MessageMo
del;
import
org.apache.rocketmg.spring.annotation.RocketMOMe
ssageListener;
import org.apache.rocketmg.spring.coreRocketMQlistener
import
org.springframework.beans.factory.annotation.Autowi
red;
import org.springframework.stereotype.Service;
@sl
f4j
@
service
(“shopsSmsservice”)
//consumerGroup
-
消费者组名
topic-
要消费的主题
@
RocketMOMessageListener(
consumerGroup="shop-user",//消费者组名
topic="order-topic",//消费主题
consumeMode =ConsumeMode.CONCURRENTLY//消费模式,指定是否顺序消费
CONCURRENTLY(同步,默认)ORDERLY顺序) messageModel=MessageMode1.CLUSTERING//消息模式BROADCASTING(广播)CLUSTERING(集群默认)
publia class SmsService implements RocketMQListener<or
der>{
@Autowired
private UserDao userDao;
//消费逻辑
@
Override
public void onMessage(Order message){
l
og.info("接收到了一个订单信息,接下来就可以发送短信通知了",message);
//根据
uid
获取手机号
User user=userDao.findById(message.getuid()).get();
//生成验证码
1-9 6
stringBuilder builder=newstringBuilder();
for (int i = o; i < 6; i++) {
builder.append(new Random().nextInt( bound: 9)+1)
;
}
string smseode = builder.tostring();
Param param=new Param(smsCode)
try{
//发送短信("code":"123456"}
SmsUtil.sendSms(user.getTelephone(),signName:"黑马旅游网",templateCode:"SMS 170836451",
JSON。
toJSONString(pa ram))
;
Iog.info("短信发送成功");}
catch (Exception e){
e.printstackTrace();
}
}
@Data
@
AllArgsConstructor
@
NoArgsConstructor
class Param{
private string code;
}
}
启动一下 user:
User 启动报错,修改 @service(“shopsSmsservice”)
再运行一次:
发送成功,没有报异常。
(2)过程
SmsUtiLjava:
/**
*
发送短信
*
*
@param phoneNumbers要发送短信到哪个手机号
*@
para
m
signName 短信签名[必须使用前面申请的]
*@
param templateCode 短信短信模板ID[必须使用前面申请的]
*@
param param 模板中s{code)位置传递的内容
需要四个参数手机号、短信签名、短信模板 code 以及 code 模板中需要的参数,中间两个只需要把申请好的名称和代码拿过来就行。
手机号跟用户相关,现在只能拿到订单,看订单里面时候有用户。
package com. itheima.domain
;
import ...
//订单
@Entity(name = "shop order")
@d
ata
public class Order {
@Id
@GeneratedValue(strategy=GenerationTypeIDENTITY)
private Long oid;//订单id
//用户
private Integer uid;//用户id
private string username;//用户名
//商品
private Integer pid;//商品id private string pname;//商品名称
private Double pprice;//商品单价
//数量
private Integernumber;//购买数量
)
订单里面有 UID,根据 UID 能查询到用户,已经拥有手机号,最后是 parm 目前传的是一个验证码,验证码自己生成就可以。
缺少的参数为 code
(3)打断
User user=userDao.findById(message.getuid()).get();
执行下单 localhost:8091/order/prod/2:
{
"oid”: 67.
"uid”: 1.
"usernane":“测试用户”,
"pid”: 2,
"pnane”: "华为”,
"pprice":2000
"number": 1
}
消息已经过来。
首先查用户:
组装六位数验证码:
打断 for (int i = o; i < 6; i++) {
已经拥有六位数验证码。
进行拼接:
JSON.toJSONString(param)转出的格式执行一下:
Expression:
JSON.tosonstring(param
Result:
oo result = "{"code":"979349"}"
value ={char[17]@14542)
hash=0
为所要的格式,接下来放一下断点。
学习如何用阿里云短信发送短消息,具体的场景根据企业中来决定,比如发送验证码可以直接用,但是短信通知类型要用场景需要跟公司去沟通,要相关的签名来源、资质上传,审核通过以后就可以使用。