Laravel E-Signature using Docusign API Tutorial
Hi,
I am going to explain to you example of laravel docusign integration. I explained simply about how to integrate docusign in laravel. you will learn laravel docusign api example. I explained simply about laravel electronic signature docusign.
DocuSign is used for electronic signature for your pdf document. DocuSign is a popular and trusted e-signature website. DocuSign also provides API to integrate embedded digital signs with your website.
In this example, we will simply create a developer account with DocuSign. Then we will integrate the embedded signing document process with laravel. we will create routes and controllers to implement DocuSign API. we will add one sample pdf file with two signature options. you need to follow the below step to do a simple example.
You can integrate electronic signature in laravel 6, laravel 7, laravel 8, laravel 9, laravel 10 and laravel 11 versions with DocuSign.
Step 1: Install Laravel
This is optional; however, if you have not created the laravel app, then you may go ahead and execute the below command:
composer create-project laravel/laravel example-app
Step 2: Install Docusign Package
Here, we need to install docusign/esign-client package provides a quick way to use DocuSign api. run the below command:
composer require docusign/esign-client
Step 3: Set Docusign API and Secret
In this step, we need DOCUSIGN_BASE_URL, DOCUSIGN_ACCOUNT_ID, DOCUSIGN_CLIENT_ID and DOCUSIGN_CLIENT_SECRET to access docusign api.
So, first we need to create developer account in Docusign Website.
Let's Click Here to create developer account.
After creating successfully account, go to setting page and copy API Account ID, that we need to paste in .env file.
next, create application to click on "Add App and Integrate Key" button. then create new app.
After creating application then you need to copy Integration Key and Secret Key.
Note: You must have to add callback URL in your docusign, so they can redirect on back to laravel app.
Next, you need to add app key and secret add on .env file as like the below:
.env
DOCUSIGN_BASE_URL=https://demo.docusign.net/restapi
DOCUSIGN_ACCOUNT_ID=2f178ddb...
DOCUSIGN_CLIENT_ID=083f0167...
DOCUSIGN_CLIENT_SECRET=674f6d3d...
Step 4: Create Routes
In this step, we will create new routes for docusign process. you can see the below routes:
routes/web.php
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\DocusignController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::get('docusign',[DocusignController::class, 'index'])->name('docusign');
Route::get('connect-docusign',[DocusignController::class, 'connectDocusign'])->name('connect.docusign');
Route::get('docusign/callback',[DocusignController::class,'callback'])->name('docusign.callback');
Route::get('sign-document',[DocusignController::class,'signDocument'])->name('docusign.sign');
Step 5: Create Controller
Here, we will create DocusignController with all the methods.
Then you need to download sample PDF file from Here and add on public/doc folder.
so let's copy the below code and add to controller file:
app/Http/Controllers/DocusignController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use DocuSign\eSign\Configuration;
use DocuSign\eSign\Api\EnvelopesApi;
use DocuSign\eSign\Client\ApiClient;
use Illuminate\Support\Facades\Http;
use Exception;
use Session;
class DocusignController extends Controller
{
private $config, $args, $signer_client_id = 1000;
/**
* Show the html page
*
* @return render
*/
public function index()
{
return view('docusign');
}
/**
* Connect your application to docusign
*
* @return url
*/
public function connectDocusign()
{
try {
$params = [
'response_type' => 'code',
'scope' => 'signature',
'client_id' => env('DOCUSIGN_CLIENT_ID'),
'state' => 'a39fh23hnf23',
'redirect_uri' => route('docusign.callback'),
];
$queryBuild = http_build_query($params);
$url = "https://account-d.docusign.com/oauth/auth?";
$botUrl = $url . $queryBuild;
return redirect()->to($botUrl);
} catch (Exception $e) {
return redirect()->back()->with('error', 'Something Went wrong !');
}
}
/**
* This function called when you auth your application with docusign
*
* @return url
*/
public function callback(Request $request)
{
$response = Http::withBasicAuth(env('DOCUSIGN_CLIENT_ID'), env('DOCUSIGN_CLIENT_SECRET'))
->post('https://account-d.docusign.com/oauth/token', [
'grant_type' => 'authorization_code',
'code' => $request->code,
]);
$result = $response->json();
$request->session()->put('docusign_auth_code', $result['access_token']);
return redirect()->route('docusign')->with('success', 'Docusign Successfully Connected');
}
/**
* Write code on Method
*
* @return response()
*/
public function signDocument()
{
try{
$this->args = $this->getTemplateArgs();
$args = $this->args;
$envelope_args = $args["envelope_args"];
/* Create the envelope request object */
$envelope_definition = $this->makeEnvelopeFileObject($args["envelope_args"]);
$envelope_api = $this->getEnvelopeApi();
$api_client = new \DocuSign\eSign\client\ApiClient($this->config);
$envelope_api = new \DocuSign\eSign\Api\EnvelopesApi($api_client);
$results = $envelope_api->createEnvelope($args['account_id'], $envelope_definition);
$envelopeId = $results->getEnvelopeId();
$authentication_method = 'None';
$recipient_view_request = new \DocuSign\eSign\Model\RecipientViewRequest([
'authentication_method' => $authentication_method,
'client_user_id' => $envelope_args['signer_client_id'],
'recipient_id' => '1',
'return_url' => $envelope_args['ds_return_url'],
'user_name' => 'savani', 'email' => 'savani@gmail.com'
]);
$results = $envelope_api->createRecipientView($args['account_id'], $envelopeId, $recipient_view_request);
return redirect()->to($results['url']);
} catch (Exception $e) {
dd($e->getMessage());
}
}
/**
* Write code on Method
*
* @return response()
*/
private function makeEnvelopeFileObject($args)
{
$docsFilePath = public_path('doc/demo_pdf_new.pdf');
$arrContextOptions=array(
"ssl"=>array(
"verify_peer"=>false,
"verify_peer_name"=>false,
),
);
$contentBytes = file_get_contents($docsFilePath, false, stream_context_create($arrContextOptions));
/* Create the document model */
$document = new \DocuSign\eSign\Model\Document([
'document_base64' => base64_encode($contentBytes),
'name' => 'Example Document File',
'file_extension' => 'pdf',
'document_id' => 1
]);
/* Create the signer recipient model */
$signer = new \DocuSign\eSign\Model\Signer([
'email' => 'savani@gmail.com',
'name' => 'savani',
'recipient_id' => '1',
'routing_order' => '1',
'client_user_id' => $args['signer_client_id']
]);
/* Create a signHere tab (field on the document) */
$signHere = new \DocuSign\eSign\Model\SignHere([
'anchor_string' => '/sn1/',
'anchor_units' => 'pixels',
'anchor_y_offset' => '10',
'anchor_x_offset' => '20'
]);
/* Create a signHere 2 tab (field on the document) */
$signHere2 = new \DocuSign\eSign\Model\SignHere([
'anchor_string' => '/sn2/',
'anchor_units' => 'pixels',
'anchor_y_offset' => '40',
'anchor_x_offset' => '40'
]);
$signer->settabs(new \DocuSign\eSign\Model\Tabs(['sign_here_tabs' => [$signHere, $signHere2]]));
$envelopeDefinition = new \DocuSign\eSign\Model\EnvelopeDefinition([
'email_subject' => "Please sign this document sent from the ItSlutionStuff.com",
'documents' => [$document],
'recipients' => new \DocuSign\eSign\Model\Recipients(['signers' => [$signer]]),
'status' => "sent",
]);
return $envelopeDefinition;
}
/**
* Write code on Method
*
* @return response()
*/
public function getEnvelopeApi(): EnvelopesApi
{
$this->config = new Configuration();
$this->config->setHost($this->args['base_path']);
$this->config->addDefaultHeader('Authorization', 'Bearer ' . $this->args['ds_access_token']);
$this->apiClient = new ApiClient($this->config);
return new EnvelopesApi($this->apiClient);
}
/**
* Write code on Method
*
* @return response()
*/
private function getTemplateArgs()
{
$args = [
'account_id' => env('DOCUSIGN_ACCOUNT_ID'),
'base_path' => env('DOCUSIGN_BASE_URL'),
'ds_access_token' => Session::get('docusign_auth_code'),
'envelope_args' => [
'signer_client_id' => $this->signer_client_id,
'ds_return_url' => route('docusign')
]
];
return $args;
}
}
Step 6: Create Blade File
In this step, we will create new blade file call docusign.blade.php. so let's update following file:
resources/views/docusign.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<title>Laravel Docusign Integration Example - ItSlutionStuff.com</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
@if ($message = Session::get('success'))
<div class="alert alert-success alert-block">
<button type="button" class="close" data-dismiss="alert">×</button>
<strong>{{ $message }}</strong>
</div>
@endif
<div class="card">
<div class="card-header">
<h5 class="card-title">Laravel Docusign Integration Example - ItSlutionStuff.com</h5>
</div>
<div class="card-body">
<h5 class="card-title">Docusign Tutorial</h5>
<p class="card-text">Click the button below to connect your application with Docusign</p>
@if ($message = Session::get('success'))
<a href="{{ route('docusign.sign') }}" class="btn btn-primary">Click to Sign Document</a>
@else
<a href="{{ route('connect.docusign') }}" class="btn btn-primary">Connect Docusign</a>
@endif
</div>
</div>
</div>
</body>
</html>
Run Laravel App:
All the required steps have been done, now you have to type the given below command and hit enter to run the Laravel app:
php artisan serve
Now, Go to your web browser, type the given URL and view the app output:
http://localhost:8000/docusign
Output:
Then, you need to click on Connect DocuSign and authenticate your docusign account.
After authenticate you will redirect back with following screen:
Then, you need to click on Click to Sign Document and you will able to sign your pdf file as like the below screen.
Then in end, you will redirect back and you will receive email with signed pdf file.
You can see all the above screens as output.
I hope it can help you...
Hardik Savani
I'm a full-stack developer, entrepreneur and owner of ItSolutionstuff.com. I live in India and I love to write tutorials and tips that can help to other artisan. I am a big fan of PHP, Laravel, Angular, Vue, Node, Javascript, JQuery, Codeigniter and Bootstrap from the early stage. I believe in Hardworking and Consistency.
We are Recommending you
- Laravel Google 2FA Authentication Tutorial Example
- Laravel 9 FCM Push Notification Example Tutorial
- Laravel React JS CRUD Application Tutorial
- Laravel 9 Ajax File Upload with Progress Bar Tutorial
- Laravel Send Scheduled Emails Tutorial
- Laravel Contact Form Send Email Tutorial
- Laravel Google ReCaptcha V3 Tutorial Example
- Laravel Amazon S3 File Upload Tutorial
- Laravel File Manager Tutorial Step by Step
- Deploy Laravel Vapor Project with Docker Tutorial
- Laravel Table Row Inline Editing Tutorial
- Razorpay Payment Gateway Integration in Laravel 8 Tutorial
- Laravel Signature Pad Example Tutorial