2021-05-17~2021-05-21
- 工作总结
- 工作内容
- 技术回顾
- 1.对接阿里云短信服务接口
- 阿里云api接口网址:
- 阿里云短信接口引入jar包:
- 阿里云短信工具类:
- 阿里云短信工具类:
- 2.对接第三方话务接口
- http与https请求差别:
- http协议:
- https协议:
- 优缺点比较:
- http协议get请求与post请求的区别:
- 第三方接口请求签名加密过程:
- 签名要求:
- Json参数key进行字典排序
- 签名计算
- 总结
工作总结
工作内容
本周工作内容主要是对接第三方接口,其中包含阿里云的短信服务接口、第三方通话接口。
技术回顾
1.对接阿里云短信服务接口
阿里云api接口网址:
阿里云短信接口引入jar包:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.0.6</version> <!-- 注:如提示报错,先升级基础包版,无法解决可联系技术支持 -->
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
阿里云短信工具类:
//产品名称:云通信短信API产品,开发者无需替换
static final String product = "Dysmsapi";
//产品域名,开发者无需替换
static final String domain = "dysmsapi.aliyuncs.com";
// TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
static String accessKeyId;
static String accessKeySecret;
public static boolean sendSms(String phone,JSONObject templateParamJson,DySmsEnum dySmsEnum) throws ClientException {
//可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//update-begin-author:taoyan date:20200811 for:配置类数据获取
StaticConfig staticConfig = SpringContextUtils.getBean(StaticConfig.class);
setAccessKeyId(staticConfig.getAccessKeyId());
setAccessKeySecret(staticConfig.getAccessKeySecret());
//update-end-author:taoyan date:20200811 for:配置类数据获取
//初始化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(phone);
//必填:短信签名-可在短信控制台中找到
request.setSignName(dySmsEnum.getSignName());
//必填:短信模板-可在短信控制台中找到
request.setTemplateCode(dySmsEnum.getTemplateCode());
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
request.setTemplateParam(templateParamJson.toJSONString());
boolean result = false;
//hint 此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
logger.info("短信接口返回的数据----------------");
logger.info("{Code:" + sendSmsResponse.getCode()+",Message:" + sendSmsResponse.getMessage()+",RequestId:"+ sendSmsResponse.getRequestId()+",BizId:"+sendSmsResponse.getBizId()+"}");
System.out.println("{Code:" + sendSmsResponse.getCode()+",Message:" + sendSmsResponse.getMessage()+",RequestId:"+ sendSmsResponse.getRequestId()+",BizId:"+sendSmsResponse.getBizId()+"}");
if ("OK".equals(sendSmsResponse.getCode())) {
result = true;
}
return result;
}
阿里云短信工具类:
调用短信发送接口前需进行模板的添加以及签名的添加,待审核通过后可进行短信的发送。
2.对接第三方话务接口
第三方话务接口采用https协议访问的方式进行请求
http与https请求差别:
http协议:
是超文本传输协议,信息是明文传输。如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息。(传输报文未经过加密)
包含:HTTP TCP IP
端口:80
https协议:
是具有安全性的ssl加密传输协议,为浏览器和服务器之间的通信加密、身份认证的网络协议可确保数据传输的安全。(https协议需要到CA (Certificate Authority,证书颁发机构)申请证书)
包含:HTTP TCP IP SSL/TLS
端口:443
优缺点比较:
优点:(安全性高)
1.使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;
2.HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全可防止数据在传输 过程中不被窃取、改变,确保数据的完整性。
3.HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。
缺点:(耗时、加大系统开销)
1.HTTPS协议握手阶段比较费时,会使页面的加载时间延长近50%,增加10%~20%的耗电。
2.HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗。
http协议get请求与post请求的区别:
1.get请求重点在从服务器上获取资源,而post请求重点在向服务器发送数据。
2.get传输数据是通过URL请求,以字段=value的形式,用?连接置于URL之后,多个请求数据之间用&连接,这个过程用户可见,因此是不安全的。post传输数据是通过http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程用户不可见,因此是安全的。
3.get传输的数据量小,受URL长度的限制,但是效率高。post传输数据量不受限制,可以传输大量数据,所以传输文件时只能使用post,但是效率较低。请求较多时可能形成一个请求队列。
4.get方式只支持ASCII字符,因此向服务器传输中文有可能出现乱码。post支持标准字符集,可以正确传递中文字符。
(get适合向服务器请求,请求一些简单、传输数据量小、安全性要求不高的请求。post适合向服务器,发送数据、并且对所请求或者发送的数据有较高安全性要求的请求。get效率>post效率)
第三方接口请求签名加密过程:
签名要求:
签名(Signature)的具体实现是以 AccessKeySecret 为密钥,使用 hmac-sha1 算法对用户请求参数(QueryString)、访问密钥ID(AccessKeyId)、签名有效时间(Expires)、签名当前时间戳(Timestamp)做哈希计算。(以下罗列部分加密过程)
Json参数key进行字典排序
利用TreeMap的特性所获取的json数据的key进行排序。
/**
* 对json进行排序
* @param json
* @return
*/
public static Map<String, Object> getSortJson(JSONObject json){
Iterator iteratorKeys = json.entrySet().iterator();
//不区分大小写字母排序
// SortedMap map = new TreeMap(String.CASE_INSENSITIVE_ORDER);
SortedMap map = new TreeMap();
while (iteratorKeys.hasNext()) {
Map.Entry entry = (Map.Entry) iteratorKeys.next();
String key = entry.getKey().toString();
String vlaue = entry.getValue().toString();
map.put(key, vlaue);
}
return map;
}
签名计算
签名计算过程虽然实现了,但是对于大部分加密算法并不了解有待提高。
/**
* 创造签名
* @param aip
* @return
* @throws UnsupportedEncodingException
*/
public static String createSignature(String aip) throws UnsupportedEncodingException {
byte[] bytes = HmacUtils.hmacSha1(accessKey, aip);
String xx1 = Base64.getEncoder().encodeToString(bytes);
String urlEncoderString = getURLEncoderString(xx1);
System.out.println(urlEncoderString);
return urlEncoderString;
}
/**
* URL 转码
*
* @return String
* @author lifq
* @date 2015-3-17 下午04:10:28
*/
public static String getURLEncoderString(String str) {
String result = "";
if (null == str) {
return "";
}
try {
result = java.net.URLEncoder.encode(str, ENCODE);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
总结
1、网络协议需不强
2、加密算法需进行了解
3、基本工具类的掌握不够熟练
努力变更好才能照顾自己想照顾的人--zwx