Patrick Casey
Patrick Casey

Reputation: 1

Request Signature Docusign Rest API vb.net

am trying to use the DocuSign .Net Client to request a signature on a Document I am creating dynamically. So far, I have been able to change the example to vb.net and it works (Exmaple CS). I was converting the "Walkthrough #4 - Request Signature on Document", about 1/2 way down the code. Now I am trying to use the Envelope.Document I've seen in other examples, such as, DocuSign example. But it seems .Document is not part of Envelope, even thought the rest of the code in both examples translates to vb.

My other option is to use the Envelope.AddDocument but I can't seem to figure out what it's expecting. I am supposed to pass fileBytes() as Byte, fileName as String, and index As Integer. I've tried a couple different methods to get the fileBytes but keep getting an error about Invalid_Content_Type Content type is not supported.

Here is the code I've been trying. Any help on how to add a Document to an Envelope would be appreciated. Ultimately I want to be able to add multiple documents to the one envelope. I can get the env.Create(docPath) to work, but that is not helpful. Thank you in advance for any help you can offer.

Public Function RequestEsignature(email As String, rName As String, docPath As String, strSubject As String) As String
    main()
    Dim AccountEmail = My.Settings.docusignUserName
    Dim AccountPassword = My.Settings.docusignPassword
    Dim RecipientEmail = email
    Dim RecipientName = rName
    Dim documentPath = docPath
    Dim msgString As String
    Dim acct As Account = New Account()
    acct.Email = AccountEmail
    acct.Password = AccountPassword

    Dim result As Boolean = acct.Login()
    If Not result Then
        msgString = String.Format("There was an error logging in to DocuSign fo user {0}.\nError Code:  {1}\nMessage:  {2}", acct.Email, acct.RestError.errorCode, acct.RestError.message)
        MsgBox(msgString)
        Return Nothing
    End If

    Dim env As Envelope = New Envelope
    env.Login = acct

    env.Recipients = New Recipients()
    Dim signer(0) As Signer
    signer(0) = New Signer()
    signer(0).email = email
    signer(0).name = RecipientName
    signer(0).routingOrder = "1"
    signer(0).recipientId = "1"
    env.Recipients.signers = signer

    Dim envDocs = New Document()
    envDocs.documentId = "1"
    envDocs.name = "Test Document"
    envDocs.uri = docPath

    'Dim fileBytes As Byte()
    'Dim fileBytes = getByteArrayII(documentPath)
    'Dim oFile As FileInfo
    'oFile = New FileInfo(documentPath)
    'Dim oFileStream As FileStream = oFile.OpenRead()
    'Dim lBytes As Long = oFileStream.Length

    'If lBytes > 0 Then
    '    Dim fileData(lBytes - 1) As Byte
    '    oFileStream.Read(fileData, 0, lBytes)
    'If Not env.AddDocument(fileBytes, documentPath, 0) Then
    '    msgString = String.Format("The was an Error adding the Document." & vbCrLf & "Error Code:  {0} " & vbCrLf & "Message:  {1}", env.RestError.errorCode, env.RestError.message)
    '    MsgBox(msgString)
    '    Return Nothing
    'Else
    '    MsgBox("Doc Successfully Added")
    'End If
    'oFileStream.Close()
    'End If


    env.Status = "sent"
    env.EmailSubject = strSubject
    result = env.Create()

    If Not result Then
        If Not IsNothing(env.RestError) Then
            msgString = String.Format("Error Code:  {0}\nMessage:  {1}", env.RestError.errorCode, env.RestError.message)
            MsgBox(msgString)
            Return Nothing
        Else
            MsgBox("There was a nondescript error while processing this request. \nPLease verify all information is correct before trying again.")
            Return Nothing
        End If
    Else
        Return env.EnvelopeId
    End If
End Function

Private Function getByteArray(fileName As String) As Byte()
    Dim fInfo As New FileInfo(fileName)
    Dim numBytes As Long = fInfo.Length
    Dim fStream As New FileStream(fileName, FileMode.Open, FileAccess.Read)
    Dim br As New BinaryReader(fStream)
    Dim data As Byte() = br.ReadBytes(CInt(numBytes))
    br.Close()
    fStream.Close()
    Return data
