title: 短信接口设计 date: 2019-06-20 12:02:33 author: capiudor
短信设计
1、是否需要考虑安全
2、是否需要考虑回调
3、是否需要考虑类型
短信通讯流程
前台接口通过调用接口发起短信通知接口,将信息组织为json 格式报文发往后台,后台处理报文数据,发往某短信提供方,厂商接收后实时返回短信发送状态。这是是厂商将短信内容发往相应的客户的手机,异步通知给我们平台,报告这次短信的发送最终状态。
短信厂商提供的接口
短信下发接口(没有参数,静态的短信文字内容)
变量短信接口(HTTPS请求方式,同时支持不同变量的短信内容)
回送状态报告接口(即异步通知接口)
1、安全性
问题:倘若攻击者使用抓包工具,对我们的接口进行无限发送短信,造成的短信费用是斐然的。
解决:
-
前端验证码(避免频繁发送)
-
黑名单(一个手机号超过一定次数拉入黑名单)
-
IP封停(一个IP频繁发送短信,拒绝该IP的请求)
-
提取Request中的信息,甄别是否为正常请求(头信息)
2、回调
问题:这个回调不影响你发短信,因为回调是已经完成了发送短信的操作,我们是否需要记录这个发送成功或者失败的信息。也就是说这个回调函数仅仅只是一个记录日志的作用
3、类型
短信我们拿来干什么?
-
手机注册验证码
-
手机登录验证码
-
重要的操作验证码(比如密码找回)
-
短信通知已处理的业务
根据我们的需要来设计这个短信接口类型,根绝类型选择我们发送的模板以及参数(模板由我们自己设计,参数即是模板的变量)
SpringBoot 整合短信接口(秒嘀云服务商)
1、引入依赖
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
这个依赖是提供处理常用的编码方法的工具类:
例如DES、SHA1、MD5、Base64,URL,Soundx等等。
不可逆算法
1.MD5
String str = "abc";
DigestUtils.md5Hex(str);
2.SHA1
String str = "abc";
DigestUtils.shaHex(str);
可逆算法
常规加密解密算法:BASE64
加密
String str= "abc";
byte[] b = Base64.encodeBase64(str.getBytes(), true);
System.out.println(new String(b));
解密
String str = "YWJj";
byte[] b = Base64.decodeBase64(str.getBytes());
System.out.println(new String(b));
2、创建配置类
public class Config {
/**
* url前半部分
*/
public static final String BASE_URL = "https://api.miaodiyun.com/20150822";
/**
* 开发者注册后系统自动生成的账号,可在官网登录后查看
*/
public static final String ACCOUNT_SID = "请填写自己的Sid";
/**
* 开发者注册后系统自动生成的TOKEN,可在官网登录后查看
*/
public static final String AUTH_TOKEN = "请填写自己的token";
/**
* 响应数据类型, JSON或XML
*/
public static final String RESP_DATA_TYPE = "json";
}
HttpUtil.java
package com.woniuxy.three.pms.common.config;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.codec.digest.DigestUtils;
/**
* http请求工具
*/
public class HttpUtil
{
/**
* 构造通用参数timestamp、sig和respDataType
*
* @return
*/
public static String createCommonParam()
{
// 时间戳
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String timestamp = sdf.format(new Date());
// 签名
String sig = DigestUtils.md5Hex(Config.ACCOUNT_SID + Config.AUTH_TOKEN + timestamp);
return "×tamp=" + timestamp + "&sig=" + sig + "&respDataType=" + Config.RESP_DATA_TYPE;
}
/**
* post请求
*
* @param url
* 功能和操作
* @param body
* 要post的数据
* @return
* @throws IOException
*/
public static String post(String url, String body)
{
System.out.println("url:" + System.lineSeparator() + url);
System.out.println("body:" + System.lineSeparator() + body);
String result = "";
try
{