Docusignapi DocuSign API产量不能\u排除\u文档错误

Docusignapi DocuSign API产量不能\u排除\u文档错误,docusignapi,Docusignapi,我们已经有使用DocuSign C#API的代码在生产中使用了一年多了,其中一些代码成功地排除了来自某些接收者的文档,但其他接收者没有。现在,在一个新的信封类型上,我得到了上面的错误,并且不知道为什么。下面是轻度编辑/匿名的JSON请求负载和带有错误的DocuSign响应(都是用Fiddler捕获的) 如您所见,有三个文档和两个签名者,两个签名者都获得文档id 1,一个签名者被排除在文档id 2之外,另一个签名者被排除在文档id 3之外。还有两名复印件接收人都是我们账户的内部员工。值得一提的是,

我们已经有使用DocuSign C#API的代码在生产中使用了一年多了,其中一些代码成功地排除了来自某些接收者的文档,但其他接收者没有。现在,在一个新的信封类型上,我得到了上面的错误,并且不知道为什么。下面是轻度编辑/匿名的JSON请求负载和带有错误的DocuSign响应(都是用Fiddler捕获的)

如您所见,有三个文档和两个签名者,两个签名者都获得文档id 1,一个签名者被排除在文档id 2之外,另一个签名者被排除在文档id 3之外。还有两名复印件接收人都是我们账户的内部员工。值得一提的是,帐户上的文档可见性设置为“必须签名才能查看,除非发件人帐户中有成员。”

以下是发送到DocuSign以创建信封的JSON负载:

{
  "documents": [
    {
      "documentId": "1",
      "name": "Document1",
      "fileExtension": "pdf",
      "order": "1",
      "documentBase64": "blahblahblah"
    },
    {
      "documentId": "2",
      "name": "Document2",
      "fileExtension": "pdf",
      "order": "2",
      "documentBase64": "blahblahblah"
    },
    {
      "documentId": "3",
      "name": "Document2",
      "fileExtension": "pdf",
      "order": "3",
      "documentBase64": "blahblahblah"
    }
  ],
  "recipients": {
    "signers": [
      {
        "tabs": {
          "signHereTabs": [
            {
              "name": "Joe Smith",
              "tabLabel": "Signature1",
              "scaleValue": "0.9",
              "documentId": "1",
              "recipientId": "1",
              "anchorString": "Some anchor text",
              "anchorXOffset": "4",
              "anchorYOffset": "46",
              "anchorMatchWholeWord": "true",
              "tabId": "Signature1"
            },
            {
              "name": "Joe Smith",
              "tabLabel": "Signature2",
              "documentId": "2",
              "recipientId": "1",
              "anchorString": "Some other anchor text",
              "anchorXOffset": "4",
              "anchorYOffset": "67",
              "anchorMatchWholeWord": "true",
              "tabId": "Signature2"
            }
          ],
          "dateSignedTabs": [
            {
              "tabLabel": "DateSigned1",
              "documentId": "1",
              "recipientId": "1",
              "anchorString": "Some anchor text",
              "anchorXOffset": "175",
              "anchorYOffset": "38",
              "anchorMatchWholeWord": "true",
              "tabId": "DateSigned1"
            }
          ],
          "textTabs": []
        },
        "recipientSuppliesTabs": "false",
        "excludedDocuments": [ "3" ],
        "name": "Joe Smith",
        "email": "joesmith@example.com",
        "emailRecipientPostSigningURL": "https://www.foocorp.com/e-consent-complete/",
        "recipientId": "1",
        "customFields": [],
        "routingOrder": "1",
        "roleName": "Signer",
        "emailNotification": {
          "emailSubject": "Joe Smith has documents from Foo Corp",
          "emailBody": "Blah blah blah"
        }
      },
      {
        "tabs": {
          "signHereTabs": [
            {
              "name": "Bob Jones",
              "tabLabel": "Signature1",
              "scaleValue": "0.9",
              "documentId": "1",
              "recipientId": "2",
              "anchorString": "Some anchor text",
              "anchorXOffset": "277",
              "anchorYOffset": "46",
              "anchorMatchWholeWord": "true",
              "tabId": "Signature1"
            },
            {
              "name": "Bob Jones",
              "tabLabel": "Signature3",
              "documentId": "3",
              "recipientId": "2",
              "anchorString": "Some other anchor text",
              "anchorXOffset": "4",
              "anchorYOffset": "67",
              "anchorMatchWholeWord": "true",
              "tabId": "Signature3"
            }
          ],
          "dateSignedTabs": [
            {
              "tabLabel": "DateSigned1",
              "documentId": "1",
              "recipientId": "2",
              "anchorString": "Some anchor text",
              "anchorXOffset": "448",
              "anchorYOffset": "38",
              "anchorMatchWholeWord": "true",
              "tabId": "DateSigned1"
            }
          ],
          "textTabs": []
        },
        "recipientSuppliesTabs": "false",
        "excludedDocuments": [ "2" ],
        "name": "Bob Jones",
        "email": "bobjones@example.com",
        "emailRecipientPostSigningURL": "https://www.foocorp.com/e-consent-complete/",
        "recipientId": "2",
        "customFields": [],
        "routingOrder": "1",
        "roleName": "Signer",
        "emailNotification": {
          "emailSubject": "Bob Jones has documents from Foo Corp",
          "emailBody": "Blah blah blah"
        }
      }
    ],
    "carbonCopies": [
      {
        "name": "Sue Employee",
        "email": "sue@foocorp.com",
        "emailRecipientPostSigningURL": "https://www.foocorp.com/e-consent-complete/",
        "recipientId": "3",
        "customFields": [],
        "routingOrder": "1",
        "roleName": "Internal",
        "emailNotification": {
          "emailSubject": "Joe Smith has documents from Foo Corp",
          "emailBody": "Blah blah blah"
        }
      },
      {
        "name": "Sam Employee",
        "email": "sam@foocorp.com",
        "emailRecipientPostSigningURL": "https://www.foocorp.com/e-consent-complete/",
        "recipientId": "4",
        "customFields": [],
        "routingOrder": "1",
        "roleName": "Internal",
        "emailNotification": {
          "emailSubject": "Joe Smith has documents from Foo Corp",
          "emailBody": "Blah blah blah"
        }
      }
    ],
    "certifiedDeliveries": []
  },
  "status": "created",
  "emailSubject": "Joe Smith has documents from Foo Corp",
  "emailBlurb": "Blah blah blah",
  "allowMarkup": "false",
  "allowReassign": "false",
  "recipientsLock": "true",
  "emailSettings": {
    "replyEmailAddressOverride": "sue@foocorp.com",
    "replyEmailNameOverride": "Sue Employee"
  }
}
下面是HTTP响应:

