更新了工作解决方案
我正在尝试使用 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/