PureBasic
PureBasic
DocuSign: Requesting a Signature via Email (Remote Signing)
See more DocuSign Examples
This code example demonstrates the simplest and quickest workflow for requesting a signature for a document via email. The email will contain a signing link the recipient can use to electronically sign a document from their mobile or desktop computer.Chilkat PureBasic Downloads
IncludeFile "CkBinData.pb"
IncludeFile "CkHttp.pb"
IncludeFile "CkStringBuilder.pb"
IncludeFile "CkJsonObject.pb"
IncludeFile "CkHttpResponse.pb"
Procedure ChilkatExample()
success.i = 0
; This example assumes the Chilkat API to have been previously unlocked.
; See Global Unlock Sample for sample code.
http.i = CkHttp::ckCreate()
If http.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
; Implements the following CURL command:
; curl --request POST https://demo.docusign.net/restapi/v2.1/accounts/${accountId}/envelopes \
; --header "Authorization: Bearer ${accessToken}" \
; --header "Content-Type: application/json" \
; --data '{
; "emailSubject": "Please sign this document",
; "documents": [
; {
; "documentBase64": "JVBERi0xLjMKMyAwIG9iag ... dGFydHhyZWYKNjk5CiUlRU9GCg==",
; "name": "Lorem Ipsum",
; "fileExtension": "pdf",
; "documentId": "1"
; }
; ],
; "recipients": {
; "signers": [
; {
; "email": "joe_sample@example.com",
; "name": "Joe Sample",
; "recipientId": "1",
; "routingOrder": "1",
; "tabs": {
; "signHereTabs": [
; {
; "documentId": "1", "pageNumber": "1",
; "recipientId": "1", "tabLabel": "SignHereTab",
; "xPosition": "195", "yPosition": "147"
; }
; ]
; }
; }
; ]
; },
; "status": "sent"
; }'
; Use this online tool to generate code from sample JSON:
; Generate Code to Create JSON
; The following JSON is sent in the request body.
; {
; "emailSubject": "Please sign this document",
; "documents": [
; {
; "documentBase64": "JVBERi0xLjMKMyAwIG9iag ... dGFydHhyZWYKNjk5CiUlRU9GCg==",
; "name": "Lorem Ipsum",
; "fileExtension": "pdf",
; "documentId": "1"
; }
; ],
; "recipients": {
; "signers": [
; {
; "email": "joe_sample@example.com",
; "name": "Joe Sample",
; "recipientId": "1",
; "routingOrder": "1",
; "tabs": {
; "signHereTabs": [
; {
; "documentId": "1",
; "pageNumber": "1",
; "recipientId": "1",
; "tabLabel": "SignHereTab",
; "xPosition": "195",
; "yPosition": "147"
; }
; ]
; }
; }
; ]
; },
; "status": "sent"
; }
; Load a PDF to be signed.
pdfData.i = CkBinData::ckCreate()
If pdfData.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkBinData::ckLoadFile(pdfData,"qa_data/pdf/helloWorld.pdf")
If success = 0
Debug "Failed to load local PDF file."
CkHttp::ckDispose(http)
CkBinData::ckDispose(pdfData)
ProcedureReturn
EndIf
json.i = CkJsonObject::ckCreate()
If json.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkJsonObject::ckUpdateString(json,"emailSubject","Please sign this document")
CkJsonObject::ckUpdateString(json,"documents[0].documentBase64",CkBinData::ckGetEncoded(pdfData,"base64"))
CkJsonObject::ckUpdateString(json,"documents[0].name","Lorem Ipsum")
CkJsonObject::ckUpdateString(json,"documents[0].fileExtension","pdf")
CkJsonObject::ckUpdateString(json,"documents[0].documentId","1")
CkJsonObject::ckUpdateString(json,"recipients.signers[0].email","joe_sample@example.com")
CkJsonObject::ckUpdateString(json,"recipients.signers[0].name","Joe Sample")
CkJsonObject::ckUpdateString(json,"recipients.signers[0].recipientId","1")
CkJsonObject::ckUpdateString(json,"recipients.signers[0].routingOrder","1")
CkJsonObject::ckUpdateString(json,"recipients.signers[0].tabs.signHereTabs[0].documentId","1")
CkJsonObject::ckUpdateString(json,"recipients.signers[0].tabs.signHereTabs[0].pageNumber","1")
CkJsonObject::ckUpdateString(json,"recipients.signers[0].tabs.signHereTabs[0].recipientId","1")
CkJsonObject::ckUpdateString(json,"recipients.signers[0].tabs.signHereTabs[0].tabLabel","SignHereTab")
CkJsonObject::ckUpdateString(json,"recipients.signers[0].tabs.signHereTabs[0].xPosition","195")
CkJsonObject::ckUpdateString(json,"recipients.signers[0].tabs.signHereTabs[0].yPosition","147")
CkJsonObject::ckUpdateString(json,"status","sent")
; Get our previously obtained OAuth2 access token, which should contain JSON like this:
; {
; "access_token": "eyJ0eXA....YQyig",
; "token_type": "Bearer",
; "refresh_token": "eyJ0eXA....auE3eHKg",
; "expires_in": 28800
; }
jsonToken.i = CkJsonObject::ckCreate()
If jsonToken.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkJsonObject::ckLoadFile(jsonToken,"qa_data/tokens/docusign.json")
sbAuth.i = CkStringBuilder::ckCreate()
If sbAuth.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkStringBuilder::ckAppend(sbAuth,"Bearer ")
CkStringBuilder::ckAppend(sbAuth,CkJsonObject::ckStringOf(jsonToken,"access_token"))
CkHttp::ckSetRequestHeader(http,"Authorization",CkStringBuilder::ckGetAsString(sbAuth))
CkHttp::ckSetRequestHeader(http,"Content-Type","application/json")
; Don't forget to modify this line to use your account ID
resp.i = CkHttpResponse::ckCreate()
If resp.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkHttp::ckHttpJson(http,"POST","https://demo.docusign.net/restapi/v2.1/accounts/${accountId}/envelopes",json,"application/json",resp)
If success = 0
Debug CkHttp::ckLastErrorText(http)
CkHttp::ckDispose(http)
CkBinData::ckDispose(pdfData)
CkJsonObject::ckDispose(json)
CkJsonObject::ckDispose(jsonToken)
CkStringBuilder::ckDispose(sbAuth)
CkHttpResponse::ckDispose(resp)
ProcedureReturn
EndIf
sbResponseBody.i = CkStringBuilder::ckCreate()
If sbResponseBody.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkHttpResponse::ckGetBodySb(resp,sbResponseBody)
jResp.i = CkJsonObject::ckCreate()
If jResp.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkJsonObject::ckLoadSb(jResp,sbResponseBody)
CkJsonObject::setCkEmitCompact(jResp, 0)
Debug "Response Body:"
Debug CkJsonObject::ckEmit(jResp)
respStatusCode.i = CkHttpResponse::ckStatusCode(resp)
Debug "Response Status Code = " + Str(respStatusCode)
If respStatusCode >= 400
Debug "Response Header:"
Debug CkHttpResponse::ckHeader(resp)
Debug "Failed."
CkHttp::ckDispose(http)
CkBinData::ckDispose(pdfData)
CkJsonObject::ckDispose(json)
CkJsonObject::ckDispose(jsonToken)
CkStringBuilder::ckDispose(sbAuth)
CkHttpResponse::ckDispose(resp)
CkStringBuilder::ckDispose(sbResponseBody)
CkJsonObject::ckDispose(jResp)
ProcedureReturn
EndIf
; Sample JSON response:
; (Sample code for parsing the JSON response is shown below)
; {
; "envelopeId": "d51cfdab-22ed-4832-bf68-446c44077ffc",
; "uri": "/envelopes/d51cfdab-22ed-4832-bf68-446c44077ffc",
; "statusDateTime": "2018-04-17T16:31:51.8830000Z",
; "status": "sent"
; }
; Sample code for parsing the JSON response...
; Use the following online tool to generate parsing code from sample JSON:
; Generate Parsing Code from JSON
envelopeId.s
uri.s
statusDateTime.s
status.s
envelopeId = CkJsonObject::ckStringOf(jResp,"envelopeId")
uri = CkJsonObject::ckStringOf(jResp,"uri")
statusDateTime = CkJsonObject::ckStringOf(jResp,"statusDateTime")
status = CkJsonObject::ckStringOf(jResp,"status")
CkHttp::ckDispose(http)
CkBinData::ckDispose(pdfData)
CkJsonObject::ckDispose(json)
CkJsonObject::ckDispose(jsonToken)
CkStringBuilder::ckDispose(sbAuth)
CkHttpResponse::ckDispose(resp)
CkStringBuilder::ckDispose(sbResponseBody)
CkJsonObject::ckDispose(jResp)
ProcedureReturn
EndProcedure