End Function

Private Function getByteArrayII(ByVal fileName As String) As Byte()
    Dim tempByte() As Byte = Nothing
    If String.IsNullOrEmpty(fileName) Then
        Throw New ArgumentNullException("FileName Not Provided")
        Return Nothing
    End If
    Try
        Dim fileInfo As New FileInfo(fileName)
        Dim numBytes As Long = fileInfo.Length
        Dim fStream As New FileStream(fileName, FileMode.Open, FileAccess.Read)
        Dim binaryReader As New BinaryReader(fStream)
        tempByte = binaryReader.ReadBytes(Convert.ToInt32(numBytes))
        fileInfo = Nothing
        numBytes = 0
        fStream.Close()
        fStream.Dispose()
        Return tempByte
    Catch ex As Exception
        Return Nothing
    End Try
End Function

HISTORY I am new to vb.net and programming. Thus far I have been able to make a program that allows users to enter client information with the forms being changed based on certain selections. We have a system that uses our SQL data to do mail merges in Word and then send a PDF for esignature to the client through DocuSign. We are using a SQL backend and a vb.net front end.

Lastly, I have been looking for an answer over the weekend and am now reaching out for help. I have searched google for every possible term(s) I can think to include/exclude. If I am asking publicly that truly means I have exhausted every resource I have. Please do not post links to any DocuSign Documentation as I have already visited all those sites. Thank you.

Upvotes: 0

Views: 1250

Answers (2)

Patrick Casey
Patrick Casey

Reputation: 1

Clearly my approach to learning vb, api's and all the other stuff needed to get my program working is extremely daunting. I am not sure if it is my lack of knowledge or just a misunderstanding of the code, but I was finally able to get this figured out. My function takes an object 'client' that has things like Name and Email, I also pass a list of Document Paths and the Subject line for the email. This loops through the list of documents and adds them to the envelope. I also have some examples of adding Tags which was a learning process in itself. I hope I am the only one unfortunate enough to have to be learning so many different new concepts that something this simple takes months to figure out, but if not here's the code:

    'Request Signature - Send Envelope
