为什么在嵌入式仪式期间不填充 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 并且:
- 设置签名者角色以使用嵌入式签名
- 正在设置制表符值。
请注意,您可以使用 API Request Builder 应用中的 Change language
按钮让它为您生成 C# 代码。
您可能会发现我关于使用模板的 blog post 也很有用。
我在 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 并且:
- 设置签名者角色以使用嵌入式签名
- 正在设置制表符值。
请注意,您可以使用 API Request Builder 应用中的 Change language
按钮让它为您生成 C# 代码。
您可能会发现我关于使用模板的 blog post 也很有用。