Struggeling with Formfileds on an agreement
Hi all, I am really struggeling with getting the formfields working from a custom C# app, I have tried adding the formfiels on create of the agreement and nothing show, I have tried the Post and the PUT on "
https://api.na3.adobesign.com:443/api/rest/v6/agreements/{agreementID}/formFields
"Post" returs error "Invalid Agreement ID"
Put Just does not add antying on the agreement, I always only get a signature box on the last page, I want a signature box on each page for mutiple documents, please see my nethod as cureent:
public async Task<string> UploadDocumentsReturnAgreementId(string _OauthUrl, string _ClientId, string _ClientSecret, string _RefreshToken, string _initialApiAccessPoint, string _apiUserEmail, string pstrDelimitedDocumentPaths, string pstrToEmail, long pintProcessInstanceID)
{
try
{
TimeSpan currentTimeOnly = DateTime.Now.TimeOfDay;
string[] larrDocumentPaths = pstrDelimitedDocumentPaths.Split('|');
List<string> pstrDocumentPaths = new List<string>(larrDocumentPaths);
_bearerToken = RefreshToken(_OauthUrl, _ClientId, _ClientSecret, _RefreshToken);
_apiAccessPoint = await GetApiAccessPoint(_initialApiAccessPoint, _bearerToken);
_apiAccessPoint = _apiAccessPoint.Replace(".com/", ".com");
var transientDocumentIds = new List<string>();
var pageCounts = new List<int>();
// Upload documents and get transient document IDs
foreach (var documentPath in pstrDocumentPaths)
{
if (!String.IsNullOrEmpty(documentPath))
{
var pageCount = GetPageCount(documentPath);
pageCounts.Add(pageCount);
var request = (HttpWebRequest)WebRequest.Create($"{_apiAccessPoint}/api/rest/v6/transientDocuments");
request.Method = "POST";
request.Headers["Authorization"] = $"Bearer {_bearerToken}";
request.Headers["x-api-user"] = "email:" + _apiUserEmail;
var boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
request.ContentType = $"multipart/form-data; boundary={boundary}";
using (var requestStream = request.GetRequestStream())
{
var fileHeader = Encoding.ASCII.GetBytes($"\r\n--{boundary}\r\nContent-Disposition: form-data; name=\"File\"; filename=\"{Path.GetFileName(documentPath)}\"\r\nContent-Type: application/octet-stream\r\n\r\n");
requestStream.Write(fileHeader, 0, fileHeader.Length);
var fileBytes = File.ReadAllBytes(documentPath);
requestStream.Write(fileBytes, 0, fileBytes.Length);
var boundaryBytes = Encoding.ASCII.GetBytes($"\r\n--{boundary}--\r\n");
requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
}
using (var response = (HttpWebResponse)request.GetResponse())
using (var reader = new StreamReader(response.GetResponseStream()))
{
var responseContent = reader.ReadToEnd();
var transientDocumentId = JObject.Parse(responseContent)["transientDocumentId"].ToString();
transientDocumentIds.Add(transientDocumentId);
}
}
}
// Create agreement without form fields
var agreementRequest = (HttpWebRequest)WebRequest.Create($"{_apiAccessPoint}/api/rest/v6/agreements");
agreementRequest.Method = "POST";
agreementRequest.Headers["Authorization"] = $"Bearer {_bearerToken}";
agreementRequest.Headers["x-api-user"] = "email:" + _apiUserEmail;
agreementRequest.ContentType = "application/json";
var fileInfos = transientDocumentIds.Select(id => new { transientDocumentId = id }).ToArray();
var agreementBody = new
{
fileInfos = fileInfos,
name = "FC Agreement " + pintProcessInstanceID.ToString() + "-" + currentTimeOnly.ToString(),
participantSetsInfo = new[]
{
new
{
memberInfos = new[] { new { email = pstrToEmail } },
order = 1,
role = "SIGNER"
}
},
signatureType = "ESIGN",
state = "AUTHORING"
};
using (var agreementStream = agreementRequest.GetRequestStream())
{
var bodyBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(agreementBody));
agreementStream.Write(bodyBytes, 0, bodyBytes.Length);
}
string agreementId;
using (var agreementResponse = (HttpWebResponse)agreementRequest.GetResponse())
using (var reader = new StreamReader(agreementResponse.GetResponseStream()))
{
var agreementResponseContent = reader.ReadToEnd();
agreementId = JObject.Parse(agreementResponseContent)["id"].ToString();
}
// Use PUT request for form fields with new schema
var formFieldsRequest = (HttpWebRequest)WebRequest.Create($"{_apiAccessPoint}/api/rest/v6/agreements/{agreementId}/formFields");
formFieldsRequest.Method = "PUT";
formFieldsRequest.Headers["Authorization"] = $"Bearer {_bearerToken}";
formFieldsRequest.Headers["x-api-user"] = "email:" + _apiUserEmail;
formFieldsRequest.ContentType = "application/json";
var fields = new List<object>();
for (int i = 0; i < transientDocumentIds.Count; i++)
{
int numPages = pageCounts[i];
for (int page = 1; page <= numPages; page++)
{
fields.Add(new
{
locations = new[]
{
new
{
height = 30,
left = 162,
pageNumber = page,
top = 100,
width = 280
}
},
name = $"Signature (Document-{i + 1}, Page-{page})",
alignment = "LEFT",
backgroundColor = "TRANSPARENT",
borderColor = "BLACK",
borderStyle = "SOLID",
borderWidth = 1,
calculated = false,
conditionalAction = new
{
action = "SHOW",
anyOrAll = "ANY",
predicates = new[]
{
new
{
fieldLocationIndex = 1,
fieldName = "test 1",
value = ""
}
}
},
contentType = "SIGNATURE",
inputType = "SIGNATURE",
readOnly = false,
required = true,
visible = true
});
}
}
var formFieldsBody = new { fields };
using (var formFieldsStream = formFieldsRequest.GetRequestStream())
{
var formFieldsBodyBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(formFieldsBody));
formFieldsStream.Write(formFieldsBodyBytes, 0, formFieldsBodyBytes.Length);
}
using (var formFieldsResponse = (HttpWebResponse)formFieldsRequest.GetResponse())
using (var formFieldsReader = new StreamReader(formFieldsResponse.GetResponseStream()))
{
var formFieldsResponseContent = formFieldsReader.ReadToEnd();
Console.WriteLine($"Form fields added: {formFieldsResponseContent}");
}
// Send the agreement for signing
var sendRequest = (HttpWebRequest)WebRequest.Create($"{_apiAccessPoint}/api/rest/v6/agreements/{agreementId}/state");
sendRequest.Method = "PUT";
sendRequest.Headers["Authorization"] = $"Bearer {_bearerToken}";
sendRequest.ContentType = "application/json";
var sendBody = new { state = "IN_PROCESS" };
using (var sendStream = sendRequest.GetRequestStream())
{
var sendBodyBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(sendBody));
sendStream.Write(sendBodyBytes, 0, sendBodyBytes.Length);
}
using (var sendResponse = (HttpWebResponse)sendRequest.GetResponse())
using (var sendReader = new StreamReader(sendResponse.GetResponseStream()))
{
var sendResponseContent = sendReader.ReadToEnd();
Console.WriteLine($"Agreement sent for signing: {sendResponseContent}");
}
return agreementId;
}
catch (Exception ex)
{
return "Error:" + ex.Message;
}
}
