一、开发准备

1、申请服务商

申请服务商流程

2、接入方式

接入方式分为文件预览、文件编辑和文件新建 3 种。

以文件预览为例,文件预览适用于文件已存在公网服务器的场景。

例如接入 Word(文字)预览:https://wwo.wps.cn/office/w/471eba5030?_w_fname=会议纪要.docx&_w_userid=33&_w_appid=d8f99da

之后只要对接方服务端实现相关的接口,就可以开启在线预览的接入:
回调地址 方法 功能 描述
/v1/3rd/file/info GET 获取文件元数据 在预览或编辑的时候,通过接口校验权限并获取文件信息
/v1/3rd/onnotify POST 通知 打开文件时返回通知的接口
关于更详细的文件预览、文件编辑和文件新建可以参考:接入方式

3、服务端接入

服务端快速接入可以查看:服务端

4、前端接入

前端快速接入可以查看:前端

二、逻辑说明

wps开放平台在线编辑只是提供了单纯的网页编辑,并没有存储文件。所有的文件以及数据都是需要对接方通过回调方法进行存储,所有返回文件的地址都是需要通过外网能够访问。所有的参数都必须以_w_为开头。

1、对接方数据库表说明

所有文件信息都需要对接方服务端生成,包括文件id。

a、文件存储表

