【问题标题】:DocuSign API with ColdFusion带有 ColdFusion 的 DocuSign API
【发布时间】:2014-08-16 05:42:37
【问题描述】:

更新了工作解决方案

我正在尝试使用 ColdFusion 集成 DocuSign API 并不断遇到问题。我能够成功验证并检索基本 URL。但是,当尝试使用单个收件人和文档创建信封时,我收到一条错误消息,指出在请求中找不到“边界终止符”(当它很明显时)。

我知道这个问题与这里的另一个帖子类似,但那是不久前的帖子,从未完全回答过。

我首先阅读了PDF文档:

<cffile action="READBINARY" file="Agreement.pdf" variable="docData">
<cfset docData = BinaryEncode(docData,"Base64")>

然后我使用包含编码二进制 PDF 数据的元素在 XML 中创建信封定义:

<cfset envelope = "<envelopeDefinition xmlns=""http://www.docusign.com/restapi"">
                <status>Sent</status>
                <emailSubject>eSignature request</emailSubject>
                <emailBlurb>Please sign the document</emailBlurb>
                <recipients>
                    <signers>
                        <signer>
                            <recipientId>1</recipientId>
                            <name>eCS Buyer</name>
                            <email>XXX@XXXX.com</email>
                            <tabs>
                                <signHereTabs>
                                    <signHere>
                                        <documentId>1</documentId>
                                        <pageNumber>3</pageNumber>
                                        <xPosition>10</xPosition>
                                        <yPosition>100</yPosition>
                                    </signHere>
                                </signHereTabs>
                            </tabs>
                        </signer>
                    </signers>
                </recipients>
                <documents>
                    <document>
                        <name>Agreement.pdf</name>
                        <documentId>1</documentId>
                        <fileExtension>pdf</fileExtension>
                        <documentBase64>#docData#</documentBase64>
                    </document>
                </documents>
               </envelopeDefinition>">

最后,我发布信息:

<cfhttp url="#baseURL#/envelopes" method="POST" resolveurl="Yes" throwonerror="No">
<cfhttpparam name="X-DocuSign-Authentication" type="HEADER" value="<DocuSignCredentials><Username>#userName#</Username><Password>#password#</Password><IntegratorKey>#integratorKey#</IntegratorKey></DocuSignCredentials>">
<cfhttpparam name="Content-Type" type="HEADER" value="application/xml">
<cfhttpparam name="Accept" type="HEADER" value="application/xml">
<cfhttpparam name="Content-Length" type="HEADER" value="#Len(envelope)#">
<cfhttpparam name="request_body" type="BODY" value="#envelope#">
</cfhttp>

我尝试将请求正文的 TYPE 属性更改为 XML 和 FORFIELD,但仍然无法正常工作。我什至尝试将信封更改为 JSON 格式,但无济于事。

产生的错误是:

<errorCode>INVALID_REQUEST_BODY</errorCode><message>The request body is missing or improperly formatted. The XML request does not match the expected format. </message></errorDetails> 

我已经为此苦苦挣扎了好几个星期。任何指导将不胜感激。

【问题讨论】:

    标签: coldfusion docusignapi


    【解决方案1】:

    很可能是额外 CRLF 的问题(即额外的换行符)。有关完整请求结构的示例,请参阅其他论坛帖子中的答案:Docusign : Unable to create envelope from document in restapi v2

    更新 #1

    您的 XML 请求正文似乎缺少有关文档的信息。尝试添加一个 documents 元素作为 envelopeDefinition 的子元素(即,作为 recipients 的对等元素):

    <envelopeDefinition xmlns=""http://www.docusign.com/restapi"">
        ...            
        <documents>
            <document>
                <name>Agreement.pdf</name>
                <documentId>1</documentId>
            </document>
        </documents>
        ...
    </envelopeDefinition>
    

    另外,请确保您在请求的后续部分中发送的文档字节未编码。

    更新 #2

    我对 ColdFusion 了解不多,但是您的这行代码看起来像是在 (base64) 对包含在请求中的字节流进行编码:

    <cfset docData = BinaryEncode(docData,"Base64")>
    

    这可能会导致您的最新问题,因为我认为当您当前使用的方式包含编码字节流时,DocuSign 不会接受它。

    如果您必须对字节流进行 base64 编码,您可以在 document 元素下添加 documentBase64 属性以包含 base64 编码的字节流。 (请参阅 DocuSign REST API 指南的第 104 页 -- http://www.docusign.com/sites/default/files/REST_API_Guide_v2.pdf。)如果您使用这种方法,您的请求将不再需要是“多部分”请求,因为文档字节将包含在请求正文(不在后续/单独部分中)。如果 base64 编码的字节流包含在 documentBase64 元素中,以下是请求的示例:

    POST /restapi/v2/accounts/ACCOUNT_NUMBER/envelopes HTTP/1.1
    Host: demo.docusign.net
    X-DocuSign-Authentication: {"Username":"SENDER_EMAIL_ADDRESS","Password":"PASSWORD","IntegratorKey":"INT_KEY"}
    Content-Type: application/xml
    
    <envelopeDefinition xmlns="http://www.docusign.com/restapi">
        <accountId>ACCOUNT_ID</accountId>
        <status>sent</status>  
        <emailSubject>eSignature request</emailSubject>
        <emailBlurb>Please sign the document</emailBlurb>
        <recipients>
          <signers>
            <signer>
             <email>johnsEmail@outlook.com</email>
             <name>John Doe</name>
             <recipientId>1</recipientId>
             <routingOrder>1</routingOrder>  
             <tabs>
                <signHereTabs>
                    <signHere>
                        <documentId>1</documentId>
                        <pageNumber>1</pageNumber>
                        <xPosition>10</xPosition>
                        <yPosition>100</yPosition>
                    </signHere>
                </signHereTabs>
            </tabs>
            </signer>
          </signers>
        </recipients>
        <documents>
            <document>
                <name>Agreement.pdf</name>
                <documentId>1</documentId>
                <fileExtension>pdf</fileExtension>
                <documentBase64>BASE64-ENCODED-BYTE-STREAM</documentBase64>
            </document>
        </documents>
    </envelopeDefinition>
    

    由于文档字节包含在请求的 XML 部分中,因此请求不再需要是多部分的——只需传递我上面显示的 XML 请求正文,就是这样。

    【讨论】:

    • 谢谢 Kim Brandl 和 @Ergin。我用你的换行建议更新了我的代码,但现在我得到了一个不同的错误。我现在得到:NO_DOCUMENT_RECEIVED The document element did not contain the encoded document, or there is a problem with the encoding. No documents were found in the request.
    • 好的,我添加了 元素并且能够成功地创建/发送带有基本文本文档的信封,但是当我尝试使用 PDF 时,我得到:UNABLE_TO_LOAD_DOCUMENT Unable to load the document. Unable to load Document(1). Error: the document is corrupt, rebuilding failed。我检查了文件,没有安全限制。我还能够将文档作为模板上传到 DocuSign UI。有什么建议吗?
    • 我不知道 Cold Fusion,但你的这部分代码: - 看起来你正在(base64)编码您最终写入 DocuSign 请求的字节流。我认为 DocuSign 不会接受 base64 编码的字符串——这可能会导致您的问题。
    • 用 UPDATE #2 更新了我的答案。
    • 更新了我的答案以包含一个代码示例,用于将文档字节作为 XML 请求正文的一部分(在“documentBase64”元素内)发送。
    【解决方案2】:

    该错误很可能是由于您在文档字节之后和结束边界--MYBOUNDARY-- 之前有额外的 CRLF。你有这个:

    #docData#
    
    --MYBOUNDARY--
    

    尝试在没有额外 CRLF 的情况下将其更改为:

    #docData#
    --MYBOUNDARY--
    

    作为参考,您可以查看DocuSign API Walkthrough for sending a signature request on a document。每个不同的语言版本都会向您展示传出请求正文的格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 2012-05-24
      相关资源
      最近更新 更多