概述
近期需要在项目中实现在线编辑word文档需求,因此尝试使用WebOfffice实现。官网手册十分详细,也可以加入他们的技术群。群内会有人解答技术问题。免费的方案下同时编辑的文件不多于20个,如果编辑需求量大,需要计费。对于用户较少的小网站来说已经足够使用。
官网手册
https://wwo.wps.cn/docs/introduce/
原理 流程图
来自<https://wwo.wps.cn/docs/introduce/technical-architecture/flow-chart/>
申请账号
申请服务商流程: https://open.wps.cn/apply-developer
填写回调地址,回调域名需要带有协议头,且已部署于外网可访问
签名算法
1.新建Signature.java
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.*;
import static org.apache.commons.codec.binary.Base64.encodeBase64String;
//import static org.apache.tomcat.util.codec.binary.Base64.encodeBase64String;
/*生成signature签名算法*/
public class Signature {
public static String getUrlParam(Map < String, String > params) throws UnsupportedEncodingException {
StringBuilder builder = new StringBuilder();
for (Map.Entry < String, String > entry : params.entrySet()) {
if (builder.length() > 0) {
builder.append('&');
}
builder.append(URLEncoder.encode(entry.getKey(), "utf-8")).append('=').append(URLEncoder.encode(entry.getValue(), "utf-8"));
}
return builder.toString();
}
public static String getSignature(Map < String, String > params, String appSecret) {
//params appSecret 密钥
List < String > keys=new ArrayList();
for (Map.Entry < String, String > entry : params.entrySet()) {
keys.add(entry.getKey());
}
// 将所有参数按 key 的升序排序
Collections.sort(keys, new Comparator<String>() {
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
// 构造签名的源字符串
StringBuilder contents = new StringBuilder("");
for (String key : keys) {
if (key == "_w_signature") {
continue;
}
contents.append(key + "=").append(params.get(key));
System.out.println("key:" + key + ",value:" + params.get(key));
}
contents.append("_w_secretkey=").append(appSecret);
// 进行 hmac sha1 签名
byte[] bytes = hmacSha1(appSecret.getBytes(), contents.toString().getBytes());
// 字符串经过 Base64 编码
String sign = encodeBase64String(bytes);
try {
sign = URLEncoder.encode(sign, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println(sign);
return