我正在使用Docusign PHP Client,并尝试创建和封装并通过电子邮件发送。使用当前的SDK,我遇到了错误:
INVALID_REQUEST_BODY请求正文丢失或格式不正确。无法反序列化当前JSON对象(例如{“ name”:“ value”})为类型'API_REST.Models.v2.document []',因为该类型需要JSON数组(例如[1,2,3])来反序列化正确。\ r \ n◀ 要解决此错误,可以将JSON更改为JSON数组(例如[1,2,3]),也可以更改反序列化类型,使其成为普通的.NET类型(例如,不是原始的t▶ 路径“ documents.documentBase64”,第1行,位置31。
所以我必须编辑EnvelopeApi.php (line 2876) json_encode($httpBody)
才能使其正常工作。
现在它可以正常工作了,我收到这样的答复,我无法将创建的状态更改为已发送是我的问题。
EnvelopeSummary {#460 ▼
#container: array:4 [▼
"envelope_id" => "6b9ef863-2ee0-4ea6-9f7e-20b7d4f59b22"
"status" => "created"
"status_date_time" => "2018-10-03T12:30:22.8600000Z"
"uri" => "/envelopes/6b9ef863-2ee0-4ea6-9f7e-20b7d4f59b22"
]
}
我的完整代码:
首先,我认证并获取了$accountId
And then creating Envelope
:
$path = public_path('test.pdf');
$b64Doc = base64_encode(file_get_contents($path));
$document = new Document();
$document->setName("TEST.pdf");
$document->setFileExtension("pdf");
$document->setDocumentId(1);
$document->setDocumentBase64($b64Doc);
$sign_here = new SignHere();
$sign_here->setXPosition(25);
$sign_here->setYPosition(50);
$sign_here->setDocumentId(1);
$sign_here->setPageNumber(1);
$sign_here->setRecipientId(1);
$tabs = new Tabs();
$tabs->setSignHereTabs($sign_here);
$signers = new Signer();
$signers->setName('Test User');
$signers->setEmail('test@mailinator.com');
$signers->setRoleName('Signer');
$signers->setRecipientId(1);
$signers->setRoutingOrder(1);
$signers->setTabs($tabs);
$recipients = new Recipients();
$recipients->setSigners($signers);
$envelope_definition = new EnvelopeDefinition();
$envelope_definition->setEmailSubject('Signature Request');
$envelope_definition->setStatus("sent"); // ***
$envelope_definition->setDocuments($document);
$envelope_definition->setRecipients($recipients);
$options = new CreateEnvelopeOptions();
$options->setCdseMode(null);
$options->setMergeRolesOnDraft(null);
try {
$envelopeSummary = $envelopeApi->createEnvelope($accountId, $envelope_definition, $options);
dd($envelopeSummary);
// Also tried this:
// $envelopeApi->update($accountId, $envelopeSummary->getEnvelopeId(), json_encode(['status' => 'sent']);
} catch (ApiException $e){
dd($e->getResponseBody()->errorCode . " " . $e->getResponseBody()->message);
}
$envelope_definition->setStatus("sent");
这应该触发电子邮件,对不对?但这不是出于某种原因。同样,我也无法在沙箱中看到此创建的信封。
答案 0 :(得分:1)
是的,将status
设置为已发送应该会使DocuSign在创建时发送信封。响应包含"status" => "created"
的事实似乎表明,您对属性($envelope_definition->setStatus("sent");
)的设置实际上并未包含在发出给DocuSign的请求中。
我已经将您的代码与code examples provided in GitHub for the PHP SDK进行了比较,特别是与该页面上的 signatureRequestOnDocument 函数进行了比较。我可以看到您的代码和该示例代码之间唯一明显的区别是创建对象的语法。例如,创建信封:
您的代码:$envelope_definition = new EnvelopeDefinition();
PHP SDK示例代码:$envelop_definition = new DocuSign\eSign\Model\EnvelopeDefinition();
我对PHP知之甚少,更不用说DocuSign PHP SDK了,但是我建议您尝试紧密模仿GitHub上SDK仓库中的code examples,以了解是否这样您将获得不同的结果。
答案 1 :(得分:1)
我的代码是这样的:
$signersArray = array();
$signer = new Signer();
$signer->set...
$signersArray[] = $signer;
$recipients->setSigners($signersArray);
如果它不起作用,请尝试将从SDK发送的数据转储到API,然后仔细检查状态是否正确:
转到159行的Docusign / esign-client / src / ApiClient.php和var_dump($ postData)
答案 2 :(得分:1)
您没有正确设置签名者。它必须是签名者对象的数组。
这是一些未经测试的代码:
# This code creates a signer, not signers
$signer = new Signer();
$signer->setName('Test User');
$signer->setEmail('test@mailinator.com');
$signer->setRoleName('Signer');
$signer->setRecipientId(1);
$signer->setRoutingOrder(1);
$signer->setTabs($tabs);
$recipients = new Recipients();
# setSigners wants an array of signer objects.
# in this case, we make an array with one element
$recipients->setSigners(array($signer));
此外,您也没有正确创建选项卡。同样,它必须是选项卡类型的数组。
有关其他建议,请参见this example。