Docusign系列(三) - SOAP 方式調用Docusign


經過之前的操作,對Docusign的基本功能有了一個比較全面的認識,那么這篇博客將教你如何調用Docusign的SOAP API 接口來實現電子簽名的功能

首先在Docusign提供的官方文檔中找到SOAP API文檔,Docusign有兩個SOAP API的服務端點:API.ASMX和DSAPI.ASMX

  • https://demo.docusign.net/api/3.0/dsapi.asmx
  • https://demo.docusign.net/api/3.0/api.asmx

Docusign官方建議使用DSAPI.ASMX端點集成,其主要優點是它使用X-DocuSign-Authentication標准,而不是WSE3 Username Token執行認證,與之相比,X-DocuSign-Authentication對調用方法而言更容易實現

那么在打開https://demo.docusign.net/api/3.0/dsapi.asmx后,這是一個XML的文件,將這個XML通過WSDL的方式生成Salesforce中的Apex類(操作方法可以參考我的博客:Salesforce SOAP 接口集成服務), 直接導入會遇到一個ERROR信息:

  • Failed to parse wsdl: Found more than one wsdl:binding. WSDL with multiple binding not supported

這是因為daspi.XML這個文件的最后有這樣兩行

<wsdl:port name="DSAPIServiceSoap" binding="tns:DSAPIServiceSoap">
      <soap:address location="https://demo.docusign.net/api/3.0/dsapi.asmx" />
</wsdl:port>
<wsdl:port name="DSAPIServiceSoap12" binding="tns:DSAPIServiceSoap12">
      <soap12:address location="https://demo.docusign.net/api/3.0/dsapi.asmx" />
</wsdl:port>

以及與這兩個Port對應的Bing

<wsdl:binding name="DSAPIServiceSoap" type="tns:DSAPIServiceSoap">
<wsdl:binding name="DSAPIServiceSoap12" type="tns:DSAPIServiceSoap">

刪除其中之一,即可重新導入,這里我們刪除后面的DSAPIServiceSoap12, 記得將生成的Apex命名為: DocusignApi

OK, 完成這一步之后,我們需要准備Docusign賬號的信息,包括

  • UserId:docusign賬號的36位Id
  • AccountId:API Account Id
  • password:Docusign 賬號的密碼
  • IntegratoryKey:接口的key值
  • endpoint:https://demo.docusign.net/api/3.0/dsapi.asmx

其中 IntegratoryKey 的值需要在Docusign中申請, Docusign Admin  →  INTEGRATIONS → API and Keys

 

 

Tips: 在API and Key 里,你也可以找到自己賬戶的UserId和AccountId

准備好上述內容后,我們上傳一個需要電子簽名的模板到Docusign中

首先進入Salesforce → Docusign eSignature → Docusign Admin → custom tag,新建一個簽名的tag:SignName,然后在准備上傳的DOC模板加上這個Tag

 

 

 

 

選擇Template頁簽,新建模板, 上傳完成演示模板后,將模板的Id取出來保存:TemplateId

 

我們創建一個class: DocusignDemo

/**
 * @Author:Ricardo
 * @funtion:test docusign soap Api
 * @time:2020-04-16
 * */
