对接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));