WPS对接HMACSHA256加密

对接WPS使用HMACSHA256加密

Token实体类

package com.api.docbyWps.pojo;

/**
 * @author: 
 * @since: 2023/12/6 21:51
 * @description:
 */
public class TokenPojo {

    //token
    private String accessToken;

    //有效时间戳
    private long expiresTime;

    public TokenPojo() {
    }

    public TokenPojo(String accessToken, long expiresTime) {
        this.accessToken = accessToken;
        this.expiresTime = expiresTime;
    }

    public String getAccessToken() {
        return accessToken;
    }

    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }

    public long getExpiresTime() {
        return expiresTime;
    }

    public void setExpiresTime(long expiresTime) {
        this.expiresTime = expiresTime;
    }
}

加密工具类

package com.api.docbyWps.util;

import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.huawei.shade.org.apache.commons.codec.digest.DigestUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import weaver.file.Prop;
import com.api.docbyWps.pojo.TokenPojo;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
 
/**
 * WPS-3签名,需要引入依赖包
 * <pre>
 * org.apache.commons.commons-lang3
 * commons-codec.commons-codec
 * </pre>
 */
public class WPS4Signature {

    private Logger logger = LoggerFactory.getLogger(WPS4Signature.class);
    public final static String HTTP_HEADER_AUTHORIZATION = "Wps-Docs-Authorization";
    public final static String HTTP_HEADER_DATE = "Wps-Docs-Date";
    public final static String HTTP_HEADER_CONTENT_TYPE = "Content-Type";
    public final static String HTTP_HEADER_Authorization = "Authorization";

    public static volatile TokenPojo tokenInfo;

    private String host;
    private String appId; // 应用id
    private String secretKey; // 应用秘钥

    private String scope;
 
    public WPS4Signature(String appId, String secretKey,String scope,String host) {
        this.appId = appId;
        this.secretKey = secretKey;
        this.scope = scope;
        this.host = host;
    }


