2021-05-17~2021-05-21

  • 工作总结
  • 工作内容
  • 技术回顾
  • 1.对接阿里云短信服务接口
  • 阿里云api接口网址:
  • 阿里云短信接口引入jar包:
  • 阿里云短信工具类:
  • 阿里云短信工具类:
  • 2.对接第三方话务接口
  • http与https请求差别:
  • http协议:
  • https协议:
  • 优缺点比较:
  • http协议get请求与post请求的区别:
  • 第三方接口请求签名加密过程:
  • 签名要求:
  • Json参数key进行字典排序
  • 签名计算
  • 总结


工作总结

工作内容

本周工作内容主要是对接第三方接口,其中包含阿里云的短信服务接口、第三方通话接口。

技术回顾

1.对接阿里云短信服务接口
阿里云api接口网址:

阿里云短信服务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;
    }
阿里云短信工具类:

调用短信发送接口前需进行模板的添加以及签名的添加,待审核通过后可进行短信的发送。

java 第三方接口请求超时处理 第三方接口请求提示_HTTPS


java 第三方接口请求超时处理 第三方接口请求提示_服务器_02

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