admin管理员组文章数量:1550246
概述
近期需要在项目中实现在线编辑word文档需求,因此尝试使用WebOfffice实现。官网手册十分详细,也可以加入他们的技术群。群内会有人解答技术问题。免费的方案下同时编辑的文件不多于20个,如果编辑需求量大,需要计费。对于用户较少的小网站来说已经足够使用。
官网手册
https://wwo.wps/docs/introduce/
原理 流程图
来自<https://wwo.wps/docs/introduce/technical-architecture/flow-chart/>
申请账号
申请服务商流程: https://open.wps/apply-developer
填写回调地址,回调域名需要带有协议头,且已部署于外网可访问
签名算法
1.新建Signature.java
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.*;
import static org.apachemons.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 o1pareTo(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 sign;
}
public static byte[] hmacSha1(byte[] key, byte[] data) {
try {
SecretKeySpec signingKey = new SecretKeySpec(key, "HmacSHA1");
Mac mac = Mac.getInstance(signingKey.getAlgorithm());
mac.init(signingKey);
return mac.doFinal(data);
}
catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
return null;
}
}
2.生成签名
官网测试示例 https://wwo.wps/docs/server/description-of-signature-algorithm/
"contents": "_w_appid=123456_w_fname=222.docx_w_userid=id1000_w_secretkey=7890"
"signature": "dL3ce9l0l+GKTz+i0R++H2qWwrQ=" (未 URL 编码)
// 官网生成签名 测试示例
public String getSignature() throws UnsupportedEncodingException {
Map< String, String > paramMap= new HashMap<>();
String _w_appid="123456";
String _w_appkey="7890";
paramMap.put("_w_appid", _w_appid);
paramMap.put("_w_fname", "example.doc");
paramMap.put("_w_userid", "id1000");
String signature = Signature.getSignature(paramMap, _w_appkey);//_w_appkey 密钥
System.out.println(Signature.getUrlParam(paramMap) + "&_w_signature=" + signature);
return signature; // "Mo2s%2FL1RdBnIuo%2FuEMC4ZSQyhnk%3D"
}
后端实现回调接口
需要实现文件预览,需要完成以下两个回调接口才能实现。文件编辑与文件新建也是需要完成对应的回调接口。
文件预览
回调地址 | 方法 | 功能 | 描述 |
/v1/3rd/file/info | GET | 获取文件元数据 | 在预览或编辑的时候,通过接口校验权限并获取文件信息 |
/v1/3rd/onnotify | POST | 通知 | 打开文件时返回通知的接口 |
来自 <https://wwo.wps/docs/server/access-mode/>
文件编辑
回调地址 | 方法 | 功能 | 描述 |
/v1/3rd/file/info | GET | 获取文件元数据 | 在预览或编辑的时候,通过接口校验权限并获取文件信息 |
/v1/3rd/user/info | POST | 获取用户信息 | 在编辑的时候获取编辑过此文件的用户信息,展示在协作记录里面 |
/v1/3rd/file/save | POST | 上传文件新版本 | 编辑完保存回对应云盘 |
/v1/3rd/file/online | POST | 通知文件有那些人在协作协作 | 通知此文件目前有那些人正在协作 |
/v1/3rd/file/version/:version | GET | 获取特定版本的文件信息 | 在回滚版本的时候需要获取历史版本的文件信息 |
/v1/3rd/file/rename | PUT | 文件重命名 | 当用户有重命名权限时,重命名时调用的接口 |
/v1/3rd/file/history | POST | 获取所有历史版本文件信息 | 显示在历史版本列表中 |
/v1/3rd/onnotify | POST | 通知 | 打开文件时返回通知的接口 |
来自 <https://wwo.wps/docs/server/access-mode/file-editing/>
文件新建
回调地址 | 方法 | 功能 | 描述 |
/v1/3rd/file/new | POST | 新建文件 | 通过模板新建需要提供的接口 |
来自 <https://wwo.wps/docs/server/access-mode/new-file/>
示例:文件预览-回调接口/v1/3rd/file/info
1.接口地址必须: "域名" + "/v1/3rd/file/info"
2.写接口逻辑
3.返回接口参数必须与官方文档内的数据结构一致
{
file: {
id: "132aa30a87064", //文件id,字符串长度小于40
name: "example.doc", //文件名(必须带文件后缀)
version: 1, //当前版本号,位数小于11
size: 200, //文件大小,单位为B(文件真实大小,否则会出现异常)
creator: "id0", //创建者id,字符串长度小于40
create_time: 1136185445. //创建时间,时间戳,单位为秒
modifier: "id1000", //修改者id,字符串长度小于40
modify_time: 1551409818, //修改时间,时间戳,单位为秒
download_url: "http://www.xxx/v1/file?fid=f132aa30a87064", //自己的文档外网下载地址
preview_pages: 3 //限制预览页数
user_acl: {
rename: 1, //重命名权限,1为打开该权限,0为关闭该权限,默认为0
history: 1, //历史版本权限,1为打开该权限,0为关闭该权限,默认为1
copy: 1, //复制
export: 1, //导出PDF
print: 1 //打印
},
watermark: {
type: 1, //水印类型, 0为无水印; 1为文字水印
value: "禁止传阅", //文字水印的文字,当type为1时此字段必选
fillstyle: "rgba( 192, 192, 192, 0.6 )", //水印的透明度,非必选,有默认值
font: "bold 20px Serif", //水印的字体,非必选,有默认值
rotate: -0.7853982, //水印的旋转度,非必选,有默认值
horizontal: 50, //水印水平间距,非必选,有默认值
vertical: 100 //水印垂直间距,非必选,有默认值
}
},
user: {
id: "id1000", //用户id,长度小于32
name: "wps-1000", //用户名称
permission: "read", //用户操作权限,write:可编辑,read:预览
avatar_url: "http://xxx/id=1000" //用户头像地址
}
}
4.调用地址
https://wwo.wps/office/<:type>/<:fileid>?_w_appid=xxx&_w_signature=xxx&…(对接模块需要的自定义参数)
·必须参数:type值对应文件格式
支持格式 | type 值 | 文件后缀 |
文字文件 | w | doc, dot, wps, wpt, docx, dotx, docm, dotm, rtf |
表格文件 | s | xls, xlt, et, xlsx, xltx, csv, xlsm, xltm |
演示文件 | p | ppt, pptx, pptm, ppsx, ppsm, pps, potx, potm, dpt, dps |
PDF 文件 | f | |
·必须参数:fileid 文件唯一标识id
·必须参数:_w_appid申请的appid
·必须参数:_w_signature 使用Signature生成的签名
·其他参数:根据需要增加参数,需要以“_w_”开头拼接在调用地址中,同时生成签名时要加上参数
·示例:
文件名 _w_fname、用户id _w_userid
url: https://wwo.wps/office/w/132aa30a87064?_w_userid=id1000&_w_appid=123456&_w_fname=example.doc&_w_signature=Mo2s%2FL1RdBnIuo%2FuEMC4ZSQyhnk%3D
来自 <https://wwo.wps/docs/server/access-mode/>
5.访问页面效果
注意事项
- 服务要部署在公网,局域网 内网无法测试使用。
- 回调地址要登录开放平台配置,与官方文档地址要一致
- 对应功能的回调接口要实现,返回数据要与官方文档内的数据结构一致
版权声明:本文标题:java后端尝试使用WebOffice在线编辑 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1727230713a1103593.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论