coldfusion - 带有 ColdFusion 的 DocuSign API

标签 coldfusion docusignapi

更新了工作解决方案

我正在尝试使用 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 和 FORMFIELD,但仍然无效。我什至尝试将信封更改为 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> 

几周来我一直在为这个问题苦苦挣扎。任何指导将不胜感激。

最佳答案

很可能是额外的 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。)如果您使用此方法,您的请求将不再需要是“多部分”请求,因为文档字节将包含在请求的 XML 部分中请求正文(不在后续/单独的部分中)。如果 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 请求主体,就是这样。

关于coldfusion - 带有 ColdFusion 的 DocuSign API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20847326/

相关文章:

javascript - 更新: Applying AJAX'd JSON data to existing checkboxes and checking/unchecking (jQuery)

mysql - 拍卖结束时间触发其他 Action

video - ffmpeg 返回非零退出状态。检查标准输出 Coldfusion

docusignapi - Docusign 选项卡 - 可能不存在

coldfusion - 如何将日期时间从查询转换为字符串以在 Google 可视化图表中使用它?

regex - 使用正则表达式删除 RTF 模板中占位符的父段落

php - 我可以创建没有 clientUserId 的收件人 View 吗

docusignapi - 通过API获取表单数据(包括隐藏值)?

javascript - XSRF 与 AngularJS : DocuSign API Embedded View Client-Side implementation