Docusign - Chữ ký điện tử

Docusign là gì

Dịch vụ hỗ trợ chữ ký điện tử. Nghe đồn được anh Google hậu thuẫn. Với cách sử dụng đơn giản và nhiều tính năng mà bất kỳ cá nhân hay doanh nghiệp nào cũng đều cần đến. Người dùng chỉ cần tải tập tin lên DocuSign, ký tên trong hộp thoại nhỏ và kéo đến vị trí cần đặt chữ ký trong văn bản, sau đó gửi email chứa các tài liệu cho người nhận đã chỉ định. Bạn cũng có thể yêu cầu người nhận ký lại hay nhắc nhở thời gian văn bản hết hiệu lực nếu chúng không được ký kết một cách kịp thời. Một bảng điều khiển sẽ cho phép bạn theo dõi tất cả các hợp đồng đã gửi đi và ký kết thành công. DocuSign có nhiều gói dịch vụ, từ miễn phí cho cá nhân với các tính năng cơ bản nhất, đến khoảng 420.000 đ (20 USD) mỗi tháng cho các tính năng cao cấp hơn.

Điểm lợi ích mà Docusign mang lại chính là vấn đề bảo vệ tài nguyên môi trường. Theo ước tính của Docusign thì họ đã giúp tiết kiệm được hơn 20 tỉ tờ giấy, 2.5 triệu cây cối và 2 triệu gallon nước (1 gallon = 3.785lít)

Demo

Required thư viện docusign_esign

pip install docusign_esign

1. Thông tin tài khoản

Trước tiên ta cần đăng ký tài khoản free trial với Docusign. Sau đó vào link này để lấy access token, DocuSign accountID

import base64, os
from docusign_esign import ApiClient, EnvelopesApi, EnvelopeDefinition, Signer, SignHere, Tabs, Recipients, Document

# Settings
# Fill in these constants
#
# Obtain an OAuth access token from https://developers.docusign.com/oauth-token-generator
access_token = '{ACCESS_TOKEN}'
# Obtain your accountId from demo.docusign.com -- the account id is shown in the drop down on the
# upper right corner of the screen by your picture or the default picture. 
account_id = '{ACCOUNT_ID}'
# Recipient Information:
signer_name = '{USER_FULLNAME}'
signer_email = '{USER_EMAIL}'
# The document you wish to send. Path is relative to the root directory of this repo.
file_name_path = 'demo_documents/World_Wide_Corp_lorem.pdf';
base_path = 'https://demo.docusign.net/restapi'

# Constants
APP_PATH = os.path.dirname(os.path.abspath(__file__))

2. Định nghĩa Evelope

Evelope (Phong bì) nơi sẽ chứa các tài liệu (Bao gồm tài liệu cần ký, tài liệu view), người ký, những người nhận khác, những nơi người ký sẽ ký tài liệu

def send_document_for_signing():
    """
    Sends the document <file_name> to be signed by <signer_name> via <signer_email>
    """

    # Create the component objects for the envelope definition...
    with open(os.path.join(APP_PATH, file_name_path), "rb") as file:
        content_bytes = file.read()
    base64_file_content = base64.b64encode(content_bytes).decode('ascii')

    document = Document( # create the DocuSign document object 
        document_base64 = base64_file_content, 
        name = 'Example document', # can be different from actual file name
        file_extension = 'pdf', # many different document types are accepted
        document_id = 1 # a label used to reference the doc
    )


    # Create the signer recipient model 
    signer = Signer( # The signer
        email = signer_email, name = signer_name, recipient_id = "1", routing_order = "1")

    # Create a sign_here tab (field on the document)
    sign_here = SignHere( # DocuSign SignHere field/tab
        document_id = '1', page_number = '1', recipient_id = '1', tab_label = 'SignHereTab',
        x_position = '195', y_position = '147')

    # Add the tabs model (including the sign_here tab) to the signer
    signer.tabs = Tabs(sign_here_tabs = [sign_here]) # The Tabs object wants arrays of the different field/tab types


    # Next, create the top level envelope definition and populate it.
    envelope_definition = EnvelopeDefinition(
        email_subject = "Please sign this document sent from the Python SDK",
        documents = [document], # The order in the docs array determines the order in the envelope
        recipients = Recipients(signers = [signer]), # The Recipients object wants arrays for each recipient type
        status = "sent" # requests that the envelope be created and sent.
    )

3. Khởi tạo và gửi Envelope

Sau khi định nghĩa Envelope đầy đủ, sử dụng CreateEnvelope của thư viện SDK trên để gửi. Trong code mình để trạng thái là sent nên tài liệu sẽ được Docusign gửi ngay sau khi tạo

     # Ready to go: send the envelope request
    api_client = ApiClient()
    api_client.host = base_path
    api_client.set_default_header("Authorization", "Bearer " + access_token)

    envelope_api = EnvelopesApi(api_client)
    results = envelope_api.create_envelope(account_id, envelope_definition=envelope_definition)
    return results

Sau đó, vào mail signer và xem kết quả:

Tổng kết

Docusign này còn nhiều tính năng và phức tạp, mình sẽ tiếp tục châm cứu và gửi thêm demo cho các bạn ở những bài sau