CREATE TABLE zc_wps_files (
id bigint(20) NOT NULL COMMENT ‘主键’,
name varchar(100) DEFAULT NULL COMMENT ’ 文件名(必须带文件后缀) (必填)’,
version int(11) DEFAULT NULL COMMENT ‘当前版本号,必须大于 0,同时位数小于 11 (必填)’,
size bigint(20) DEFAULT NULL COMMENT ‘文件大小,单位为B(文件真实大小,否则会出现异常) (必填)’,
download_url varchar(255) DEFAULT NULL COMMENT ‘文档下载地址 (必填)’,
preview_pages int(11) DEFAULT NULL COMMENT ‘限制预览页数 (非必填)’,
created datetime DEFAULT NULL COMMENT ‘创建时间’,
creator bigint(20) DEFAULT NULL COMMENT ‘创建人’,
updated datetime DEFAULT NULL COMMENT ‘修改时间’,
updater bigint(20) DEFAULT NULL COMMENT ‘修改人’,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=‘wps文件存储’;

b、文件历史存记录表

CREATE TABLE zc_wps_files_history (
id bigint(20) NOT NULL COMMENT ‘主键’,
file_id bigint(20) DEFAULT NULL COMMENT ‘文件id(对应a表的id)’,
name varchar(100) DEFAULT NULL COMMENT ’ 文件名(必须带文件后缀) (必填)’,
version int(11) DEFAULT NULL COMMENT ‘当前版本号,必须大于 0,同时位数小于 11 (必填)’,
size bigint(20) DEFAULT NULL COMMENT ‘文件大小,单位为B(文件真实大小,否则会出现异常) (必填)’,
download_url varchar(255) DEFAULT NULL COMMENT ‘文档下载地址 (必填)’,
preview_pages int(11) DEFAULT NULL COMMENT ‘限制预览页数 (非必填)’,
created datetime DEFAULT NULL COMMENT ‘创建时间’,
creator bigint(20) DEFAULT NULL COMMENT ‘创建人’,
updated datetime DEFAULT NULL COMMENT ‘修改时间’,
updater bigint(20) DEFAULT NULL COMMENT ‘修改人’,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=‘wps文件历史版本’;

2、前端初始化wps在线编辑说明

window.onload = function() {const jssdk = WebOfficeSDK.config({url: '在线文档预览地址', // 该地址需要后端提供,https://wwo.wps.cn/office/p/xxx});// 如果需要对 iframe 进行特殊的处理,可以通过以下方式拿到 iframe 的 dom 对象console.log(jssdk.iframe);// 打开文档结果jssdk.on('fileOpen', (data) => {console.log(data.success);});
};

在线文档预览地址是通过对接方服务端通过签名等操作返回给前端。
url 规范:https://wwo.wps.cn/office/<:type>/<:fileid>?_w_appid=xxx&_w_signature=xxx&…(对接模块需要的自定义参数)
url 示例:https://wwo.wps.cn/office/w/471eba5030?_w_fname=会议纪要.docx&_w_userid=33&_w_appid=d8f99da

3、签名说明

返回的路径https://wwo.wps.cn/office/<:type>/<:fileid>?_w_appid=xxx&_w_signature=xxx&…(对接模块需要的自定义参数) ,其中的签名(getSignature)需要把返回的参数全部参与签名,要不然会不通过。

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.tomcat.util.codec.binary.Base64.encodeBase64String;public class Signature {public static void main(String args[]) throws UnsupportedEncodingException {Map < String, String > paramMap= new HashMap<>();paramMap.put("_w_appid", "123456");paramMap.put("_w_fname", "222.docx");paramMap.put("_w_userid", "id1000");String signature = getSignature(paramMap, "7890");System.out.println(getUrlParam(paramMap) + "&_w_signature=" + signature);}private 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();}private static String getSignature(Map < String, String > params, String 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 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;}}

4、Java服务回调说明

说明参考官网

a、token说明

token是对接方自己的用户登录生成的,需要前端对接传入

  • 方式一:
    可以通过 jssdk 的方式接入前端,通过 jssdk 的 setToken 接口设置 token,具体细节可以看 jssdk 相关的接入文档。

url 参数带上 _w_tokentype=1(此参数同样需要签名)

jssdk = WebOfficeSDK.config({url: 'your signature url' // url 参数带上_w_tokentype=1,通过 jssdk 方式传入 token
});// 首次设置 token 和后续刷新 token 都是通过调用此 API
jssdk.setToken({token: 'your token'});
  • 方式二:
    通过 WebView 注入 WPS_GetToken 全局函数来传入 token,WebOffice 前端如果检测到有 window.WPS_GetToken 函数,会直接调用该函数获取 token,注意需要 return 回来一个 Object 对象 {token: “your token”}
// 注入WPS_GetToken
function WPS_GetToken(){return {token: "your token"};
};
b、回调接口说明

一般按官网的说明编写回调接口。
上传新版本文件:/v1/3rd/file/save 传参稍微注意点
file官网给的是 body形式传参,其实Java代码则跟query一致

@ApiOperation("上传文件新版本")@PostMapping("file/save")public Map<String, Object> save(HttpServletRequest request, @RequestParam(name = "_w_tenderId") String tenderId, @RequestParam("file") MultipartFile file) {String fileId = request.getHeader("x-weboffice-file-id");String token = request.getHeader("x-wps-weboffice-token");token = "Bearer " + token;Integer version = Integer.parseInt(request.getHeader("x-weboffice-save-version"));WPSFileSaveDTO wpsFileSaveDTO = new WPSFileSaveDTO();wpsFileSaveDTO.setId(fileId);wpsFileSaveDTO.setTenderId(tenderId);wpsFileSaveDTO.setVersion(version);wpsFileSaveDTO.setFile(file);return wpsService.save(wpsFileSaveDTO, token);}

wps在线编辑梳理(此处整理了对接过后容易出错的地方)相关推荐

  1. vue引入 wps在线编辑版,可进行 预览,编辑, 打印等功能。

    项目需求是, 在vue中进行文档管理, 因此最后选择了wps在线编辑版本. 一.使用方法 在官网下载js-sdk js文件 全局引入 import * as WPS from './assets/js ...

  2. vue引入 wps在线编辑版

    1.先去官网下载JS https://wwo.wps.cn/docs-js-sdk/#/base/quick-start 2.main.js import * as WPS from './asset ...

  3. Cordova实现自定义下载插件和WPS在线预览

    Cordova实现自定义下载插件和WPS在线预览 简要描述 点击下载链接,请求URL,判断手机是否安装WPS,如果安装则调用wps在线编辑,没有安装则对文件进行下载,并在通知栏进行通知,显示下载进度( ...

  4. 基于WPS的在线编辑服务【.net Core 3.1】

    很多时候大家都需要用到在线文档编辑服务之类的东西,今天就以WPS的在线编辑为例.[目前仅支持以企业形式申请] 链接WPS开放平台. 效果图如下 用到示例https://github.com/guola ...

  5. wps在线预览接口_金山文档在线编辑 - 快速接入 - 《WPS开放平台技术文档》 - 书栈网 · BookStack...

    快速接入 一.申请和上线流程如下: 1.申请Appid和SecretKey 需要前往https://open.wps.cn 注册服务商,并且申请开通金山文档在线编辑服务. 2.实现回调接口 根据本文档 ...

  6. 在线编辑、在线预览、在线转换,基于wps.js + java + react / vue,无需任何插件,零安装

    基于wps.js在线编辑.在线预览.文档转换前台vue / react,后台java终于开源啦,无需任何插件,零安装,可以直接配置完打包部署,也可直接集成项目中,或者二次开发,后续会不定期更新,有好的 ...

  7. C# 10分钟入门基于WebOffice实现在线编辑文档,实时保存到服务器(所有office,兼容WPS)

    今天,他来了(weboffice在线编辑文档). 上次写了一个在线预览的博,当然,效果并不是太理想,但是紧急解决了当时的问题. 后来,小编重新查找资料,求助大牛,终于使用新的方式替换了之前的low方法 ...

  8. 国产麒麟操作系统调用PageOffice在线编辑保存WPS文档

    ​ 自国家大力推广国产软件以来,麒麟软件的麒麟操作系统在软硬件适配方面不断拓展,整个生态日渐完善,已经基本满足政府.企业等日常办公需求.在Windows系统环境下,PageOffice产品积累了十多年 ...

  9. 国产麒麟系统调用PageOffice在线编辑保存WPS文档

    ​ 自国家大力推广国产软件以来,麒麟软件的麒麟操作系统在软硬件适配方面不断拓展,整个生态日渐完善,已经基本满足政府.企业等日常办公需求.在Windows系统环境下,PageOffice产品积累了十多年 ...

最新文章

  1. Tomcat_7.x压缩版_环境变量配置(亲测有效)
  2. python创造订单_Odoo 10根据销售订单创建项目
  3. C/C++ 中变量的声明、定义、初始化的区别
  4. xiaocms 关于搜索功能 添加搜索字段
  5. 集合框架(九)----Map
  6. 转自: http://blog.csdn.net/xiaxiaorui2003/article/details/3838631
  7. 笨办法学 Python · 续 练习 45:创建 ORM
  8. 免费ftp网站服务器软件,免费ftp服务器软件,免费ftp服务器软件有哪些呢?好用推荐...
  9. 【POJ Challenge】生日礼物 加强m子段和
  10. 史上最全的程序猿工具集(辅助工具、开发工具、技术栈、学习网站、博客论坛)
  11. linux系统安装gcc依赖包,linux安装gcc需要的依赖包
  12. 华三模拟器(路由器)实现ipsec穿越NAT实验
  13. 2019微信语音转发方法新版微信转发语音方法
  14. The overload Pattern
  15. suse linux快捷键,Suse Linux整理大全:快捷键
  16. 代码自动生成-宏递归思想
  17. python matplotlib绘图同时支持宋体和timesnewroman
  18. 第2章 物联网安全基础
  19. json-lib将xml转json报错java.lang.NoClassDefFoundError: nu/xom/ParentNode
  20. PDF生成插件--TcPDF

热门文章

  1. 【Kickstart】2019 Round A - Parcels
  2. 简述Android 解决65536/64K方法数限制方案
  3. IDEA : 2022.1 版本更新内容一览
  4. 日记本java代码_简单的JAVA日记本程序源代码
  5. 1736. Latest Time by Replacing Hidden Digits
  6. 有5个学生,每个学生的数据包括学号、姓名、三门课的成绩,从键盘输入5个学生数据,要求打印出三门课总平均成绩,以及最高分的学生的数据(包括学号、姓名、三门课的成绩、平均分数)。VS2019版
  7. js实现视频直播,结合bilibili开源项目
  8. 服务器和微信公众号的区别,微信小程序和公众号的区别,看这三点就懂了
  9. 室内外地图切换(室内基于ibeacons三点定位)
  10. gif图片该怎么压缩?教你一招快速缩小gif体积的方法