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

从Salesforce数据更新Docusign中的数据字段标记,salesforce,apex-code,docusignapi,apex,Salesforce,Apex Code,Docusignapi,Apex,我正在使用Docusign API集成到Salesforce。我需要在文档中的数据字段标记发送签名后,通过从Salesforce调用Docusign API来更新它 假设签名者的路由顺序是从签名者1到签名者4。最初,该数据字段标记的值将为null。签名者3“完成”签名后,我必须从Salesforce触发API调用,并使用从Salesforce中对象的自定义字段值检索的值更新标记。然后签名者4将能够在签署文档之前看到数据字段标记中的值 我使用docusign的合并字段将Salesforce数据导入

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

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

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

是否有任何方法可以“刷新”信封,以便更新数据字段标记中的值

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


请注意,我已经阅读了Docusign RestAPI guide Version2中的“修改收件人标签”文章。这是用于修改标记类型或标记值的吗?

Salesforce和DS可以这样做,但不是您现在的做法。我在上节课的另一个问题上回答了你关于背景的问题

合并字段是问题的一部分,但它们仅在“发送”时显示为值,并且仅在信封成功完成时更新Salesforce,因此对于您的场景来说,这实际上只是解决方案的一半

下面是我为另一个DocuSign客户所做的工作,作为如何做到这一点的示例,但请联系您的DocuSign客户经理,因为我认为如果您正在执行这些类型的高级工作流,您可以从我所在的DocuSign专业服务组获益

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>


使用开箱即用的DocuSign for Salesforce integration无法实现您想要的功能。您可以通过API或web更正文档并更新该值。谢谢@AndrewWilson。我就这么做了。将信封投递至正确状态,放入标签值,将其置于已发送状态。所有这些都是通过RESTapi.Hey@AndrewWilson完成的,调用Docusign RESTapi以“更正”状态发布信封时返回的url需要在浏览器中运行才能激活。然后,它只允许我更新标记值。您知道如何将url发送到浏览器并在apex的后台运行吗?我对salesforce不太了解,但我不知道apex页面如何自动执行浏览器工作流。不是说这不可能,我只是不知道怎么做:)哦,好的。@AndrewWilson谢谢你。谢谢你的回复。我肯定会使用该代码作为参考,但docusign不允许我通过运行更正URL,通过REST API GET请求发布处于“更正”状态的信封,并且您在其他帖子上回复的PUT请求不允许在信封发送后更新数据字段标记。您能特别建议我,如何在信封发送后更新信封中的数据字段标签,同时/不将信封设置为更正模式吗?首先,我们目前没有锁定(Future),因此当您为收件人“添加”信封更改(添加、更新、删除)时,您仅在此时处于“更正”状态,然而,在完成UI和修改之前,通过advanced correct中的控制台,您处于该状态,目前也无法通过UI使用该状态。因此,发送信封,最后有一个阻塞用户,按照99这样的路由顺序,收件人100是您的初始值用户,然后读取收件人100标记,一旦阻塞,将相同的收件人添加到路由顺序98和标记,删除收件人100和99。代码中的注释显示了这一点,理解代码以解决此问题非常重要,再次,我建议使用此类高级工作流,请联系您的DocuSign客户经理,让ProServ参与此类付费API帮助,以便您能够更快地完成项目,并获得有效使用DocuSign API所需的洞察力。我们现在有了一个新的认证和课程,你也可以参加,基于我在亚马逊Kindle上创建的实验室,收费不到3美元,correct就是其中之一,这非常有帮助。谢谢,太好了!,那么,请您将答案标记为:-)此外,APEX代码中的注释也应该有助于排序。干杯
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;



}



}