You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Salesforce集成DocuSign实现文档合并功能的技术支持请求

实现基于DocuSign的Salesforce联系人多文档合并方案

一、创建联系人自定义按钮

  • 选择Lightning Web Component(LWC)按钮(比Visualflex更适配现代Salesforce环境),标签设为Merge Document
  • 配置按钮仅在联系人记录详情页显示,通过组件的recordId属性自动获取当前联系人ID

二、获取联系人关联的Files文档

在Apex控制器中通过关联查询拉取目标文件,过滤DocuSign支持的格式:

public static List<ContentDocumentLink> getContactFiles(Id contactId) {
    return [SELECT ContentDocument.Title, 
                   ContentDocument.LatestPublishedVersionId, 
                   ContentDocument.LatestPublishedVersion.VersionData
            FROM ContentDocumentLink
            WHERE LinkedEntityId = :contactId
            AND ContentDocument.FileType IN ('PDF', 'DOCX', 'DOC', 'RTF')]; // 限定支持合并的文件类型
}

将文件的VersionData转为Base64格式,供后续API调用使用

三、调用DocuSign API完成文档合并

核心用Envelopes: create接口,无需签名流程直接生成合并信封:

关键配置:

  • 设置status为completed(跳过签名环节,直接完成合并)
  • 不添加recipients节点,因为无需签名参与
  • 每个文件作为独立document对象传入

示例Apex调用代码:

public static Id createMergeEnvelope(String accessToken, String accountId, List<ContentDocumentLink> fileList) {
    // 构建请求JSON
    String envelopePayload = '{"status": "completed", "documents": [';
    
    for(Integer i=0; i<fileList.size(); i++) {
        ContentDocumentLink cdl = fileList[i];
        String base64Content = EncodingUtil.base64Encode(cdl.ContentDocument.LatestPublishedVersion.VersionData);
        
        envelopePayload += String.format('{"documentId": "{0}", "name": "{1}", "fileExtension": "{2}", "documentBase64": "{3}"}',
            new List<String>{String.valueOf(i+1), cdl.ContentDocument.Title, cdl.ContentDocument.FileType, base64Content});
        
        if(i != fileList.size()-1) envelopePayload += ',';
    }
    envelopePayload += ']}';
    
    // 发送API请求
    HttpRequest req = new HttpRequest();
    req.setEndpoint('https://demo.docusign.net/restapi/v2.1/accounts/' + accountId + '/envelopes');
    req.setMethod('POST');
    req.setHeader('Authorization', 'Bearer ' + accessToken);
    req.setHeader('Content-Type', 'application/json');
    req.setBody(envelopePayload);
    
    Http http = new Http();
    HttpResponse res = http.send(req);
    
    // 解析返回的信封ID
    if(res.getStatusCode() == 201) {
        return (Id)JSON.deserializeUntyped(res.getBody()).get('envelopeId');
    }
    throw new CalloutException('DocuSign envelope creation failed: ' + res.getBody());
}

四、将合并后的文档存入Salesforce Files

调用Envelopes: get document接口拉取合并后的PDF,再创建ContentVersion关联到联系人:

public static void saveMergedDocument(String accessToken, String accountId, Id envelopeId, Id contactId) {
    // 获取合并后的文档
    HttpRequest req = new HttpRequest();
    req.setEndpoint('https://demo.docusign.net/restapi/v2.1/accounts/' + accountId + '/envelopes/' + envelopeId + '/documents/combined');
    req.setMethod('GET');
    req.setHeader('Authorization', 'Bearer ' + accessToken);
    
    Http http = new Http();
    HttpResponse res = http.send(req);
    
    if(res.getStatusCode() == 200) {
        // 创建ContentVersion
        ContentVersion cv = new ContentVersion();
        cv.Title = 'Merged_Doc_' + DateTime.now().format('yyyyMMddHHmmss');
        cv.PathOnClient = cv.Title + '.pdf';
        cv.VersionData = res.getBodyAsBlob();
        cv.Origin = 'H';
        insert cv;
        
        // 关联到联系人
        ContentDocumentLink cdl = new ContentDocumentLink();
        cdl.LinkedEntityId = contactId;
        cdl.ContentDocumentId = [SELECT ContentDocumentId FROM ContentVersion WHERE Id = :cv.Id].ContentDocumentId;
        cdl.ShareType = 'V';
        insert cdl;
    } else {
        throw new CalloutException('Failed to retrieve merged document: ' + res.getBody());
    }
}

五、核心注意事项

  • 用Salesforce Named Credential管理DocuSign认证信息,避免硬编码令牌
  • 确保DocuSign应用权限包含envelopes:create和envelopes:read
  • 添加文件大小校验:DocuSign单信封总文件大小不能超过25MB
  • 增加异常捕获,处理API调用失败、文件格式不兼容等场景

内容的提问来源于stack exchange,提问作者SK SK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 23:17:21