{{userInfo.nickname}}
用户设置 退出登录

{{wikiTitle}}

短信发送

一、功能概述

本模块基于一号通服务平台实现短信发送能力,支持以下核心业务场景:

1.验证码发送(用户注册/登录验证)
2.订单状态通知(支付成功、发货提醒、改价通知)
3.管理端提醒(新订单提醒、退款申请通知)
4.模板管理(申请/修改短信模板)

核心特性:
多业务场景短信模板支持
发送频率控制(Redis缓存限制)
与服务商解耦设计
异步发送保障系统稳定性

二、接口说明

1. 公共验证码发送

@ApiOperation("发送通用验证码")
public CommonResult<Boolean> sendCommonCode(
    @RequestParam @Pattern(regexp = "^1[3-9]\\d{9}$") String phone
)

2. 业务短信接口

方法名 业务场景 关键参数
sendPaySuccess 支付成功通知 订单号、金额
sendOrderDeliverNotice 发货提醒 用户昵称、商品名称、订单号
sendOrderEditPriceNotice 改价通知 订单号、新价格
sendCreateOrderNotice 新订单管理员提醒 管理员名称、订单号

三、核心流程

1. 验证码发送流程

start
:接收手机号;
:校验手机号格式;
if (Redis存在发送记录?) then (是)
  :返回"操作频繁"错误;
  stop
endif
:生成6位随机验证码;
:调用一号通发送接口;
if (发送成功?) then (是)
  :写入Redis缓存(5分钟有效期);
else (否)
  :记录错误日志;
endif
:返回操作结果;

2. 服务调用流程

// 核心发送逻辑
private Boolean commonSendSms(SendSmsVo sendSmsVo) {
    // 1. 获取认证令牌
    String token = onePassUtil.getToken(); 

    // 2. 构建请求头
    HashMap<String, String> header = onePassUtil.getCommonHeader(token);

    // 3. 封装请求参数
    MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
    param.add("phone", sendSmsVo.getMobile());
    param.add("temp_id", sendSmsVo.getTemplate());

    // 4. 发送POST请求
    String result = restTemplateUtil.postFromUrlencoded(
        OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_API_SEND_URI,
        param, header
    );

    // 5. 校验响应结果
    return checkResult(result);
}

3. 配置加载示例

// 获取验证码有效期
String expire = systemConfigService.getValueByKey(Constants.CONFIG_KEY_SMS_CODE_EXPIRE);
// 获取API地址
String apiUrl = OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_API_SEND_URI;

四、二开策略

1. 新增短信模板

实现步骤:

控制台申请模板:

public Boolean applyTempMessage(SmsApplyTempRequest request) {
    // 参数封装
    MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
    param.add("title", request.getTitle());
    param.add("content", request.getContent());

    // 调用一号通API
    return postFrom(OnePassConstants.ONE_PASS_TEMP_APPLY_URI, param);
}

同步模板ID:

# 模板ID配置
sms.template.pay_success=1001
sms.template.deliver_notice=1002

2. 更换服务商

适配器模式改造:

public interface SmsAdapter {
    Boolean send(SendSmsVo vo);
}

@Service("onePassAdapter")
public class OnePassAdapterImpl implements SmsAdapter {
    // 现有一号通实现
}

@Service("aliyunAdapter")
public class AliyunAdapterImpl implements SmsAdapter {
    // 新服务商实现
}
{{cateWiki.like_num}}人点赞
0人点赞
评论({{cateWiki.comment_num}}) {{commentWhere.order ? '评论从旧到新':'评论从新到旧'}} {{cateWiki.page_view_num}}人看过该文档
评论(0) {{commentWhere.order ? '评论从旧到新':'评论从新到旧'}} 207人看过该文档
评论
{{item.user ? item.user.nickname : ''}} (自评)
{{item.content}}
{{item.create_time}} 删除
{{item.like ? item.like.like_num : 0}} {{replyIndex == index ? '取消回复' : '回复'}}
评论
{{items.user ? items.user.nickname : '暂无昵称'}} (自评)
{{items.content}}
{{items.create_time}} 删除
{{items.like ? items.like.like_num : 0}} {{replyIndexJ == (index+'|'+indexJ) ? '取消回复' : '回复'}}
评论
目录
  • {{item}}