    public static String HMACSHA256(String data, String key) throws Exception {
        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"),
                "HmacSHA256");
        sha256_HMAC.init(secret_key);
        byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8"));
        StringBuilder sb = new StringBuilder();
        for (byte item : array) {
            sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1,
                    3));
        }
        return sb.toString();
    }

    /**
     * 利用java原生的摘要实现SHA256加密
     * @param str 加密后的报文
     * @return
     */
    public static String getSHA256StrJava(byte[] str){
        MessageDigest messageDigest;
        String encodeStr = "";
        try {
            messageDigest = MessageDigest.getInstance("SHA-256");
            messageDigest.update(str);
            encodeStr = byte2Hex(messageDigest.digest());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return encodeStr;
    }

    /**
     * 将byte转为16进制
     * @param bytes
     * @return
     */
    private static String byte2Hex(byte[] bytes){
        StringBuffer stringBuffer = new StringBuffer();
        String temp = null;
        for (int i=0;i<bytes.length;i++){
            temp = Integer.toHexString(bytes[i] & 0xFF);
            if (temp.length()==1){
                //1得到一位的进行补0操作
                stringBuffer.append("0");
            }
            stringBuffer.append(temp);
        }
        return stringBuffer.toString();
    }


    /**
     * 获取token
     * @return
     */
    public String getToken(){
        if(tokenInfo == null){
            return getTokenByHttp();
        }
        long expiryTime = tokenInfo.getExpiresTime();
        if(System.currentTimeMillis() >= expiryTime){
            return getTokenByHttp();
        }
        return tokenInfo.getAccessToken();
    }

    /**
     * 直接获取token
     * @return
     */
    public String getTokenByHttp(){
        String wpsVer = Prop.getPropValue("docPushWps","wpsVer");
        tokenInfo = new TokenPojo();
        //封装body信息
        Map<String,Object> body = new HashMap<>();
        body.put("grant_type","client_credentials"); //客户端类型
        body.put("scope",scope);

        //获取uri路径
        String path =  host + "";
        //签名url
        String signatureUrl = "";
        String contentType = "application/x-www-form-urlencoded";
        //日期格式化
        Date nowDate = new Date();
        DateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
        dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
        String date = dateFormat.format(new Date());
        //byte 加密
        String signatureBody = "grant_type=client_credentials&scope=" + scope;
        String sha256body = getSHA256StrJava(signatureBody.getBytes());
        String signature = null;
        try {
            //加密
            signature = HMACSHA256(wpsVer + "POST" + signatureUrl +
                    contentType + date + sha256body,secretKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //头部信息
        Map<String, String> headers = new HashMap<>();
        headers.put(HTTP_HEADER_CONTENT_TYPE, contentType);
        headers.put(HTTP_HEADER_DATE,date);
        headers.put(HTTP_HEADER_AUTHORIZATION, String.format(wpsVer + " %s:%s", appId, signature));

        String access_token = "";
        try {
            logger.info("头部信息:"+JSON.toJSONString(headers));
            logger.info("body信息:"+JSON.toJSONString(body));
            logger.info("请求路径:"+path);
            //请求
            String getTokenStr = HttpUtil.createPost(path).addHeaders(headers).form(body).execute().body();


            logger.info("【获取Token】请求结果:" + getTokenStr);
            JSONObject jsonObject = JSON.parseObject(getTokenStr);
            String code = jsonObject.getString("code");
            if ("0".equals(code)){
                access_token = jsonObject.getString("access_token");
                tokenInfo.setAccessToken(access_token);
                long expires_in = Long.parseLong(jsonObject.getString("expires_in")); //有效时间戳
                //设置token有效时间戳
                long token_date = nowDate.getTime() + expires_in * 1000 ; //有效时间 ,秒
                tokenInfo.setExpiresTime(token_date);
            }else {
                String msg = jsonObject.getString("msg");
                logger.info("【获取Token】请求失败:{}" + msg);
            }
        }catch (Exception e){
            e.printStackTrace();
            logger.info("【获取Token】请求失败:{}" + e.getMessage());
        }
        return access_token;
    }

    /**
     * 推送WPS
     * @param pushJson
     * @return
     */
    public String pushData(String pushJson){
        String wpsVer = Prop.getPropValue("docPushWps","wpsVer");
//        String host = Prop.getPropValue("docPushWps","wpsHost");
        String url = host + "";

        String method = "POST";
        String signatureUrl = ""; //签名url
        String contentType = "application/json";
        String token = getToken();

        //日期格式化
        DateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
        dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
        String date = dateFormat.format(new Date());
        //去空格
        String signatureBody = pushJson.replaceAll("\\s*", "");
        String sha256body = DigestUtils.sha256Hex(signatureBody);
        String signature = null;
        try {
            //加密
            signature = HMACSHA256(wpsVer + method + signatureUrl +
                    contentType + date + sha256body,secretKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //头部信息
        Map<String, String> headers = new HashMap<>();
        headers.put(HTTP_HEADER_CONTENT_TYPE, contentType);
        headers.put(HTTP_HEADER_DATE,date);
        headers.put(HTTP_HEADER_AUTHORIZATION, String.format(wpsVer + " %s:%s", appId, signature));
        headers.put(HTTP_HEADER_Authorization, "Bearer "+ token);
        String pushStr = "";
        try {
            pushStr = HttpUtil.createPost(url).addHeaders(headers).body(signatureBody).execute().body();
            logger.info("【推送WPS】请求结果:{}",pushStr);
        }catch (Exception e){
            e.printStackTrace();
            logger.info("【推送WPS】请求失败:{}",e.getMessage());
        }
        return pushStr;
    }
}

调用示例

WPS4Signature wps4Signature =  new WPS4Signature(appId,appSecret,scope,host);
 String resultStr = wps4Signature.pushData(JSON.toJSONString(docInfos));
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值