从Salesforce数据更新Docusign中的数据字段标记

时间:2014-12-29 22:47:52

标签: salesforce apex-code docusignapi apex

我正在使用Docusign API集成到Salesforce。我需要通过在发送签名后从Salesforce调用Docusign API来更新文档中的数据字段标记。

假设签名者的路由顺序是从签名者1到签名者4.最初,该数据字段标记的值将为空。签名者3“完成”签名后,我必须从Salesforce触发API调用,并使用从Salesforce中对象的自定义字段值检索的值更新标记。然后,签名者4将能够在签署文档之前查看数据字段标记中的值。

我使用docusign的合并字段将Salesforce数据导入到该标记中。但正如我之前所说,初始值将为null(因为那时合并字段的salesforce数据也将为null)并且我必须“暂停”签名过程,更新标记然后继续保留签名者。

有什么方法可以“刷新”信封,以便数据字段标签中的值得到更新?

发送信封后,docusign是否允许通过API标注使用Salesforce数据更新文档中的标记值?

请注意,我已阅读Docusign RestAPI指南版本2中的“收件人”文章的“修改”标签(标签)。这是用于修改标签类型或标签值吗?

1 个答案:

答案 0 :(得分:4)

可以使用Salesforce和DS,但不是您的方式。我在Send (Load) a URL to web browser and run it in background in APEX

的另一个问题上回答了关于背景更正的问题

合并字段是问题的一部分,但它们仅在" SENT"时显示为值。并且只有在信封成功完成时才更新Salesforce,所以实际上这只是您的方案的一半解决方案。

以下是我为另一个DocuSign客户所做的工作,作为如何执行此操作的示例,但请与您的DocuSign客户经理联系,因为我认为如果您正在进行这些类型的高级工作流程,您可以从DocuSign获益&# 39;我所属的职业服务集团。

1. Components added: 
    DocuSign Connect Object - dseRecipientConnectUpdate
    custom Object - dseRecipientConnectUpdate__c​
    Trigger - dseRCU_AfterUpdate​
    Class - desController (in Sandbox and code below as well)
    Class - CheckRecursive (in sandbox and code below as well)
    DS Template Example -Agreement with ContractID  960BD14E-6A09-4A9E-89E6-77B1D8444B72


2. What you need yet to do
    Replace Send on Behalf user with Sender of envelope via code (hard Coded as david.grigsby@docusign.com in code) lookup using envelopeID in DocuSign Status and get sender, then lookup in user that sender's email
    Classify any stringified body's you want
    Error Condition handling
    Test Classes
    Testing, Testing, testing

How I tested:
    0. Turn on debugging for API user and Myself
    a. Sent Envelope from Template
    b. Signed the first three recipients 
    c. Code updated the dseRecipientConnectUpdate__c​ record (a36) that was the autoresponse blocking user aka just changed record by editing but no real change, then save.

    d. It would then fire trigger again (as mentioned you will need to change the send on behalf of user to automatically for final code to be sending user, but you can make it your email you send envelope by) and it will read recipients, get the contract id recipient and tab, add new recipient and tab with value, delete old reciepents (tag recipient and blocking)

Salesforce自定义对象:

