Bryan
Posted on October 9, 2022
Ever need to download all HelloSign documents with Laravel without the SDK? It can be done by basic HTTP requests with an API key generated by HelloSign.
Things used
- Laravel's built in HTTP Client (Guzzle)
- Jobs to avoid HelloSign API rate limits
- Functions will be placed in routes file instead of a controller (to prototype faster)
Steps
Get API key from HelloSign
-
Add the api to the
.env
file
HELLO_SIGN_API_KEY=
-
Create
hellosign.php
in the config folder
<?php return [ 'api_key' => env('HELLO_SIGN_API_KEY') ];
-
Create a migration
create_signature_requests_table
for the HelloSign document ids and add the following columns
$table->string('signature_request_id'); $table->boolean('downloaded');
-
Create a model
SignatureRequest
and add the following
$table->string('signature_request_id'); $table->boolean('downloaded');
-
Go to
routes/web.php
and add the following
use App\Jobs\DownloadJob; Route::get('/', function () { $api_key = config('hellosign.api_key'); $page = 1; $total_pages = 99; // just a temporary high number while($page <= $total_pages) { // max out the per page and documents from all accounts $response = Http::get("https://{$api_key}:@api.hellosign.com/v3/signature_request/list?account_id=all&page_size=100&page={$page}"); $object = $response->object(); // set the number of total pages of documents if($page == 1) { $total_pages = $object->list_info->num_pages; } // loop through each result and get the signature_request_id if it exists foreach($object->signature_requests as $sig) { if(!isset($sig->signature_request_id)){ SignatureRequest::create(['signature_request_id' => $sig->signature_request_id]); } } // increase the page $page++; } }); Route::get('download', function() { // get all signature ids that are not downloaded yet $sigs = SignatureRequest::where('downloaded', false)->get(); // chunk it into 20, HelloSign API limits 25 requests per minute $chunks = $sigs->chunk(20); $chunks->all(); // wait in minutes $wait = 0; foreach($chunks->all() as $chunk) { foreach($chunk as $sig) { // dispatch the download job and delay it by now + minutes dispatch(new DownloadJob($sig))->delay(now()->addMinutes($wait)); } // increase wait time $wait++; } });
-
Create a job
DownloadJob
and update with the following
namespace App\Jobs; ... use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Storage; use App\Models\SignatureRequest; ... public $sig; public function __construct(SignatureRequest $sig) { $this->sig = $sig; } public function handle() { $api_key = config('hellosign.api_key'); // request the document $response = Http::get("https://{$api_key}:@api.hellosign.com/v3/signature_request/files/{$this->sig->signature_request_id}"); // only download if response code is 200 if($response->status() == 200) { // save the document into a `documents` folder in storage with the document id as it's file name Storage::put("documents/{$this->sig->signature_request_id}.pdf", $response->body() ); // update db to downloaded $this->sig->downloaded = true; $this->sig->save(); } }
Run the migrations with
php artisan migrate
Start the queue with
php artisan queue:work
Go to
localhost
in the browser to start getting the all the document idsOnce #10 is finished, in the browser go to
localhost/download
to add put the download into the queueWait until the queue is clean and go back to #11 to make sure it's finished (repeat as many times as needed)
Posted on October 9, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.