Public Function RequestEsignature(pClient As iqClient, docPaths As List(Of String), strSubject As String) As DocuSign.Integrations.Client.Envelope
    '*****************************************************************
    ' ENTER VALUES FOR FOLLOWING VARIABLES!
    '*****************************************************************
    Dim AccountEmail As String = My.Settings.docusignUserName
    Dim AccountPassword As String = My.Settings.docusignPassword
    Dim RecipientEmail As String = pClient.Email
    Dim RecipientName As String = pClient.Name.NameFL
    '*****************************************************************

    ' user credentials 
    Dim account As New Account()
    account = LoginToDocusign()

    If Not IsNothing(account) Then

    End If
    Dim result As Boolean ' = account.Login()

    ' create envelope object and assign login info
    Dim envelope As New Envelope()
    Dim recip = New Recipients()
    Dim signers = New List(Of Signer)
    Dim signer As New Signer()
    signer.email = RecipientEmail
    signer.name = RecipientName
    signer.routingOrder = "1"
    signer.recipientId = "1"

    Dim fileBytes = New List(Of Byte())
    Dim docNames = New List(Of String)
    Dim iqDoc As iqPublicClasses.iqDocement
    Dim docs = New List(Of Document)
    Dim doc As Document
    Dim tabs = New List(Of Tab)
    Dim tab As New Tab()
    Dim iTabs = New List(Of Tab)
    Dim iTab As New Tab()
    Dim dTabs = New List(Of DateSignedTab)
    Dim dTab As New DateSignedTab
    Dim rTabs = New List(Of RadioGroupTab)
    Dim rTab As New RadioGroupTab()
    Dim radios = New List(Of Radios)
    Dim radio As New Radios()

    tab = New Tab()
    tab.anchorIgnoreIfNotPresent = True
    tab.anchorString = "\s1\"
    tabs.Add(tab)

    dTab = New DateSignedTab
    dTab.anchorIgnoreIfNotPresent = True
    dTab.anchorString = "\d1\"
    dTabs.Add(dTab)

    iTab = New Tab()
    iTab.anchorIgnoreIfNotPresent = True
    iTab.anchorString = "\i1\"
    iTab.anchorYOffset = 15
    iTabs.Add(iTab)
    iTab = New Tab()
    iTab.anchorIgnoreIfNotPresent = True
    iTab.anchorString = "\nri1\"
    iTabs.Add(iTab)

    rTab = New RadioGroupTab()
    rTab.groupName = "RG1"
    rTab.anchorIgnoreIfNotPresent = True

    radio = New Radios()
    radio.anchorString = "\rbn\"
    radio.anchorIgnoreIfNotPresent = True
    radio.anchorYOffset = -10
    radios.Add(radio)
    radio = New Radios()
    radio.anchorString = "\rby\"
    radio.anchorIgnoreIfNotPresent = True
    radio.anchorYOffset = -10
    radios.Add(radio)

    rTab.radios = radios.ToArray
    rTabs.Add(rTab)

    signer.tabs = New Tabs()
    signer.tabs.signHereTabs = tabs.ToArray
    signer.tabs.dateSignedTabs = dTabs.ToArray
    signer.tabs.initialHereTabs = iTabs.ToArray
    signer.tabs.radioGroupTabs = rTabs.ToArray

    Dim cnt = 0

    For Each docName As String In docPaths
        cnt += 1

        iqDoc = New iqPublicClasses.iqDocement(docName)
        doc = New Document()
        doc.attachmentDescription = iqDoc.Name
        doc.name = String.Format("{0}{1}", iqDoc.Name, iqDoc.Extension)
        doc.fileExtension = iqDoc.Extension
        doc.uri = iqDoc.FullPath
        doc.documentId = cnt
        docs.Add(doc)

        docNames.Add(iqDoc.FullPath)
        fileBytes.Add(File.ReadAllBytes(iqDoc.FullPath))
    Next

    ' create envelope and send the signature request (since status is set to "sent")
    envelope.Login = account
    signers.Add(signer)
    recip.signers = signers.ToArray
    envelope.Recipients = recip
    envelope.Status = "sent"
    envelope.EmailSubject = strSubject
    result = envelope.Create(fileBytes, docs)

    If Not result Then
        If envelope.RestError IsNot Nothing Then
            Console.WriteLine("Error code:  {0}" & vbLf & "Message:  {1}", envelope.RestError.errorCode, envelope.RestError.message)
            Return Nothing
        Else
            Console.WriteLine("Error encountered while requesting signature from template, please review your envelope and recipient data.")
            Return Nothing
        End If
    Else
        Console.WriteLine("Signature request has been sent to {0}, envelopeId is {1}.", envelope.Recipients.signers(0).email, envelope.EnvelopeId)
        Return envelope
    End If
End Function

PS - As I've said I am extremely new to this and am learning as I am going. I understand this may not be the most elegant approach or properly formatted code, but I unfortunately have very little time to go back an update code I've written. Hopefully one day I will be able to go back and fix all the stuff I didn't understand when I first created it.

Upvotes: 0

Chris Dunaway
Chris Dunaway

Reputation: 11216

It doesn't appear that the Envelope class has a Document property, but rather a Documents property which seems to be an array.

The C# example you posted at this link seems to show how to attach a document:

// Attach the document(s) C#
envelope.Documents = new DocuSignWeb.Document[1];
DocuSignWeb.Document doc = new DocuSignWeb.Document();
doc.ID = "1";
doc.Name = "Document Name";
doc.PDFBytes = [Location of Document];
envelope.Documents[0] = doc;

Which in VB would be something like this:

'Attach the document(s) VB
envelope.Documents = new DocuSignWeb.Document(0);
Dim doc As New DocuSignWeb.Document()
doc.ID = "1"
doc.Name = "Document Name"
doc.PDFBytes = [Location of Document]
envelope.Documents(0) = doc

If this is not the problem you are facing, please provide additional details.

Upvotes: 1

Related Questions