Authenticate with Adobe Sign
- Acquire OAuth access tokens to authenticate API requests. Ensure your application has the necessary permissions set up in your Adobe Sign account to interact with documents.
- Use libraries like `IdentityModel` to simplify OAuth 2.0 authentication if needed. This C# package can help manage token requests and storage.
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
public class AdobeSignClient
{
private static readonly HttpClient client = new HttpClient();
public async Task<string> GetAccessToken(string clientId, string clientSecret, string redirectUri, string code)
{
var request = new HttpRequestMessage(HttpMethod.Post, "https://api.na1.echosign.com/oauth/token");
request.Content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("grant_type", "authorization_code"),
new KeyValuePair<string, string>("client_id", clientId),
new KeyValuePair<string, string>("client_secret", clientSecret),
new KeyValuePair<string, string>("redirect_uri", redirectUri),
new KeyValuePair<string, string>("code", code)
});
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
var responseContent = await response.Content.ReadAsStringAsync();
return responseContent; // Handle and parse token
}
}
Create an Agreement
- Build a request to create an agreement, including the necessary document workflow parameters like sender info, recipient details, and document binaries.
- Specify necessary details—such as name, file info, and signer information—according to the Adobe Sign API's `agreementCreationInfo` object structure.
using System.Net.Http;
using System.Text;
public async Task<string> CreateAgreement(string accessToken, string fileId, string recipientEmail)
{
var agreement = new
{
documentCreationInfo = new
{
fileInfos = new[]
{
new { libraryDocumentId = fileId }
},
name = "Example Agreement",
recipientSetInfos = new[]
{
new
{
recipientSetMemberInfos = new[]
{
new { email = recipientEmail }
},
recipientSetRole = "SIGNER"
}
},
signatureType = "ESIGN",
state = "IN_PROCESS"
}
};
var jsonString = JsonConvert.SerializeObject(agreement);
var requestContent = new StringContent(jsonString, Encoding.UTF8, "application/json");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var response = await client.PostAsync("https://api.na1.echosign.com/api/rest/v6/agreements", requestContent);
var responseContent = await response.Content.ReadAsStringAsync();
return responseContent; // Handle and parse response
}
Monitor Signature Status
- Check the status of an agreement using its ID. The Adobe Sign API allows querying for current status to determine if it has been signed.
- Use periodic polling or webhooks for real-time updates. Webhooks can notify your application when a document is signed, eliminating the need for constant polling.
public async Task<string> GetAgreementStatus(string accessToken, string agreementId)
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var response = await client.GetAsync($"https://api.na1.echosign.com/api/rest/v6/agreements/{agreementId}");
var responseContent = await response.Content.ReadAsStringAsync();
return responseContent; // Handle and parse response for status
}
Download Signed Document
- Once an agreement is completed, you can download the signed document by accessing it using its agreement ID and using the associated file API.
- Ensure your application handles storage correctly, complying with privacy and security standards if necessary to store signed documents.
public async Task<byte[]> DownloadSignedDocument(string accessToken, string agreementId)
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var response = await client.GetAsync($"https://api.na1.echosign.com/api/rest/v6/agreements/{agreementId}/documents");
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsByteArrayAsync();
}
Error Handling and Best Practices
- Implement robust error handling such as retries for transient faults, and handle exceptions gracefully by logging them appropriately.
- Securely manage access tokens, ensure they're kept confidential and are refreshed appropriately to prevent downtime in service.