通过第三方平台实现手机发送短信
-
短信验证码平台选择考虑点
-
各个类型短信价格
-
短信到达率、到达时间
-
短信内容变量灵活,方便支持多场景
-
支持多种推广内容的短信发放,例如业务推广、新产品宣讲、会员关怀等内容的短信
-
多维度数据统计-查看请求量、发送成功量、失败量、等
- 引入第三方短信平台
-
-
短信平台
- 阿里云:https://www.aliyun.com/product/sms
- 推荐
- 腾讯云:https://cloud.tencent.com/product/sms
- 推荐
- 第三方厂商:https://market.aliyun.com/products/57000002/cmapi00046920.html
- 提供测试模板、免审核、测试成本更低
- 阿里云:https://www.aliyun.com/product/sms
-
使用阿里云市场
-
参数:
AppKey:XXXXXX AppSecret:XXXXXX AppCode:XXXXXXXXXX 模板ID: XXXXXX
实战
第三方平台短信使用的规范:【聚美智数】短信验证码-106三网短信验证码-验证码短信-短信验证码接口-验证码短信-短信验证码API-验证码-手机短信验证码【最新版】-云市场-阿里云 (aliyun.com)
-
添加SmsConfig配置
-
application.yml
#------自定义sms配置------ sms: #AppCode app-code: 7470e2e1320c4451b26260ea820b1be2 #模板Id template-id: M105EABDEC
-
通过springBoot获取配置文件中的属性
- 使用注解:
@ConfigurationProperties(prefix = "sms")
:配置文件中的前缀
@Configuration
:指定该类为配置类
/** * @Author:fan * @Description: * @Date:2022-11-25 23:06 */ @ConfigurationProperties(prefix = "sms") @Configuration @Data public class SmsConfig { private String appCode; private String templateId; }
-
-
SmsComponent工具类封装
- 入参是:手机号、第三方短信平台的模板id、短信内容
- 使用的是 restTemplate 发送post请求
@Component @Slf4j public class SmsComponent { private static final String URL_TEMPLATE= "https://jmsms.market.alicloudapi.com/sms/send?mobile=%s&templateId=%s&value=%s"; @Autowired private RestTemplate restTemplate; @Autowired private SmsConfig smsConfig; /** * 发送短信验证码 * @param mobile 短信接收人号码 * @param templateId 短信模板ID * @param value 短信发送的内容 */ public void send(String mobile,String templateId,String value){ String url = String.format(URL_TEMPLATE,mobile,templateId,value); HttpHeaders httpHeaders = new HttpHeaders(); //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105 httpHeaders.set("Authorization","APPCODE "+smsConfig.getAppCode()); HttpEntity entity = new HttpEntity<>(httpHeaders); ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class); log.info("url={},body={}",url,response.getBody()); if(response.getStatusCode().is2xxSuccessful()){ log.info("发送短信验证码成功"); }else { log.error("发送短信验证码失败:{}",response.getBody()); } } }
-
单元测试
@RunWith(SpringRunner.class) @SpringBootTest(classes = AccountApplication.class) @Slf4j public class SmsTest { @Autowired private SmsComponent smsComponent; @Test public void testSendSms(){ smsComponent.sendCode("13113677337","M72CB92894","223344"); } }
-