DocuSign PHP客户端:添加多名必填远程签署人至信封的语法问题
嘿,我帮你排查下这个DocuSign PHP SDK的问题!看起来你在设置两名必须签署的远程签署人时,大概率是路由顺序配置、签署标签分配或者收件人ID唯一性出了问题,才导致第一个签署人收不到邮件,且第二个签完就直接结束流程。我给你梳理下正确的实现逻辑,附完整修正代码:
核心问题分析
你的代码大概率踩了这几个坑:
- 两个签署人的
routingOrder(路由顺序)设置重复,或者没设置,导致DocuSign误以为是并行签署但又没给第一个人分配签署任务; - 第一个签署人没有对应的签署标签(Tabs),DocuSign直接判定他不需要签署,跳过了邮件通知;
- 收件人ID(
recipientId)重复,导致DocuSign覆盖了第一个签署人的配置; - 信封状态没设为
sent,处于草稿状态自然不会发邮件。
修正后的完整代码
<?php echo 'Docusign php file alive, results (potentially) below<p><p>'; // 初始化DocuSign客户端(请替换成你的认证逻辑) require_once 'vendor/autoload.php'; $apiClient = new \DocuSign\eSign\Client\ApiClient(); // 这里省略你的OAuth2获取token、设置baseUri等认证步骤 // 1. 创建信封定义 $envelopeDefinition = new \DocuSign\eSign\Model\EnvelopeDefinition(); $envelopeDefinition->setEmailSubject('请完成文档签署'); $envelopeDefinition->setStatus('sent'); // 关键:必须设为sent才会触发邮件发送 // 2. 添加需要签署的文档(替换成你的文件路径) $document = new \DocuSign\eSign\Model\Document(); $document->setDocumentBase64(base64_encode(file_get_contents('your_document.pdf'))); $document->setName('待签署文档.pdf'); $document->setDocumentId('1'); // 文档唯一ID $envelopeDefinition->setDocuments([$document]); // 3. 配置第一个签署人 $signer1 = new \DocuSign\eSign\Model\Signer(); $signer1->setEmail('signer_one@example.com'); $signer1->setName('签署人甲'); $signer1->setRecipientId('1'); // 必须唯一,不能和第二个签署人重复 $signer1->setRoutingOrder('1'); // 路由顺序1:第一个签署 // 给签署人甲分配签署位置(这里用锚文本示例,也可以用坐标定位) $signHere1 = new \DocuSign\eSign\Model\SignHere(); $signHere1->setAnchorString('{{signer1_sign}}'); // 文档中预先埋好的锚文本标记 $signHere1->setAnchorUnits('pixels'); $signHere1->setAnchorYOffset('10'); $signHere1->setAnchorXOffset('20'); $tabs1 = new \DocuSign\eSign\Model\Tabs(); $tabs1->setSignHereTabs([$signHere1]); $signer1->setTabs($tabs1); // 必须给签署人绑定签署标签,否则DocuSign会跳过他 // 4. 配置第二个签署人 $signer2 = new \DocuSign\eSign\Model\Signer(); $signer2->setEmail('signer_two@example.com'); $signer2->setName('签署人乙'); $signer2->setRecipientId('2'); // 唯一ID $signer2->setRoutingOrder('2'); // 路由顺序2:等第一个人签完再通知他 // 给签署人乙分配签署位置 $signHere2 = new \DocuSign\eSign\Model\SignHere(); $signHere2->setAnchorString('{{signer2_sign}}'); $signHere2->setAnchorUnits('pixels'); $signHere2->setAnchorYOffset('10'); $signHere2->setAnchorXOffset('20'); $tabs2 = new \DocuSign\eSign\Model\Tabs(); $tabs2->setSignHereTabs([$signHere2]); $signer2->setTabs($tabs2); // 5. 将两个签署人添加到信封收件人列表 $recipients = new \DocuSign\eSign\Model\Recipients(); $recipients->setSigners([$signer1, $signer2]); $envelopeDefinition->setRecipients($recipients); // 6. 发送信封 $envelopesApi = new \DocuSign\eSign\Api\EnvelopesApi($apiClient); try { $envelopeSummary = $envelopesApi->createEnvelope('你的账号ID', $envelopeDefinition); echo "信封创建成功,信封ID:" . $envelopeSummary->getEnvelopeId(); } catch (Exception $e) { echo "错误信息:" . $e->getMessage(); } ?>
关键配置说明
路由顺序(routingOrder):
- 设为
1和2时,是依次签署:第一个人签完后,DocuSign才会给第二个人发邮件,两人都签完信封才会完成; - 如果需要并行签署(两人同时收到邮件,都签完才算完成),可以把两个签署人的
routingOrder都设为1。
- 设为
签署标签(Tabs):
每个签署人必须绑定对应的签署位置,否则DocuSign会认为该收件人不需要签署,直接跳过邮件通知。除了锚文本,你也可以用setPageNumber()和setXPosition()/setYPosition()来指定固定坐标。排查辅助步骤:
如果你还是有问题,可以登录DocuSign控制台,查看该信封的「收件人状态」和「日志」,里面会详细记录邮件发送情况、签署进度,帮你定位具体哪里出了问题。
内容的提问来源于stack exchange,提问作者Martin Strnad
相关产品推荐
相关产品推荐