HTTP/1.1 400 Bad Request
Cache-Control: no-cache
Content-Length: 177
Content-Type: application/json; charset=utf-8
X-RateLimit-Reset: 1519927200
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 997
X-DocuSign-TraceToken: deadbeef-dead-beef-dead-beefdeadbeef
Date: Thu, 01 Mar 2018 17:25:01 GMT
Strict-Transport-Security: max-age=31536000; includeSubDomains

{
  "errorCode": "CANNOT_EXCLUDE_DOCUMENT",
  "message": "This document cannot be excluded for this recipient. Recipient: Joe Smith cannot be excluded from Document:"
}
任何方向都欢迎

编辑以显示被排除的文档都共享相同的名称,因为对我来说这是一个“逻辑名称”,例如,“W9”,我将其与文档上的自定义字段结合使用,以便在通过连接调用返回时路由到文档管理中的正确位置。如果我用不同的名称发送id为2和3的文档,那么这一切都可以正常工作。但是排除是根据文档id而不是文档名称工作的,那么这又有什么关系呢


编辑#2:我能够向自己证明,文档名是什么并不重要——不管它们是相同的还是不同的,我得到了错误。

当您使用锚字符串时,DocuSign会在完整信封上搜索该锚字符串,锚不在文档范围,而锚在信封范围上。因此,如果您在信封中添加了相同的两个文档,那么DocuSign将在两个文档中找到锚字符串,并将两个文档上的DS选项卡分配给收件人。现在,由于您两次使用相同的文档,因此这两个文档中的DS选项卡将分配给收件人,并且在这种情况下,
excludedDocuments
将没有意义。

奇怪的是,我尝试了您的JSON请求,它对我有效:{“信封ID”:“aa66541c-1b65-4057-b97f-E0272D16KB”,“uri”:“/envelopes/aa66541c-1b65-4057-b97f-E0272D16CharStyle”,“statusDateTime:“2018-03-01T19:39:44.157000Z”,“status:“created”}这很奇怪。我发现API作为一个整体设计得很好(除了一个小部分),这只是我第二次感到“惊讶”。“我反对演示网站,因为它仍在测试中-你是反对演示还是反对生产?我反对演示环境。但是如果你想的话,我可以试试生产的。我自己在所有交易中都使用这个功能,我从来没有遇到过这个问题。@Frederic,你能帮我吗?我认为这不会改变你的结果,但我正在努力消除变量。一、 同样,在同一项目的另一个地方使用此功能也没有问题。今天我还将自己做更多的测试,看看是否能找到答案。真奇怪!事实上,我刚刚意识到我没有生产账户。但我的客户在生产中很好地使用了这一特性,并实际确认了这样的JSON请求在生产中可以工作。这就是您发送的消息吗?是的,不幸的是,我昨天从DocuSign支持部门收到了相同的答案,并且还没有更新,因此我将您的答案标记为。我对DocuSign及其API总体上是满意的,但这让人恼火,因为在放置选项卡时指定了文档id,然后它就忽略了这一点!它给我们的一个文档带来了麻烦,我们仍在努力解决如何处理它。DocumentId主要用于根据X/Y坐标添加DS选项卡。对于锚字符串,documentId被忽略。该Amil。对我们来说,问题是我们不控制文档(供应商提供的),因此不控制锚文本,但我们需要将相同的文档类型发送给多个具有排除项的收件人。我仍然认为X/Y坐标是“脆弱的”,特别是因为我们不控制表单,表单可以改变布局(但是,我们锚定的文本不太可能改变)。根据X/Y坐标,我是否正确地认为定位基于(a)文档id,(b)该文档中的页码,然后(c)该页面中的X/Y?这可能是我们唯一的选择。是的,X/Y基于文档ID和页码