Signsquid en PHP

Signsquid est une solution canadienne permettant de créer des contrats PDF à faire signer à un ensemble de personnes.

Leur documentation donne une idée assez large de ce qu’il est possible de faire avec. Cependant, rien n’indique facilement comment l’utiliser en PHP.

J’ai du le faire pour WEDOGOOD. Voici un peu ce que ça donne.

/**
 * Fonction générale pour faire des appels à Signsquid
 * Des morceaux pourraient sans doute être regroupés entre POST et POST_FILES. Mais c'est mieux découpé comme ça.
 * @global type $signsquidBaseURL : à définir ailleurs - URL pour accéder à l'API Signquid
 * @global type $signsquiduserpwd : à définir ailleurs - user/pwd pour accéder à l'API Signsquid
 * @param type $request_type : 3 types de requêtes différents : GET, POST, POST_FILES
 * @param type $request_object : l'option que l'on veut récupérer sur Signsquid
 * @param type $post_data : les données que l'ont tente d'envoyer à Signsquid
 * @return type
 */
function signsquid_request($request_type, $request_object, $post_data = '') {
    global $signsquidBaseURL, $signsquiduserpwd;
    
    $url = $signsquidBaseURL . $request_object;
    $data_string = ($post_data != '') ? json_encode($post_data) : '';
    $header_auth = "Authorization: Basic " . base64_encode($signsquiduserpwd) . "\r\n";
    
    $error = '';
    $errorno = '';
    
    switch ($request_type) {
	case "POST" :
	    $ch = curl_init($url);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
		curl_setopt($ch, CURLOPT_HEADER, TRUE);
		curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . strlen($data_string)));
		curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
		curl_setopt($ch, CURLOPT_USERPWD, $signsquiduserpwd );
		curl_setopt($ch, CURLOPT_POST, TRUE);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
		curl_setopt($ch, CURLOPT_VERBOSE, true);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
	    $response = curl_exec($ch);
	    $error = curl_error($ch);
	    $errorno = curl_errno($ch);
	    curl_close($ch);
	    break;

	case "GET" :
	    $response = @file_get_contents($url, null, stream_context_create(array(
		'http' => array(
		    'method' => 'GET',
		    'header' => $header_auth
		)
	    )));
	    //Transforme en objet json directement exploitable
	    $obj = json_decode($response);
	    break;

	case "POST_FILE" :
	    //In this context, $post_data is the complete file path
	    $filename = basename($post_data);
	    $fh = fopen($post_data, 'r');
	    $ch = curl_init($url . $filename);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
		curl_setopt($ch, CURLOPT_HEADER, TRUE);
		curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/octet-stream', 'Content-Length: ' . filesize($post_data)));
		curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
		curl_setopt($ch, CURLOPT_USERPWD, $signsquiduserpwd );
		curl_setopt($ch, CURLOPT_POST, TRUE);
		curl_setopt($ch, CURLOPT_INFILE, $fh );
		curl_setopt($ch, CURLOPT_INFILESIZE, filesize($post_data) );
		curl_setopt($ch, CURLOPT_VERBOSE, true);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
	    $response = curl_exec($ch);
	    $error = curl_error($ch);
	    $errorno = curl_errno($ch);
	    curl_close($ch);
	    fclose($fh);
	    break;
    }
    
    if (isset($obj)) return $obj;
    else return $response;
}

/**
 * Parse les headers reçus
 * @param type $response
 * @return type
 */
function get_headers_from_curl_response($response) {
    $headers = array();
    $header_text = substr($response, 0, strpos($response, "\r\n\r\n"));

    foreach (explode("\r\n", $header_text) as $i => $line) {
        if ($i === 0) {
            $headers['http_code'] = $line;
	} else {
            list ($key, $value) = explode(': ', $line);
            $headers[$key] = $value;
        }
    }
    return $headers;
}

/**
 * Retourne la liste de tous les contrats
 */
function signsquid_get_contract_list() {
    return signsquid_request("GET", "contracts");
}

/**
 * Crée un contrat
 * @param type $contract_name
 */
function signsquid_create_contract($contract_name) {
    $buffer = '';
    $data_to_send = array( 'name' => $contract_name);
    $response = signsquid_request("POST", "contracts", $data_to_send);
    $headers = get_headers_from_curl_response($response);
    if (isset($headers['Location'])) {
	$buffer = basename($headers['Location']);
    }
    return $buffer;
}

/**
 * Ajoute un signataire à un contrat
 * @param type $contract_id
 * @param type $user_name
 * @param type $user_email
 * @param type $user_phone
 */
function signsquid_add_signatory($contract_id, $user_name, $user_email, $user_phone = '') {
    $data_to_send = array( 'name' => $user_name, 'email' => $user_email, 'mobilePhone' => $user_phone);
    $response = signsquid_request("POST", "contracts/".$contract_id."/versions/1/signatories", $data_to_send);
    $headers = get_headers_from_curl_response($response);
    if ($headers['http_code'] == 'HTTP/1.1 201 Created') {
	$buffer = TRUE;
    } else {
	$buffer = FALSE;
    }
    return $buffer;
}

/**
 * Ajoute un fichier pour le contrat
 * @param type $contract_id
 * @param type $filename
 */
function signsquid_add_file($contract_id, $filename) {
    $response = signsquid_request("POST_FILE", "contracts/".$contract_id."/versions/1/files?filename=", $filename);
    $headers = get_headers_from_curl_response($response);
    if ($headers['http_code'] == 'HTTP/1.1 100 Continue') {
	$buffer = TRUE;
    } else {
	$buffer = FALSE;
    }
    return $buffer;
}

/**
 * Envoie les invitations à signer le contrat à tous les signataires
 * @param type $contract_id
 */
function signsquid_send_invite($contract_id) {
    $response = signsquid_request("POST", "contracts/".$contract_id."/versions/1");
    $headers = get_headers_from_curl_response($response);
    if ($headers['http_code'] == 'HTTP/1.1 200 OK') {
	$buffer = TRUE;
    } else {
	$buffer = FALSE;
    }
    return $buffer;
}

/**
 * Retourne toutes les informations d'un contrat
 * @param type $contract_id
 * @return string
 */
function signsquid_get_contract_infos_complete($contract_id) {
    $buffer = '';
    if ($contract_id != '') $buffer = signsquid_request("GET", "contracts/".$contract_id);
    if (!isset($buffer->{'id'}) || $buffer->{'id'} == '') {
	$buffer = '';
    }
    return $buffer;
}

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *