如何以编程方式在Salesforce中作废DocuSign信封?

如何以编程方式在Salesforce中作废DocuSign信封?,salesforce,docusignapi,Salesforce,Docusignapi,我正在使用DocuSign For Salesforce应用程序。作为我们工作流程的一部分,我们在满足某些条件时创建信封,但如果条件不再满足,我需要能够通过Apex触发器使信封无效 DocuSign应用程序的文档详细介绍了如何创建信封,但没有提到通过Apex将信封作废 我知道可以在Salesforce之外使用API,但如果可能的话,我希望将整个过程保留在Salesforce中 我认为DocuSign for Salesforce应用程序无法作废信封,您可以通过DocuSign控制台作废信封,也可

我正在使用DocuSign For Salesforce应用程序。作为我们工作流程的一部分,我们在满足某些条件时创建信封,但如果条件不再满足,我需要能够通过Apex触发器使信封无效

DocuSign应用程序的文档详细介绍了如何创建信封,但没有提到通过Apex将信封作废


我知道可以在Salesforce之外使用API,但如果可能的话,我希望将整个过程保留在Salesforce中

我认为DocuSign for Salesforce应用程序无法作废信封,您可以通过DocuSign控制台作废信封,也可以自己编写API调用作废

如果您可以通过Apex发出http请求,那么您应该能够轻松地编写代码。要使信封无效,请在
/accounts/{accountId}/envelopes/{envelopeId}
URI中添加
PUT
。以下是通话内容:

PUT https://{server}/restapi/{apiVersion}/accounts/{accountId}/envelopes/{envelopeId}

X-DocuSign-Authentication: <DocuSignCredentials><Username>{name}</Username><Password>{password}</Password><IntegratorKey>{integrator_key}</IntegratorKey></DocuSignCredentials>
Accept: application/json
Content-Type: application/json

{
  "status":"voided",
  "voidedReason":"voided for incorrect recipient"
}
PUT https://{server}/restapi/{apiVersion}/accounts/{accountId}/envelopes/{envelopeId}
X-DocuSign-Authentication:{name}{password}{integrator\u key}
接受:application/json
内容类型:application/json
{
“状态”:“已作废”,
“作废原因”:“因收件人不正确而作废”
}

Salesforce管理包的DocuSign能够使信封作废。但是,在如何实现这一点上存在一些限制

安装托管包时,会创建一个名为“作废信封”的自定义按钮。这目前仅在文档登录状态记录中可用

在DocuSign for Salesforce托管包中,没有以编程方式作废信封的选项

我不是Salesforce触发器或APEX类的专家,但您可以设置一个触发器或按钮,当您的信贷部门将某项服务标记为“不再可用”时,它将重定向到相应的DocuSign状态记录,在该记录中,作废信封按钮位于该记录中


或者,您可以按照@Ergin的建议构建自己的API工作流。

这里有一个简单的客户端,您可以使用它来作废来自apex的信封

public with sharing class DocusignClient {
    private static final String USERNAME = Label.docusign_username;
    private static final String PASSWORD = Label.docusign_password;    
    private static final String INTEGRATOR_KEY = label.docusign_integratorKey;
    private static final String ACCOUNT_ID = label.docusign_accountId;
    // for production use 'www.docusign.net/restapi/v2'
    // for sandbox use 'https://demo.docusign.net/restapi/v2'
    private static final String BASE_URL = label.docusign_baseurl;
    private static final String AUTH_TEMPLATE = '<DocuSignCredentials><Username>{0}</Username><Password>{1}</Password><IntegratorKey>{2}</IntegratorKey></DocuSignCredentials>';
    private static final String STATUS_VOID = 'voided';


    public HttpResponse voidEnvelope(String envelopeId, String voidReason){
        String endpoint = String.format('{0}/accounts/{1}/envelopes/{2}', new String[]{BASE_URL, ACCOUNT_ID, envelopeId});

        DocusignStatusRequest statusUpdate = new DocusignStatusRequest();
        statusUpdate.status = STATUS_VOID;
        statusUpdate.voidedReason = voidReason;

        // initialize the api client for the desired environment
        Http h = new Http();
        HttpRequest request = new HttpRequest();
        request.setEndpoint(endpoint);
        request.setMethod('PUT');
        request.setHeader('X-DocuSign-Authentication', String.format(AUTH_TEMPLATE, new String[]{USER_NAME,PASS_WORD,INTEGRATOR_KEY}));
        request.setBody(JSON.serialize(statusUpdate));

        return h.send(request);
    }

    public class DocusignStatusRequest{
        public String status {get; set;}
        public String voidedReason {get; set;}
    }
}
public与共享类DocusignClient{
私有静态最终字符串USERNAME=Label.docusign\u USERNAME;
私有静态最终字符串密码=Label.docusign\u密码;
私有静态最终字符串积分器\u KEY=label.docusign\u integratorKey;
私有静态最终字符串ACCOUNT\u ID=label.docusign\u accountId;
//供生产使用“www.docusign.net/restapi/v2”
//沙箱使用'https://demo.docusign.net/restapi/v2'
私有静态最终字符串BASE\u URL=label.docusign\u baseurl;
私有静态最终字符串AUTH_TEMPLATE='{0}{1}{2}';
私有静态最终字符串状态_VOID='VOID';
公共HttpResponse voidEnvelope(字符串envelopeId,字符串voidReason){
String endpoint=String.format({0}/accounts/{1}/envelopes/{2}),新字符串[]{BASE\u URL,ACCOUNT\u ID,envelopeId});
DocusignStatusRequest statusUpdate=新的DocusignStatusRequest();
statusUpdate.status=状态\无效;
statusUpdate.voidedReason=voidReason;
//为所需环境初始化api客户端
Http h=新的Http();
HttpRequest请求=新建HttpRequest();
setEndpoint(端点);
request.setMethod('PUT');
request.setHeader('X-DocuSign-Authentication',String.format(AUTH_模板,新字符串[]{USER_NAME,PASS_WORD,INTEGRATOR_KEY}));
setBody(JSON.serialize(statusUpdate));
返回h.send(请求);
}
公共类DocusignStatusRequest{
公共字符串状态{get;set;}
公共字符串voidedReason{get;set;}
}
}

Hi Eric,您介意解释一下您需要作废信封的条件吗?我们的设置会存储每个客户使用的计费服务的信息。如果信贷部门将某项服务标记为不再可用,我们希望使使用该服务的任何文档无效。我们最终只是强迫用户在计费服务被标记为关闭之前作废所有挂起的信封。我尝试了上面的代码,但没有成功。我需要完成OAuth流才能完成吗?@Ankuli no这是使用用户名和密码流。您还必须有一个
INTEGRATOR\u密钥
(当docusign批准您的应用程序时,您会得到此密钥)