无需OAuth,如何生成DocuSign Clickwrap已签署协议的客户下载链接
解决方案:无需客户操作API令牌的DocuSign签署合同下载方案
核心思路
所有需要DocuSign API鉴权的操作都在你的后端服务器完成,前端只负责触发下载请求,客户全程无需接触API令牌或DocuSign的接口细节。
具体实现方案
方案1:后端预生成临时下载链接
- 当客户通过前端JS完成签署后,通过两种方式获取
agreementId:- 前端监听DocuSign Clickwrap的签署成功回调,把
agreementId传给后端 - 配置DocuSign Webhook,签署完成后自动把
agreementId等信息推送到你的后端接口
- 前端监听DocuSign Clickwrap的签署成功回调,把
- 后端使用自己的集成密钥(Integration Key),通过JWT或密码授权模式获取DocuSign API令牌(全程后端操作,无前端暴露)
- 调用DocuSign的下载接口
/clickapi/v1/accounts/{accountId}/clickwraps/{clickwrapId}/agreements/{agreementId}/download,获取签署文件的流 - 将文件存储到你的服务器或云存储,生成带有效期的公开下载链接,返回给前端展示给客户
方案2:后端代理下载接口
- 前端给客户展示「下载合同」按钮,点击后请求你自己的后端接口(例如
/api/download-docusign),携带agreementId参数 - 后端收到请求后,先完成DocuSign API令牌的获取(后端内部处理)
- 调用DocuSign下载接口拿到文件流,直接将文件作为HTTP响应返回给前端,浏览器自动触发下载
代码示例
后端(Node.js 示例)
const axios = require('axios'); // 获取DocuSign API令牌(JWT模式,需提前配置集成密钥与私钥) async function getDocusignAccessToken() { // 此处省略JWT构造逻辑,参考DocuSign官方文档生成合法的JWT断言 const jwtAssertion = '你的JWT断言内容'; const tokenRes = await axios.post('https://account-d.docusign.com/oauth/token', { grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer', assertion: jwtAssertion }); return tokenRes.data.access_token; } // 代理下载接口 async function handleDownloadRequest(req, res) { const { agreementId, accountId, clickwrapId } = req.query; const accessToken = await getDocusignAccessToken(); // 调用DocuSign下载接口 const downloadRes = await axios.get( `https://demo.docusign.net/clickapi/v1/accounts/${accountId}/clickwraps/${clickwrapId}/agreements/${agreementId}/download`, { headers: { Authorization: `Bearer ${accessToken}` }, responseType: 'stream' } ); // 设置响应头触发浏览器下载 res.setHeader('Content-Disposition', 'attachment; filename="已签署合同.pdf"'); downloadRes.data.pipe(res); } // 注册路由(示例用Express) // app.get('/api/download-docusign', handleDownloadRequest);
前端触发下载示例
// 假设签署成功后已获取agreementId const agreementId = '客户签署对应的agreementId'; const downloadBtn = document.getElementById('download-agreement-btn'); downloadBtn.addEventListener('click', () => { // 跳转到后端代理接口,触发下载 window.location.href = `/api/download-docusign?agreementId=${agreementId}&accountId=你的DocuSign账户ID&clickwrapId=你的ClickwrapID`; });
关键注意事项
- 绝对禁止将DocuSign的集成密钥、API密钥或令牌暴露给前端,避免账户安全风险
- 可给临时下载链接设置有效期(如1小时),防止链接被滥用
- 若使用Webhook,需验证DocuSign的请求签名,确保请求来自官方,避免伪造数据
内容的提问来源于stack exchange,提问作者dtanon
相关产品推荐
相关产品推荐

