DocuSign API:在同一信封中发送多个文档的签名问题

2024-01-26

使用 C#,DocuSign API SDK 4.5.2。

我将在同一个信封中寄出 3 份文件以供签名。每个文档将使用相同的服务器模板(它只是使用锚标记将签名元素放置在文档上)。我可以寄出信封,然后从 DocuSign 收到电子邮件以查看/签署文档。

我遇到的问题是,当我去签名时,我必须对每个文档签名 3 次(总共 9 次),然后才能单击“完成”按钮。每份文件上只有 1 个地方可以签名,但我必须点击签名按钮 3 次才能接受。如果我有 2 个收件人,则每个人的金额都是相同的。如果我更改代码以仅发送 1 个文档,则它工作正常,因此很明显在信封请求中未正确生成某些内容。

我还尝试为每个收件人提供不同的 ID 号,即使只有 2 个角色和 2 个不同的姓名/电子邮件地址。

在调用 API 实际发送文档之前,我捕获 JSON 以进行调试:

{
  "compositeTemplates": [
    {
      "compositeTemplateId": "1",
      "document": {
        "documentBase64": "---Document 1 Bytes---",
        "documentId": "1",
        "fileExtension": "pdf",
        "name": "MultiDocument1"
      },
      "inlineTemplates": [
        {
          "recipients": {
            "signers": [
              {
                "email": "[email protected] /cdn-cgi/l/email-protection",
                "name": "Client Name",
                "recipientId": "1",
                "roleName": "Signer1"
              },
              {
                "email": "[email protected] /cdn-cgi/l/email-protection",
                "name": "Advisor Name",
                "recipientId": "2",
                "roleName": "Advisor"
              }
            ]
          },
          "sequence": "2"
        }
      ],
      "serverTemplates": [
        {
          "sequence": "1",
          "templateId": "99321CB1-A3E8-44A0-BDF4-D4F20069BC7B"
        }
      ]
    },
    {
      "compositeTemplateId": "2",
      "document": {
        "documentBase64": "---Document 2 Bytes---",
        "documentId": "2",
        "fileExtension": "pdf",
        "name": "MultiDocument2"
      },
      "inlineTemplates": [
        {
          "recipients": {
            "signers": [
              {
                "email": "[email protected] /cdn-cgi/l/email-protection",
                "name": "Client Name",
                "recipientId": "1",
                "roleName": "Signer1"
              },
              {
                "email": "[email protected] /cdn-cgi/l/email-protection",
                "name": "Advisor Name",
                "recipientId": "2",
                "roleName": "Advisor"
              }
            ]
          },
          "sequence": "2"
        }
      ],
      "serverTemplates": [
        {
          "sequence": "1",
          "templateId": "99321CB1-A3E8-44A0-BDF4-D4F20069BC7B"
        }
      ]
    },
    {
      "compositeTemplateId": "3",
      "document": {
        "documentBase64": "---Document 3 Bytes---",
        "documentId": "3",
        "fileExtension": "pdf",
        "name": "MultiDocument3"
      },
      "inlineTemplates": [
        {
          "recipients": {
            "signers": [
              {
                "email": "[email protected] /cdn-cgi/l/email-protection",
                "name": "Client Name",
                "recipientId": "1",
                "roleName": "Signer1"
              },
              {
                "email": "[email protected] /cdn-cgi/l/email-protection",
                "name": "Advisor Name",
                "recipientId": "2",
                "roleName": "Advisor"
              }
            ]
          },
          "sequence": "2"
        }
      ],
      "serverTemplates": [
        {
          "sequence": "1",
          "templateId": "99321CB1-A3E8-44A0-BDF4-D4F20069BC7B"
        }
      ]
    }
  ],
  "emailSubject": "Multiple Documents for Signature",
  "status": "Sent"
}

这是我正在使用的文档之一。其他两个是相似的——不同的文本,但使用相同的锚标记。

我还尝试替换我在测试文档 1 时成功使用的另一个文档 - 它完全不同,但仍然使用相同的锚标记。我得到了相同的结果——每个签名都必须签名 3 次。

谁能看到我做错了什么吗?如果您需要更多信息,请告诉我。

谢谢, 兰迪

Update:按照 Inbar 和 Larry 的建议,我联系了 DocuSign 支持并将“锚点人口范围”设置从“信封”更改为“文档”。不幸的是,这让事情变得更糟。我仍然需要多次单击签名元素才能签名,但只能签署第一个文档。其他文件没有附加任何签名元素。

更新#2:我想知道我使用模板的方式是否可能令人困惑并导致这些问题。我可能应该更清楚地解释自己。我正在使用的服务器模板有一个“虚拟”Word 文档,其中仅包含一组用于签名和日期的通用锚标记。我将其作为模板上传,并将签名和日期 UI 元素分配给锚标记。但是,当我从应用程序发送请求时,我使用的是在运行时选择/生成的不同文档。该文档替换了模板中的虚拟 Word 文档,但具有相同的锚标记,因此所有签名和日期元素都可以在真实文档中找到其位置。当仅发送 1 个文档时,这非常有效,但我无法让多个文档同时工作。

