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

如何在DocuSign中添加多签署人并通过C# Web API启动签署仪式

问题排查与解决方案

1. 多签署人配置失效问题

先看你代码里的核心错误:给第二个签署人nsigner添加SignHere标签时,你把signHere2.RecipientId设成了"1",这会导致这个签名框被错误关联到第一个签署人,而非第二个!这就是多签署人配置不生效的关键原因。

修正后的代码片段

// 第一个签署人配置(原有逻辑保留)
DocuSign.eSign.Model.Signer signer = new DocuSign.eSign.Model.Signer();
signer.Email = recipientEmail;
signer.Name = recipientName;
signer.RecipientId = "1";
signer.ClientUserId = "1000";
signer.Tabs = new Tabs();
signer.Tabs.SignHereTabs = new List<SignHere>();

// 第二个签署人配置(修正RecipientId关联)
DocuSign.eSign.Model.Signer nsigner = new DocuSign.eSign.Model.Signer();
nsigner.Email = "XXX@gmail.com";
nsigner.Name = "XXX";
nsigner.RecipientId = "2";
nsigner.ClientUserId = "2000";
nsigner.Tabs = new Tabs();
nsigner.Tabs.SignHereTabs = new List<SignHere>();

for (int i = 1; i <= numberOfPages; i++) {
    // 第一个签署人的签名框(原有逻辑保留)
    SignHere signHere1 = new SignHere();
    signHere1.DocumentId = "1";
    signHere1.PageNumber = i.ToString();
    signHere1.RecipientId = "1"; // 正确关联第一个签署人
    signHere1.XPosition = "450";
    signHere1.YPosition = "20";
    signer.Tabs.SignHereTabs.Add(signHere1);

    // 第二个签署人的签名框(修正RecipientId为"2")
    SignHere signHere2 = new SignHere();
    signHere2.DocumentId = "1";
    signHere2.PageNumber = i.ToString();
    signHere2.RecipientId = "2"; // 必须与第二个签署人的RecipientId一致!
    signHere2.XPosition = "300";
    signHere2.YPosition = "30";
    nsigner.Tabs.SignHereTabs.Add(signHere2);
}

// 添加签署人到收件人列表(原有逻辑保留)
envDef.Recipients = new DocuSign.eSign.Model.Recipients();
envDef.Recipients.Signers = new List<DocuSign.eSign.Model.Signer>();
envDef.Recipients.Signers.Add(signer);
envDef.Recipients.Signers.Add(nsigner);

// 补充:若你的代码未添加文档,需加上这部分
envDef.Documents = new List<Document>();
Document doc = new Document();
doc.DocumentId = "1";
doc.Name = "目标文档.pdf";
doc.DocumentBase64 = Convert.ToBase64String(File.ReadAllBytes("本地文档路径"));
envDef.Documents.Add(doc);

额外注意事项

  • 若需要指定签署顺序,可给每个签署人设置RoutingOrder属性,比如signer.RoutingOrder = "1";、nsigner.RoutingOrder = "2";,这样第一个签署人完成后才会通知第二个;无需顺序则设置相同的RoutingOrder即可。
  • ClientUserId需保证唯一,且仅需给需要嵌入式签署的签署人设置该属性。

2. 嵌入式签署会话在远程服务器上无法运行的问题

你用System.Diagnostics.Process.Start("chrome.exe", recipientView.Url);的方式完全错误,原因如下:

  • 远程服务器无桌面交互环境,无法启动本地浏览器进程;
  • 该代码在服务器端执行,启动的是服务器上的Chrome,而非用户本地浏览器,完全不符合嵌入式签署的逻辑。

正确解决方案

嵌入式签署的recipientView.Url是前端跳转链接,你需要把这个URL返回给Web API的调用端(比如前端页面),让前端通过JavaScript触发跳转或打开新标签页来启动签署仪式。

示例Web API控制器方法:

[HttpPost]
public IActionResult InitiateEmbeddedSigning()
{
    // 省略获取recipientView的逻辑...
    
    // 直接返回签署URL给前端,不要调用Process.Start
    return Ok(new { SigningUrl = recipientView.Url });
}

前端跳转示例:

// 前端通过AJAX调用API
fetch('/api/InitiateEmbeddedSigning', { method: 'POST' })
    .then(res => res.json())
    .then(data => {
        // 跳转到签署页面
        window.location.href = data.SigningUrl;
        // 或打开新标签页
        // window.open(data.SigningUrl, '_blank');
    });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:02:40