为什么在嵌入式仪式期间不填充 DocuSign 自定义字段

Why aren't DocuSign Custom Fields populating during embedded ceremony

我在 DocuSign 管理控制台上创建了一个模板,其中包含一些只读自定义字段。当我通过 eSignature REST API 使用此模板创建信封时,我希望这些自定义字段为每次签名填充个性化数据(例如姓名、地址、贷款编号)。这就像对 MS Word 文档进行邮件合并以对其进行个性化设置,然后使用合并后的文档进行签名。

按照 https://developers.docusign.com/docs/esign-rest-api/how-to/set-envelope-tab-values 中的示例,我将自定义字段的所有数据包含在我的信封创建 API 请求中作为文本选项卡。我代码中文本选项卡的 tabLabel 属性 与 DocuSign 控制台模板中自定义字段的数据标签 属性 匹配。该示例和我的代码之间的主要区别在于,该示例包含文档并指定选项卡在该文档中的位置,而我的代码引用的是带有控制台上已存在的自定义字段(文本选项卡)的模板,因此不存在在请求中包含文档或选项卡的位置。

如果我指定我想要一个远程仪式(签名者收到一封带有 link 的电子邮件,links 会将他们带到 DocuSign 进行签名),正在签名的文档具有自定义使用我的数据正确填充的字段。如果我指定我想要一个嵌入式仪式(签名者在我的网站上单击 link,我从 DocuSign 请求一个嵌入式客户端视图,然后将签名者定向到该客户端视图),正在签名的文档没有自定义领域的所有。它甚至不显示自定义字段的默认占位符值。谁能帮我弄清楚我做错了什么?是否可以像我正在尝试的那样在嵌入式仪式中填充自定义字段?为什么他们会在远程仪式而不是嵌入式仪式上工作?

我构建信封的代码如下:

private static EnvelopeDefinition CreateEnvelopeFromTemplate(MyAppSettings appSettings, MyRequest req)
{
    var eventNotification = new EventNotification()
    {
        EnvelopeEvents = new List<EnvelopeEvent>()
        {
            new EnvelopeEvent() { EnvelopeEventStatusCode = "Sent" },
            new EnvelopeEvent() { EnvelopeEventStatusCode = "Delivered" },
            new EnvelopeEvent() { EnvelopeEventStatusCode = "Declined" },
            new EnvelopeEvent() { EnvelopeEventStatusCode = "Voided" },
            new EnvelopeEvent() { EnvelopeEventStatusCode = "Completed" }
        },
        IncludeCertificateOfCompletion = "true",
        IncludeDocuments = "true",
        IncludeEnvelopeVoidReason = "true",
        IncludeHMAC = "true",
        IncludeTimeZone = "true",
        LoggingEnabled = "true",
        RecipientEvents = new List<RecipientEvent>()
        {
            new RecipientEvent() { RecipientEventStatusCode = "Sent" },
            new RecipientEvent() { RecipientEventStatusCode = "Delivered" },
            new RecipientEvent() { RecipientEventStatusCode = "Declined" },
            new RecipientEvent() { RecipientEventStatusCode = "Completed" }
        },
        RequireAcknowledgment = "true",
        Url = appSettings.Connect.WebhookUrl
    };

    var textTabs = new List<Text>();
    if (req.DocuSignTemplateData != null && req.DocuSignTemplateData.Count > 0)
    {
        foreach (KeyValuePair<string, string> field in req.DocuSignTemplateData)
        {
            textTabs.Add(new Text(TabLabel: field.Key, Value: field.Value));
        }
    }

    var signers = new List<TemplateRole>();
    foreach (var r in req.Recipients)
    {
        var signer = new TemplateRole();
        if (req.CeremonyType == EMBEDDED_SIGNING)
        {
            signer.EmbeddedRecipientStartURL = $"{appSettings.EmbeddedSigningUrl}{req.CeremonyParams}";
            signer.ClientUserId = r.SSOUserId;
        }
        signer.Email = r.Email;
        signer.Name = r.Name;
        signer.RoleName = r.RoleName;
        signer.RoutingOrder = r.RoutingOrder.ToString();
        if (textTabs.Count > 0)
        {
            signer.Tabs = new Tabs
            {
                TextTabs = textTabs
            };
        }
        signers.Add(signer);
    }

    var env = new EnvelopeDefinition()
    {
        TemplateId = req.DocuSignTemplateId.ToString(),
        TemplateRoles = new List<TemplateRole>(signers),
        EventNotification = eventNotification,
        Status = "Sent"
    };
    return env;
}

为了帮助调试,我会使用 API logging 确切地 查看您的应用发送到 DocuSign 的内容。

您可以使用模板设置带有嵌入式签名的制表符值。但我不确定您是否可以使用 role 对象来这样做。相反,请使用复合模板模式。

这是使用模板的 working example 并且:

  1. 设置签名者角色以使用嵌入式签名
  2. 正在设置制表符值。

请注意,您可以使用 API Request Builder 应用中的 Change language 按钮让它为您生成 C# 代码。

您可能会发现我关于使用模板的 blog post 也很有用。