public without sharing class DocusignDemo {
    public static String USERID = 'XXXX';
    public static String ACCOUNTID = 'XXXXX';
    public static String PASSWORD = 'XXXXX';
    public static String INTEGRATORKEY = 'XXXXXX';
    public static String ENDPOINT = 'https://demo.docusign.net/api/3.0/dsapi.asmx';
    public static void sendWithDocusign(String recordId){
        Contract con = [SELECT id FROM Contract WHERE Id=:recordId];
        
        DocusignApi.DSAPIServiceSoap dsApi = new DocusignApi.DSAPIServiceSoap();
        dsApi.endpoint_x = ENDPOINT;
        
        //Set Authentication
        String auth = '<DocuSignCredentials>'
                        + '<Username>'+ USERID + '</Username>' 
                        + '<Password>' + PASSWORD + '</Password>' 
                        + '<IntegratorKey>' + INTEGRATORKEY + '</IntegratorKey>' 
                    + '</DocuSignCredentials>';
        System.debug('Setting authentication to: ' + auth);
            
        dsApi.inputHttpHeaders_x = new Map<String, String>();
        dsApi.inputHttpHeaders_x.put('X-DocuSign-Authentication', auth);
        
        // 發送Docusign中的模板
        DocuSignAPI.TemplateReference templateReference = new DocuSignAPI.TemplateReference();
        templateReference.Template = 'templateId';// 傳入模板ID
        templateReference.TemplateLocation = 'Server';
        
        DocusignApi.ArrayOfTemplateReference templateReferences = new DocusignApi.ArrayOfTemplateReference();
        templateReferences.TemplateReference = new DocusignApi.TemplateReference[]{templateReference};
            
       // 第一個簽字
        DocusignApi.Recipient firstSigner = new DocusignApi.Recipient();
        firstSigner.ID = 1;
        firstSigner.Type_x = 'Signer';// 收件人類型 - Signer表示需要簽字
        firstSigner.RoutingOrder = 1;// 簽字順序
        firstSigner.Email = 'test@docusign.com';
        firstSigner.UserName = '第一個簽字';
        firstSigner.RequireIDLookup = false;
        
        // 第二個簽字
        DocusignApi.Recipient secondSigner = new DocusignApi.Recipient();
        secondSigner.ID = 2;
        secondSigner.Type_x = 'Signer';
        secondSigner.RoutingOrder = 2;
        secondSigner.Email = 'test@salesforce.com';
        secondSigner.UserName = '第二個簽字';
        secondSigner.RequireIDLookup = false;
        
        // 第三個收件人
        DocusignApi.Recipient ccCopy = new DocusignApi.Recipient();
        ccCopy.ID = 3;
        ccCopy.Type_x = 'CarbonCopy';// 抄送給這個收件人,並不需要其簽字
        ccCopy.RoutingOrder = 3;
        ccCopy.Email = 'copy@file.com';
        ccCopy.UserName = '不用簽字';
        ccCopy.RequireIDLookup = false;
        
        DocusignApi.ArrayOfRecipient1 recipients = new DocusignApi.ArrayOfRecipient1();
        recipients.Recipient = new DocusignApi.Recipient[]{firstSigner,secondSigner,ccCopy};
        
        DocusignApi.EnvelopeInformation envelopeInfo = new DocusignApi.EnvelopeInformation();
        envelopeInfo.AccountId = ACCOUNTID;
        envelopeInfo.Subject = 'email subject';// Max 100 characters
        envelopeInfo.EmailBlurb =  'email message.';// Max 10000 characters
            
        DocusignApi.CustomField platformName = new DocusignApi.CustomField (); 
        platformName.Name = 'PlatformName';
        platformName.Value = 'Salesforce';
        platformName.Show = 'False';
        
        DocusignApi.CustomField appName = new DocusignApi.CustomField (); 
        appName.Name = 'AppName';
        appName.Value = 'DocuSignForSalesforce';
        appName.Show = 'False';
        
        DocusignApi.CustomField SFContract = new DocusignApi.CustomField (); 
        SFContract.Name = '##SFContract';
        SFContract.Value = recordId;
        SFContract.Show = 'False';
        
        DocusignApi.CustomField DSFSSourceObjectId = new DocusignApi.CustomField (); 
        DSFSSourceObjectId.Name = 'DSFSSourceObjectId';
        DSFSSourceObjectId.Value = recordId + '~Contract';
        DSFSSourceObjectId.Show = 'False';
        
        DocusignApi.ArrayOfCustomField arrayOfCustomFields = new DocusignApi.ArrayOfCustomField();
        arrayOfCustomFields.CustomField  = new list<DocusignApi.CustomField>();
        arrayOfCustomFields.CustomField.add(platformName);
        arrayOfCustomFields.CustomField.add(appName);
        arrayOfCustomFields.CustomField.add(SFContract);
        arrayOfCustomFields.CustomField.add(DSFSSourceObjectId);        
            
        System.debug('*** arrayOfCustomFields:' + arrayOfCustomFields);        
        envelopeInfo.CustomFields = arrayOfCustomFields;
        
        try {
            DocusignApi.EnvelopeStatus es = dsApi.CreateEnvelopeFromTemplates(templateReferences,recipients,envelopeInfo,true);
            String envelopeId = es.EnvelopeID;
            System.debug(LoggingLevel.INFO, '*** EnvelopeID:' + es.EnvelopeID);
            System.debug(LoggingLevel.INFO, '*** Status:' + es.Status);
        } catch ( CalloutException e) {
            System.debug('Exception - ' + e );
        }
    }
}

最后,在Salesforce的Console控制台中,執行一段代碼:

DocusignDemo.sendWithDocusign('8002w000000HXkJ');

 在設定的郵件中可以查看到需要簽字的郵件,簽字的文檔顯示如下:

 

 

以上,是關於在Salesforce中使用SOPA API的方式調用Docusign的演示demo,如有問題,歡迎留言交流


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM