Installation
composer require docusign/esign-client
Ensure require_once('vendor/autoload.php'); is included in your Laravel app’s bootstrap (e.g., bootstrap/app.php).
Authentication Setup
.env:
DOCUSIGN_CLIENT_ID=your_client_id
DOCUSIGN_CLIENT_SECRET=your_client_secret
DOCUSIGN_REDIRECT_URI=http://your-app.com/callback
DOCUSIGN_PRIVATE_KEY=-----BEGIN RSA PRIVATE KEY-----\n... (for JWT)
First Use Case: Send a Simple Envelope
use DocuSign\eSign\Model\EnvelopeDefinition;
use DocuSign\eSign\Model\Signer;
use DocuSign\eSign\Model\SignHere;
use DocuSign\eSign\Model\Document;
use DocuSign\eSign\Api\EnvelopesApi;
// Initialize API client (OAuth example)
$apiClient = new \DocuSign\eSign\ApiClient();
$apiClient->setOAuthBasePath('https://account-d.docusign.com/oauth');
$apiClient->setBasePath('https://demo.docusign.net/restapi');
// Authenticate (simplified; use OAuth or JWT in practice)
$apiClient->setDefaultHeader('Authorization', 'Bearer ' . $accessToken);
// Create envelope
$envelopesApi = new EnvelopesApi($apiClient);
$document = new Document('1', 'https://example.com/document.pdf');
$signHere = new SignHere('1', '10', '10', '50', '50');
$signer = new Signer('signer@example.com', 'John Doe', 'signer1', '1', [$signHere]);
$envelopeDefinition = new EnvelopeDefinition('Test Envelope', 'Test Subject', [$document], [$signer]);
$envelopeSummary = $envelopesApi->createEnvelope($accountId, $envelopeDefinition);
Envelope Management
EnvelopesApi::createEnvelope() and EnvelopesApi::updateEnvelope().EnvelopesApi::getEnvelope() and check status (e.g., "completed", "declined").Signer, CarbonCopy, or InPersonSigner.Templates & Bulk Sending
TemplatesApi::createTemplateEnvelope().BulkSendingApi for batch operations (e.g., mass mailouts).Authentication Patterns
ApiClient::requestJWTUserToken() or requestAuthorizationCode().encrypter).ApiClient::requestJWTUserToken() with a private key (store in .env or AWS Secrets Manager).Webhooks
EnvelopeCompleted).Route::post('/docusign/webhook', function (Request $request) {
$payload = $request->json()->all();
// Validate signature, dispatch event, etc.
});
Document Handling
DocumentsApi::uploadDocument() for large files.$tabs = [];
foreach ($users as $user) {
$tabs[] = new \DocuSign\eSign\Model\Text('user_' . $user->id, '100,100,100,100', $user->name);
}
Laravel Service Provider: Bind the SDK to Laravel’s container for dependency injection:
public function register()
{
$this->app->singleton(EnvelopesApi::class, function ($app) {
$apiClient = new \DocuSign\eSign\ApiClient();
$apiClient->setOAuthBasePath(config('docusign.oauth_base_path'));
$apiClient->setBasePath(config('docusign.base_path'));
$apiClient->setDefaultHeader('Authorization', 'Bearer ' . $app['auth']->user()->docusignToken);
return new EnvelopesApi($apiClient);
});
}
Queues for Async Operations:
Dispatch envelope creation to a queue (e.g., SendEnvelopeJob) to avoid timeouts:
SendEnvelopeJob::dispatch($envelopeDefinition)->onQueue('docusign');
Error Handling:
Wrap SDK calls in try-catch blocks and log ApiException details:
try {
$envelope = $envelopesApi->createEnvelope($accountId, $definition);
} catch (\DocuSign\eSign\ApiException $e) {
Log::error('Docusign error: ' . $e->getMessage(), ['error' => $e->getResponseBody()]);
throw new \Exception('Failed to send envelope');
}
Token Expiry
if ($token->isExpired()) {
$refreshedToken = $apiClient->requestRefreshToken(
config('docusign.refresh_token'),
config('docusign.client_id'),
config('docusign.client_secret')
);
}
auth:api token system or a package like spatie/laravel-activitylog to track token lifecycles.Rate Limiting
if ($response->getStatusCode() === 429) {
sleep($response->getHeader('Retry-After'));
retry();
}
Document Size Limits
DocumentsApi::uploadDocument() for large files and chunk uploads if needed.Time Zone Mismatches
config/app.php has 'timezone' => 'UTC' to avoid signing date discrepancies.Sandbox vs. Production
https://demo.docusign.net (Sandbox) vs. https://api.docusign.com (Production).$apiClient->setDebug(true); // Logs requests/responses to STDOUT
EnvelopeValidator to check envelope definitions before sending:
use DocuSign\eSign\Model\EnvelopeValidator;
$validator = new EnvelopeValidator();
$errors = $validator->validateEnvelope($envelopeDefinition);
Custom Models
Extend SDK models (e.g., Signer) to add Laravel-specific logic:
class LaravelSigner extends \DocuSign\eSign\Model\Signer
{
public function __construct(User $user, string $roleName)
{
parent::__construct(
$user->email,
$user->name,
$roleName,
uniqid(),
[]
);
}
}
Middleware for Auth Create Laravel middleware to inject Docusign tokens:
public function handle(Request $request, Closure $next)
{
$request->merge([
'docusign_token' => auth()->user()->docusignToken,
]);
return $next($request);
}
Event Dispatching Trigger Laravel events on Docusign webhook payloads:
event(new EnvelopeCompleted($payload['envelopeId'], $payload['status']));
https://demo.docusign.net/restapihttps://api.docusign.com/restapiHow can I help you explore Laravel packages today?