鉴于我有多个模板,假设:
模板 1:A 和 Manager 需要签名 模板 2:只有 A 需要签名
是否可以将其组合成 1 个信封并在应用程序中显示?
我现在按顺序执行的方式:
* create an envelope for the template 2
* retrieve the uri
* call `POST /accounts/{accountId}/envelopes/{envelopeId}/views/recipient`
with body specifying the return url (back to my site)
* get the embedded signing url
* create another envelope for template 1
* retrieve the uri
* call `POST /accounts/{accountId}/envelopes/{envelopeId}/views/recipient`
with body specifying the return url
(embedded signing url for the above template)
* call `POST /accounts/{accountId}/envelopes/{envelopeId}/views/recipient`
with body specifying the return url
(embedded signing url for the above because it needs different signer)
* retrieve the embedded signing url
* open the embedded signing url on the UI
这种方式的问题是,如果用户在第一个文档上花费的时间太长(超过 5 分钟),则 url 将过期,并且他们无法签署其余文档。
所以,经过一番谷歌搜索,听起来我应该使用复合模板,但我找不到任何关于如何检索嵌入式签名 url 的示例。
注意:我使用的是嵌入式签名,因此我需要能够检索显示签名页面的 url,并且还需要在签名完成后指定返回 url。
更新 我使用 API Explorer 生成正确的 JSON,并且似乎适用于 1 个模板,将尝试多个模板和多个用户。
更新:
我创建了一个 JSON,它运行(两个模板现在都在一个信封中,我可以看到它并签名),但只有一个用户。我怎样才能使它起作用,以便其他人也可以签名?
即:模板1:需要2人在不同的地方签名,模板2:只有1人需要签名
下面是 JSON,带有一些随机变量,例如模板 id
{
"compositeTemplates": [
{
"inlineTemplates": [
{
"customFields": {
"listCustomFields": [
{
"name": "OpportunityId",
"required": "True",
"show": "False",
"value": "2096"
},
{
"name": "DocuInfoId",
"required": "True",
"show": "False",
"value": "2"
}
]
},
"recipients": {
"signers": [
{
"clientUserId": "1",
"email": "someone@email.com",
"name": "Some One",
"recipientId": "1",
"roleName": "Occupant",
"tabs": {
"dateTabs": [
{
"tabLabel": "*ExpDate",
"value": "2/20/2018"
}
],
"listTabs": [
{
"listItems": [
{
"selected": "False",
"text": "True",
"value": "True"
},
{
"selected": "True",
"text": "False",
"value": "False"
}
],
"tabLabel": "ShowCOI"
},
{
"listItems": [
{
"selected": "False",
"text": "Y",
"value": "Y"
},
{
"selected": "True",
"text": "N",
"value": "N"
}
],
"tabLabel": "BillingOption"
}
],
"numberTabs": [
{
"tabLabel": "*ValueOfGoods",
"value": "$5,000.00"
}
],
"radioGroupTabs": [
{
"groupName": "Some Radio",
"radios": [
{
"selected": "false",
"value": "on property"
},
{
"selected": "true",
"value": "off property"
}
]
},
{
"groupName": "ServiceSchedule",
"radios": [
{
"selected": "false",
"value": "Yes"
},
{
"selected": "true",
"value": "No"
}
]
}
],
"textTabs": [
{
"tabLabel": "*SomeLabel",
"value": "SomeValue"
},
{
"tabLabel": "*SomeAddress",
"value": "SomeAddress "
},
]
}
},
{
"clientUserId": "2",
"email": "managerone@email.com",
"name": "Manager One",
"recipientId": "2",
"roleName": "Owner"
}
]
},
"sequence": "1"
}
],
"serverTemplates": [
{
"sequence": "1",
"templateId": "<templateId1>"
}
]
},
{
"inlineTemplates": [
{
"customFields": {
"listCustomFields": [
{
"name": "OpportunityId",
"required": "True",
"show": "False",
"value": "2096"
},
{
"name": "DocuInfoId",
"required": "True",
"show": "False",
"value": "1"
}
]
},
"recipients": {
"signers": [
{
"clientUserId": "1",
"email": "someone@email.com",
"name": "Some One",
"recipientId": "1",
"roleName": "Occupant"
}
]
},
"sequence": "2"
}
],
"serverTemplates": [
{
"sequence": "2",
"templateId": "<templateId2>"
}
]
}
],
"emailSubject": "DocuSign API - Composite Templates",
"eventNotification": {
"envelopeEvents": [
{
"envelopeEventStatusCode": "Sent"
},
{
"envelopeEventStatusCode": "Completed",
"includeDocuments": "true"
}
],
"includeCertificateOfCompletion": "true",
"includeCertificateWithSoap": "false",
"includeDocumentFields": "false",
"includeDocuments": "false",
"includeEnvelopeVoidReason": "false",
"includeSenderAccountAsCustomField": "false",
"includeTimeZone": "true",
"loggingEnabled": "false",
"recipientEvents": [
{
"includeDocuments": "true",
"recipientEventStatusCode": "Completed"
}
],
"requireAcknowledgment": "true",
"signMessageWithX509Cert": "false",
"url": "http://localhost:8080/api/documents/docusign/available",
"useSoapInterface": "false"
},
"status": "sent"
}
我正在使用该函数来检索嵌入的签名 url,uri 来自信封,clientUserId 是本例中的第一个人 1 for someone@email.com。我应该为 manageroneemail 打两次电话吗?
private string GetSignerUrl(string uri, string name, string email, string returnUrl, string clientUserId)
{
string recipientUrl = _baseUrl + uri + "/views/recipient";
RecipientViewRequestModel recipient1 = new RecipientViewRequestModel
{
clientUserId = clientUserId,
authenticationMethod = "email",
email = email,
returnUrl = returnUrl,
userName = name
};
// make call
string recipient1JsonSerialized = Newtonsoft.Json.JsonConvert.SerializeObject(recipient1);
HttpWebRequest request = InitializeRequest(recipientUrl, "POST", recipient1JsonSerialized);
string response = GetResponseBody(request);
string signerUrl = ParseDataFromResponse(response, "url"); // parse signing url
return signerUrl;
}