Update #3: Requirements -- We are adding digital signature capability to our website (ASP.NET, WinForms). We already have a page where an Advisor can either print out a document for a physical signature or start a digital signature process with DocuSign. All our documents come from MS Report Server because they need to contain Client data from our database. We currently do not send out any static documents. In the code behind on the page, I get the PDF bytes from Report Server and add that (as a document) to a composite template to be sent to DocuSign. It also contains a reference to a server template in my account of a Word document (see below) containing the anchor tags and signature elements (mentioned in Update #2) to be overlaid on the Report Server document. What happens is the Report Server document replaces the text of the Word template (like a form background) and because I'm using the same text as anchor tags, the signature elements on the Word template find their match on the Report Server document and move to their positions on the document. I finally include 1 or more names/email addresses of the Clients and usually 2 other required signers (Advisor and Manager). This is then sent to DocuSign (SDK API) to start the signing process. Using a single document, this is working well. We are preparing for when we will need to send more than 1 document to a Client and we'd like to do that in a single request. If you need more info, please let me know. Server-side Word Template


DocuSign 客户服务让我联系了一位非常耐心且乐于助人的开发人员支持代表。我解释了我想要做什么,他能够提出一个可以很容易地集成到我现有的代码库中的解决方案。

为了让它发挥作用,您需要 2 块拼图。上面提到了第一项:您必须将帐户中的 Anchor Population Scope 值设置为“Document”。这必须由 DocuSign 客户服务代表完成,因为用户无法访问该设置。

第二项是导致签名标签全部堆叠在第一个文档上的原因。在复合模板中,内部模板的序列号必须为“1”,服务器模板必须使用序列号“2”。一旦这两个项目就位,我就可以将多个文档发送给单个信封中的多个签名者,每个文档都使用相同的服务器模板(定义 AutoPlace 标签和角色)。

这是适合我的 JSON 示例:

  {
  "compositeTemplates": [
    {
      "compositeTemplateId": "1",
      "inlineTemplates": [
        {
          "documents": [
            {
              "documentBase64": "<PDF Bytes>",
              "documentId": "1",
              "fileExtension": "PDF",
              "name": "MultiDocument1"
            }
          ],
          "recipients": {
            "signers": [
              {
                "email": "[email protected] /cdn-cgi/l/email-protection",
                "name": "Client Name",
                "recipientId": "1",
                "roleName": "Signer1"
              },
              {
                "email": "[email protected] /cdn-cgi/l/email-protection",
                "name": "Advisor Name",
                "recipientId": "2",
                "roleName": "Advisor"
              }
            ]
          },
          "sequence": "1"
        }
      ],
      "serverTemplates": [
        {
          "sequence": "2",
          "templateId": "1234xxxx-xxxx-xxxx-xxxx-xxxxxxxx5678"
        }
      ]
    },
    {
      "compositeTemplateId": "2",
      "inlineTemplates": [
        {
          "documents": [
            {
              "documentBase64": "<PDF Bytes>",
              "documentId": "2",
              "fileExtension": "PDF",
              "name": "MultiDocument2"
            }
          ],
          "recipients": {
            "signers": [
              {
                "email": "[email protected] /cdn-cgi/l/email-protection",
                "name": "Client Name",
                "recipientId": "1",
                "roleName": "Signer1"
              },
              {
                "email": "[email protected] /cdn-cgi/l/email-protection",
                "name": "Advisor Name",
                "recipientId": "2",
                "roleName": "Advisor"
              }
            ]
          },
          "sequence": "1"
        }
      ],
      "serverTemplates": [
        {
          "sequence": "2",
          "templateId": "1234xxxx-xxxx-xxxx-xxxx-xxxxxxxx5678"
        }
      ]
    },
    {
      "compositeTemplateId": "3",
      "inlineTemplates": [
        {
          "documents": [
            {
              "documentBase64": "<PDF Bytes>",
              "documentId": "3",
              "fileExtension": "PDF",
              "name": "MultiDocument3"
            }
          ],
          "recipients": {
            "signers": [
              {
                "email": "[email protected] /cdn-cgi/l/email-protection",
                "name": "Client Name",
                "recipientId": "1",
                "roleName": "Signer1"
              },
              {
                "email": "[email protected] /cdn-cgi/l/email-protection",
                "name": "Advisor Name",
                "recipientId": "2",
                "roleName": "Advisor"
              }
            ]
          },
          "sequence": "1"
        }
      ],
      "serverTemplates": [
        {
          "sequence": "2",
          "templateId": "1234xxxx-xxxx-xxxx-xxxx-xxxxxxxx5678"
        }
      ]
    }
  ],
  "emailSubject": "Multiple Documents for Signatures",
  "status": "Sent"
}

如果您有任何疑问,请告诉我。感谢 Larry K 和 Inbar Gazit 的协助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DocuSign API:在同一信封中发送多个文档的签名问题 的相关文章

  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