Implementei o DocuSign no meu aplicativo Laravel e atualmente estou usando o JWT Grant Authentication para enviar documentos para clientes assinarem. A integração está funcionando bem, mas encontrei um problema: quando envio envelopes com documentos para clientes assinarem, inicialmente, tenho que fornecer consentimento manualmente por meio da página de consentimento do DocuSign.
Como meu aplicativo foi projetado para funcionar como um microsserviço de backend que envia documentos automaticamente por meio de gatilhos, esse processo de consentimento manual interrompe o fluxo. Gostaria de perguntar se há uma maneira de automatizar esse processo de consentimento, para que os documentos possam ser enviados sem a necessidade de intervenção manual.
Existe alguma configuração ou recurso de API que permita consentimento automático ou pré-autorização para o aplicativo, ou alguma prática recomendada sobre isso ao usar o DocuSign em tal serviço de backend?
Esta é minha classe de serviço cuidando da preparação e do envio dos envelopes.
public function getToken(ApiClient $apiClient): string
{
try {
$privateKey = file_get_contents(storage_path(env('DS_KEY_PATH')), true);
$response = $apiClient->requestJWTUserToken(
env('DS_CLIENT_ID'),
env('DS_IMPERSONATED_USER_ID'),
$privateKey,
env('DS_JWT_SCOPE')
);
$token = $response[0];
return $token->getAccessToken();
} catch (\Throwable $th) {
if (strpos($th->getMessage(), 'consent_required') !== false) {
throw new \Exception('consent_required');
}
throw $th;
}
}
/**
* Build and return the consent URL
*
* @return string
*/
public function getConsentUrl(): string
{
return "https://account-d.docusign.com/oauth/auth?response_type=code&scope=signature%20impersonation&client_id="
. env('DS_CLIENT_ID')
. "&redirect_uri=" . urlencode(env('DS_REDIRECT_URI'));
}
/**
* Build the envelope definition from the request
*
* @param Request $request
* @return EnvelopeDefinition
*/
public function buildEnvelope(Request $request): EnvelopeDefinition
{
$fileContent = $request->file('formFile')->get();
$fileName = $request->file('formFile')->getClientOriginalName();
$fileExtension = $request->file('formFile')->getClientOriginalExtension();
$recipientEmail = $request['email'];
$recipientName = $request['name'];
$document = new Document([
'document_id' => "1",
'document_base64' => base64_encode($fileContent),
'file_extension' => $fileExtension,
'name' => $fileName
]);
$sign_here_tab = new SignHere([
'anchor_string' => "FIRMA CLIENTE",
'page_number' => "1",
'anchor_units' => "pixels",
'anchor_x_offset' => "40",
'anchor_y_offset' => "40"
]);
$tabs = new Tabs([
'sign_here_tabs' => [$sign_here_tab]
]);
$signer = new Signer([
'email' => $recipientEmail,
'name' => $recipientName,
'recipient_id' => "1",
'tabs' => $tabs
]);
$recipients = new Recipients([
'signers' => [$signer]
]);
$inlineTemplate = new InlineTemplate([
'recipients' => $recipients,
'sequence' => "1"
]);
$compositeTemplate = new CompositeTemplate([
'composite_template_id' => "1",
'document' => $document,
'inline_templates' => [$inlineTemplate]
]);
return new EnvelopeDefinition([
'composite_templates' => [$compositeTemplate],
'email_subject' => "Please sign",
'status' => "sent"
]);
}
/**
* Send the envelope using the DocuSign API
*
* @param ApiClient $apiClient
* @param string $accountId
* @param EnvelopeDefinition $envelopeDefinition
* @return object
*/
public function sendEnvelope(ApiClient $apiClient, string $accountId, EnvelopeDefinition $envelopeDefinition): object
{
$envelopeApi = new EnvelopesApi($apiClient);
return $envelopeApi->createEnvelope($accountId, $envelopeDefinition);
}