<?xml version="1.0" encoding="UTF-8"?>
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
    <!--actionoverrides removed for sake of SO answer size/>
    <compactLayoutAssignment>SYSTEM</compactLayoutAssignment>
    <deploymentStatus>Deployed</deploymentStatus>
    <description>DocuSign Recipient Connect Update</description>
    <enableActivities>true</enableActivities>
    <enableFeeds>false</enableFeeds>
    <enableHistory>true</enableHistory>
    <enableReports>true</enableReports>
    <fields>
        <fullName>RecipStatus__c</fullName>
        <externalId>false</externalId>
        <label>RecipStatus</label>
        <length>50</length>
        <required>false</required>
        <trackHistory>false</trackHistory>
        <trackTrending>false</trackTrending>
        <type>Text</type>
        <unique>false</unique>
    </fields>
    <fields>
        <fullName>RecipientEmail__c</fullName>
        <description>Recipient Email</description>
        <externalId>false</externalId>
        <label>RecipientEmail</label>
        <required>false</required>
        <trackHistory>false</trackHistory>
        <trackTrending>false</trackTrending>
        <type>Email</type>
        <unique>false</unique>
    </fields>
    <fields>
        <fullName>RecipientID__c</fullName>
        <externalId>false</externalId>
        <label>RecipientID</label>
        <length>50</length>
        <required>false</required>
        <trackHistory>false</trackHistory>
        <trackTrending>false</trackTrending>
        <type>Text</type>
        <unique>false</unique>
    </fields>
    <fields>
        <fullName>dsEnvelopeID__c</fullName>
        <description>dsfs__DocuSign_Envelope_ID__c</description>
        <externalId>false</externalId>
        <label>dsEnvelopeID</label>
        <length>56</length>
        <required>false</required>
        <trackHistory>false</trackHistory>
        <trackTrending>false</trackTrending>
        <type>Text</type>
        <unique>false</unique>
    </fields>
    <label>dseRecipientConnectUpdate</label>
    <listViews>
        <fullName>All</fullName>
        <filterScope>Everything</filterScope>
        <label>All</label>
    </listViews>
    <nameField>
        <displayFormat>dseRCU-{0000000000}</displayFormat>
        <label>dseRecipientConnectUpdate Name</label>
        <trackHistory>false</trackHistory>
        <type>AutoNumber</type>
    </nameField>
    <pluralLabel>dseRecipientConnectUpdates</pluralLabel>
    <recordTypeTrackHistory>false</recordTypeTrackHistory>
    <recordTypes>
        <fullName>dseRecipientConnectUpdate</fullName>
        <active>true</active>
        <description>dseRecipientConnectUpdate</description>
        <label>dseRecipientConnectUpdate</label>
    </recordTypes>
    <searchLayouts/>
    <sharingModel>ReadWrite</sharingModel>
</CustomObject>

<强>触发器 ==========

trigger dseRCU_AfterUpdate on dseRecipientConnectUpdate__c (after update) {
    try
    {

        if (CheckRecursive.runOnce())
        {   

            List<dseRecipientConnectUpdate__c> myConnectUpdates = [Select d.dsEnvelopeID__c, d.RecipientID__c, d.RecipientEmail__c, d.RecipStatus__c, d.Id From dseRecipientConnectUpdate__c d WHERE Id IN:Trigger.newMap.keySet()];

            for(dseRecipientConnectUpdate__c myConnectCompleted :myConnectUpdates)
            {
                system.debug(myConnectCompleted.Id);

                if(myConnectCompleted.RecipStatus__c.indexOf('AutoResponded') != -1)
                {
                    system.debug(myConnectCompleted.RecipStatus__c);
                        //Looking for bounce back user via status AutoResponded  and  @accelrys.com emails/recipients
                        if(myConnectCompleted.RecipientEmail__c.indexOf('invalidemail@baddomain.com') != -1)
                        {
                          //do modification to envelope here
                          dseController.updateEnvelope(myConnectCompleted.dsEnvelopeID__c, myConnectCompleted.RecipientID__c);


                        }
                }
            }
        }
    }
    catch(Exception ex)
    {
        system.debug(ex);
    }
    finally
    {

    }  
}

<强>类 ==========

