如何在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
相关产品推荐
相关产品推荐