public with sharing class dseController {

    public dseController()
    {

    }

    public dseController(ApexPages.StandardController controller)
    {

    } 

    @future (callout=true)
    public static void updateEnvelope( string envelopeID, string recipientID )
    {
    RecipientResponse RecipientResponseDeserialized = new RecipientResponse();
    RecipientTabResponse RecipientTabResponseDeserialized = new RecipientTabResponse();
    string rResponse = '{}';
    string recipientGuidwithContractTab;
    string recipientGuidForBlockingRecipient;
    string rTabResponse = '{}';
    string rSetRecipientResponse = '{}';
    string rSetTabForRecipientResponse = '{}';
    string rTabRecipientDeleteResponse = '{}';
    string rBlockingRecipientDeleteResponse = '{}';


    try
    {
//Call to get envelope recipients
rResponse = getEnvelopeRecipients(envelopeID);
system.debug(rResponse);

RecipientResponseDeserialized = parseRecipentResponse(rResponse);
system.debug(RecipientResponseDeserialized);

recipientGuidwithContractTab = getRecipientwithContractTab(RecipientResponseDeserialized);
system.debug(recipientGuidwithContractTab);

//Call to get recipient tab
rTabResponse = getRecipientTab(envelopeID, recipientGuidwithContractTab);
system.debug(rTabResponse);

RecipientTabResponseDeserialized = parseRecipientTabResponse(rTabResponse);
system.debug(RecipientTabResponseDeserialized);

//Call to add recipient with new id
rSetRecipientResponse = setRecipientForNewTab(envelopeID,RecipientResponseDeserialized);
system.debug(rSetRecipientResponse);

//Call to add tab to new recipient with new id

rSetTabForRecipientResponse = setNewTabforNewRecipient(envelopeID,RecipientTabResponseDeserialized);
system.debug(rSetTabForRecipientResponse);

//Call to delete old clone recipient
rTabRecipientDeleteResponse = deleteRecipientTab(envelopeID, recipientGuidwithContractTab);
system.debug(rTabRecipientDeleteResponse);

//Call to delete blocking user
recipientGuidForBlockingRecipient = getBlockingRecipient(RecipientResponseDeserialized);
rBlockingRecipientDeleteResponse = deleteBlockingRecipient(envelopeID, recipientGuidForBlockingRecipient);
system.debug(rBlockingRecipientDeleteResponse);
    }
catch(Exception ex)
        {
            system.debug(ex);

        }
        finally
        {

        }    

    }

    public static string getRecipientwithContractTab(RecipientResponse rResponse)
    {
    string rContractTabID = 'Not Found';

    try{

    List<Signer> mySigners = rResponse.signers;
    for(Signer mySigner : mySigners)
    {
    if(mySigner.roleName == 'ContractIDApprover')
    {
    rContractTabID = mySigner.recipientIdGuid;
    }

    }

    }
catch(Exception ex)
        {
            system.debug(ex);

        }
        finally
        {

        } 

        return rContractTabID;

    }

    public static string getBlockingRecipient(RecipientResponse rResponse)
    {
    string rContractTabID = 'Not Found';

    try{

    List<Signer> mySigners = rResponse.signers;
    for(Signer mySigner : mySigners)
    {
    if(mySigner.roleName == 'BlockingUser')
    {
    rContractTabID = mySigner.recipientIdGuid;
    }

    }

    }
catch(Exception ex)
        {
            system.debug(ex);

        }
        finally
        {

        } 

        return rContractTabID;

    }


    public static string getEnvelopeRecipients(string envelopeID)
    {
    string response = '{}';
    string DSEndpoint = 'https://demo.docusign.net/restapi/v2/';
    string DSUserId = 'yourdsUserid';
    string DSPassword = 'yourdspassword';
    string DSAccountID = 'yourdsaccountID';
    string DSIntegratorKey = 'yourdsintegratorkey';


    try
{

//FORCES that the DocuSign member has to be in the DocuSign account DSFS is configured for
List<dsfs__DocuSignAccountConfiguration__c> dsAccountConfig = [Select d.dsfs__UseSendOnBehalfOf__c, d.dsfs__DocuSignBaseURL__c, d.dsfs__DSProSFUsername__c, d.dsfs__DSProSFPassword__c, d.dsfs__AccountId__c From dsfs__DocuSignAccountConfiguration__c d limit 1];

for(dsfs__DocuSignAccountConfiguration__c myConfig : dsAccountConfig)
{

DSEndpoint = myConfig.dsfs__DocuSignBaseURL__c + 'restapi/v2/';
DSUserId = myConfig.dsfs__DSProSFUsername__c;
DSPassword = myConfig.dsfs__DSProSFPassword__c;

}

HttpRequest request = new HttpRequest();
request.setEndpoint(DSEndpoint + 'accounts/'+DSAccountID+'/envelopes/'+envelopeID+'/recipients');
request.setMethod('GET');
request.setHeader('Content-Type', 'application/json');
request.setHeader('X-DocuSign-Authentication', '<DocuSignCredentials><Username>'+DSUserId+'</Username><Password>'+DSPassword+'</Password><IntegratorKey>'+DSIntegratorKey+'</IntegratorKey></DocuSignCredentials>');
request.setHeader('Accept', 'application/json');
request.setTimeout(120000);

system.debug(request.getHeader('X-DocuSign-Authentication'));


HttpResponse myResponse = (new Http()).send(request);

system.debug(myResponse.getBody());

if(myResponse.getStatusCode().format()=='200')
{  
response = myResponse.getBody();
system.debug(response);

}

}
catch(Exception ex)
        {
            system.debug(ex);

        }
        finally
        {

        }

        return response;
    }

    public static string getRecipientTab(string envelopeID, string recipientGuid)
    {
    string response = '{}';
    string DSEndpoint = 'https://demo.docusign.net/restapi/v2/';
    string DSUserId = 'yourdsUserid';
    string DSPassword = 'yourdspassword';
    string DSAccountID = 'yourdsaccountID';
    string DSIntegratorKey = 'yourdsintegratorkey';


    try
{

//FORCES that the DocuSign member has to be in the DocuSign account DSFS is configured for
List<dsfs__DocuSignAccountConfiguration__c> dsAccountConfig = [Select d.dsfs__UseSendOnBehalfOf__c, d.dsfs__DocuSignBaseURL__c, d.dsfs__DSProSFUsername__c, d.dsfs__DSProSFPassword__c, d.dsfs__AccountId__c From dsfs__DocuSignAccountConfiguration__c d limit 1];

for(dsfs__DocuSignAccountConfiguration__c myConfig : dsAccountConfig)
{

DSEndpoint = myConfig.dsfs__DocuSignBaseURL__c + 'restapi/v2/';
DSUserId = myConfig.dsfs__DSProSFUsername__c;
DSPassword = myConfig.dsfs__DSProSFPassword__c;

}

HttpRequest request = new HttpRequest();
request.setEndpoint(DSEndpoint + 'accounts/'+DSAccountID+'/envelopes/'+envelopeID+'/recipients/'+recipientGuid+'/tabs/');
request.setMethod('GET');
request.setHeader('Content-Type', 'application/json');
request.setHeader('X-DocuSign-Authentication', '<DocuSignCredentials><Username>'+DSUserId+'</Username><Password>'+DSPassword+'</Password><SendOnBehalfOf>david.grigsby@docusign.com</SendOnBehalfOf><IntegratorKey>'+DSIntegratorKey+'</IntegratorKey></DocuSignCredentials>');
request.setHeader('Accept', 'application/json');
request.setTimeout(120000);

system.debug(request.getHeader('X-DocuSign-Authentication'));


HttpResponse myResponse = (new Http()).send(request);

system.debug(myResponse.getBody());

if(myResponse.getStatusCode().format()=='200')
{  
response = myResponse.getBody();
system.debug(response);

}

}
catch(Exception ex)
        {
            system.debug(ex);

        }
        finally
        {

        }

        return response;
    }

    public static string setRecipientForNewTab(string envelopeID, RecipientResponse rResponse)
    {
    string response = '{}';
    string DSEndpoint = 'https://demo.docusign.net/restapi/v2/';
    string DSUserId = 'yourdsUserid';
    string DSPassword = 'yourdspassword';
    string DSAccountID = 'yourdsaccountID';
    string DSIntegratorKey = 'yourdsintegratorkey';


    try
{

//FORCES that the DocuSign member has to be in the DocuSign account DSFS is configured for
List<dsfs__DocuSignAccountConfiguration__c> dsAccountConfig = [Select d.dsfs__UseSendOnBehalfOf__c, d.dsfs__DocuSignBaseURL__c, d.dsfs__DSProSFUsername__c, d.dsfs__DSProSFPassword__c, d.dsfs__AccountId__c From dsfs__DocuSignAccountConfiguration__c d limit 1];

for(dsfs__DocuSignAccountConfiguration__c myConfig : dsAccountConfig)
{

DSEndpoint = myConfig.dsfs__DocuSignBaseURL__c + 'restapi/v2/';
DSUserId = myConfig.dsfs__DSProSFUsername__c;
DSPassword = myConfig.dsfs__DSProSFPassword__c;

}

Signer mySignerToAdd = new Signer();

List<Signer> mySigners = rResponse.signers;
    for(Signer mySigner : mySigners)
    {
    if(mySigner.roleName == 'ContractIDApprover')
    {
    mySignerToAdd = mySigner;
    }

    }


    String myBody;
    myBody = '{"signers": [{"signInEachLocation": "false","name": "'+mySignerToAdd.name +'Added 1","email": "'+mySignerToAdd.email+'","recipientId": "7","requireIdLookup": "false","routingOrder": "19","roleName": "'+mySignerToAdd.roleName+'1"}]}';

HttpRequest request = new HttpRequest();
request.setEndpoint(DSEndpoint + 'accounts/'+DSAccountID+'/envelopes/'+envelopeID+'/recipients/');
request.setMethod('POST');
request.setHeader('Content-Type', 'application/json');
request.setHeader('X-DocuSign-Authentication', '<DocuSignCredentials><Username>'+DSUserId+'</Username><Password>'+DSPassword+'</Password><SendOnBehalfOf>david.grigsby@docusign.com</SendOnBehalfOf><IntegratorKey>'+DSIntegratorKey+'</IntegratorKey></DocuSignCredentials>');
request.setHeader('Accept', 'application/json');
request.setTimeout(120000);
request.setBody(myBody);

system.debug(request.getHeader('X-DocuSign-Authentication'));


HttpResponse myResponse = (new Http()).send(request);

system.debug(myResponse.getBody());

if(myResponse.getStatusCode().format()=='201')
{  
response = myResponse.getBody();
system.debug(response);

}

}
catch(Exception ex)
        {
            system.debug(ex);

        }
        finally
        {

        }

        return response;
    }

     public static string setNewTabforNewRecipient(string envelopeID, RecipientTabResponse rTabResponse)
    {
    string response = '{}';
    string DSEndpoint = 'https://demo.docusign.net/restapi/v2/';
    string DSUserId = 'yourdsUserid';
    string DSPassword = 'yourdspassword';
    string DSAccountID = 'yourdsaccountID';
    string DSIntegratorKey = 'yourdsintegratorkey';


    try
{

//FORCES that the DocuSign member has to be in the DocuSign account DSFS is configured for
List<dsfs__DocuSignAccountConfiguration__c> dsAccountConfig = [Select d.dsfs__UseSendOnBehalfOf__c, d.dsfs__DocuSignBaseURL__c, d.dsfs__DSProSFUsername__c, d.dsfs__DSProSFPassword__c, d.dsfs__AccountId__c From dsfs__DocuSignAccountConfiguration__c d limit 1];

for(dsfs__DocuSignAccountConfiguration__c myConfig : dsAccountConfig)
{

DSEndpoint = myConfig.dsfs__DocuSignBaseURL__c + 'restapi/v2/';
DSUserId = myConfig.dsfs__DSProSFUsername__c;
DSPassword = myConfig.dsfs__DSProSFPassword__c;

}

TextTabs myTextTabToAdd = new TextTabs();

List<TextTabs> myTextTabs = rTabResponse.textTabs;
    for(TextTabs myTextTab : myTextTabs)
    {
    if(myTextTab.tabLabel == 'ContractID')
    {
    myTextTabToAdd = myTextTab;
    }

    }


    String myBody;
    myBody = '{"textTabs": [{"height": '+myTextTabToAdd.height+',"shared": "'+myTextTabToAdd.shared+'","requireInitialOnSharedChange": "'+myTextTabToAdd.requireInitialOnSharedChange+'","name": "'+myTextTabToAdd.name+'1","value": "ContractID12345","width": '+myTextTabToAdd.width+',"required": "'+myTextTabToAdd.required+'","locked": "'+myTextTabToAdd.locked+'","concealValueOnDocument": "'+myTextTabToAdd.concealValueOnDocument+'","disableAutoSize": "'+myTextTabToAdd.disableAutoSize+'","tabLabel": "'+myTextTabToAdd.tabLabel+'","documentId": "'+myTextTabToAdd.documentId+'","recipientId": "7","pageNumber": "'+myTextTabToAdd.pageNumber+'","xPosition": "'+myTextTabToAdd.xPosition+'","yPosition": "'+myTextTabToAdd.yPosition+'"}]}';

HttpRequest request = new HttpRequest();
request.setEndpoint(DSEndpoint + 'accounts/'+DSAccountID+'/envelopes/'+envelopeID+'/recipients/7/tabs');
request.setMethod('POST');
request.setHeader('Content-Type', 'application/json');
request.setHeader('X-DocuSign-Authentication', '<DocuSignCredentials><Username>'+DSUserId+'</Username><Password>'+DSPassword+'</Password><SendOnBehalfOf>david.grigsby@docusign.com</SendOnBehalfOf><IntegratorKey>'+DSIntegratorKey+'</IntegratorKey></DocuSignCredentials>');
request.setHeader('Accept', 'application/json');
request.setTimeout(120000);
request.setBody(myBody);

system.debug(request.getHeader('X-DocuSign-Authentication'));


HttpResponse myResponse = (new Http()).send(request);

system.debug(myResponse.getBody());

if(myResponse.getStatusCode().format()=='201')
{  
response = myResponse.getBody();
system.debug(response);

}

}
catch(Exception ex)
        {
            system.debug(ex);

        }
        finally
        {

        }

        return response;
    }

    public static string deleteRecipientTab(string envelopeID, string recipientGuid)
    {
    string response = '{}';
    string DSEndpoint = 'https://demo.docusign.net/restapi/v2/';
    string DSUserId = 'yourdsUserid';
    string DSPassword = 'yourdspassword';
    string DSAccountID = 'yourdsaccountID';
    string DSIntegratorKey = 'yourdsintegratorkey';


    try
{

//FORCES that the DocuSign member has to be in the DocuSign account DSFS is configured for
List<dsfs__DocuSignAccountConfiguration__c> dsAccountConfig = [Select d.dsfs__UseSendOnBehalfOf__c, d.dsfs__DocuSignBaseURL__c, d.dsfs__DSProSFUsername__c, d.dsfs__DSProSFPassword__c, d.dsfs__AccountId__c From dsfs__DocuSignAccountConfiguration__c d limit 1];

for(dsfs__DocuSignAccountConfiguration__c myConfig : dsAccountConfig)
{

DSEndpoint = myConfig.dsfs__DocuSignBaseURL__c + 'restapi/v2/';
DSUserId = myConfig.dsfs__DSProSFUsername__c;
DSPassword = myConfig.dsfs__DSProSFPassword__c;

}

HttpRequest request = new HttpRequest();
request.setEndpoint(DSEndpoint + 'accounts/'+DSAccountID+'/envelopes/'+envelopeID+'/recipients/'+recipientGuid);
request.setMethod('DELETE');
request.setHeader('Content-Type', 'application/json');
request.setHeader('X-DocuSign-Authentication', '<DocuSignCredentials><Username>'+DSUserId+'</Username><Password>'+DSPassword+'</Password><SendOnBehalfOf>youremail@yourdomain.com</SendOnBehalfOf><IntegratorKey>'+DSIntegratorKey+'</IntegratorKey></DocuSignCredentials>');
request.setHeader('Accept', 'application/json');
request.setTimeout(120000);

system.debug(request.getHeader('X-DocuSign-Authentication'));


HttpResponse myResponse = (new Http()).send(request);

system.debug(myResponse.getBody());

if(myResponse.getStatusCode().format()=='200')
{  
response = myResponse.getBody();
system.debug(response);

}

}
catch(Exception ex)
        {
            system.debug(ex);

        }
        finally
        {

        }

        return response;
    } 

        public static string deleteBlockingRecipient(string envelopeID, string recipientGuid)
    {
    string response = '{}';
    string DSEndpoint = 'https://demo.docusign.net/restapi/v2/';
    string DSUserId = 'yourdsUserid';
    string DSPassword = 'yourdspassword';
    string DSAccountID = 'yourdsaccountID';
    string DSIntegratorKey = 'yourdsintegratorkey';


    try
{

//FORCES that the DocuSign member has to be in the DocuSign account DSFS is configured for
List<dsfs__DocuSignAccountConfiguration__c> dsAccountConfig = [Select d.dsfs__UseSendOnBehalfOf__c, d.dsfs__DocuSignBaseURL__c, d.dsfs__DSProSFUsername__c, d.dsfs__DSProSFPassword__c, d.dsfs__AccountId__c From dsfs__DocuSignAccountConfiguration__c d limit 1];

for(dsfs__DocuSignAccountConfiguration__c myConfig : dsAccountConfig)
{

DSEndpoint = myConfig.dsfs__DocuSignBaseURL__c + 'restapi/v2/';
DSUserId = myConfig.dsfs__DSProSFUsername__c;
DSPassword = myConfig.dsfs__DSProSFPassword__c;

}

HttpRequest request = new HttpRequest();
request.setEndpoint(DSEndpoint + 'accounts/'+DSAccountID+'/envelopes/'+envelopeID+'/recipients/'+recipientGuid);
request.setMethod('DELETE');
request.setHeader('Content-Type', 'application/json');
request.setHeader('X-DocuSign-Authentication', '<DocuSignCredentials><Username>'+DSUserId+'</Username><Password>'+DSPassword+'</Password><SendOnBehalfOf>youremail@yourdomain.com</SendOnBehalfOf><IntegratorKey>'+DSIntegratorKey+'</IntegratorKey></DocuSignCredentials>');
request.setHeader('Accept', 'application/json');
request.setTimeout(120000);

system.debug(request.getHeader('X-DocuSign-Authentication'));


HttpResponse myResponse = (new Http()).send(request);

system.debug(myResponse.getBody());

if(myResponse.getStatusCode().format()=='200')
{  
response = myResponse.getBody();
system.debug(response);

}

}
catch(Exception ex)
        {
            system.debug(ex);

        }
        finally
        {

        }

        return response;
    }    

public static RecipientResponse parseRecipentResponse(String json) {
return (RecipientResponse) System.JSON.deserialize(json, RecipientResponse.class);
}

public static RecipientTabResponse parseRecipientTabResponse(String json) {
return (RecipientTabResponse) System.JSON.deserialize(json, RecipientTabResponse.class);
}
    public class Signer
    {
    public string name;
    public string email;
    public string recipientId;
    public string recipientIdGuid;
    public string requireIdLookup;
    public string userId;
    public string routingOrder;
    public string roleName;
    public string status;
    public string signedDateTime;
    public string deliveredDateTime;
    public string templateLocked;
    public string templateRequired;

    }

    public class RecipientResponse
    {
    public List<Signer> signers;
    public List<Signer> agents;
    public List<Signer> editors;
    public List<Signer> intermediaries;
    public List<Signer> carbonCopies;
    public List<Signer> certifiedDeliveries;
    public List<Signer> inPersonSigners;
    public String recipientCount;
    public String currentRoutingOrder;


    }

public class TextTabs {
public Integer height;
public String validationPattern;
public String validationMessage;
public String shared;
public String requireInitialOnSharedChange;
public String name;
public String value;
public Integer width;
public String required;
public String locked;
public String concealValueOnDocument;
public String disableAutoSize;
public String tabLabel;
public String documentId;
public String recipientId;
public String pageNumber;
public String xPosition;
public String yPosition;
public String tabId;
}

public class RecipientTabResponse 
{
public List<TextTabs> textTabs;



}



}