You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
}
?>
关键配置说明
  1. 路由顺序(routingOrder):

    • 设为1和2时,是依次签署:第一个人签完后,DocuSign才会给第二个人发邮件,两人都签完信封才会完成;
    • 如果需要并行签署(两人同时收到邮件,都签完才算完成),可以把两个签署人的routingOrder都设为1。
  2. 签署标签(Tabs):
    每个签署人必须绑定对应的签署位置,否则DocuSign会认为该收件人不需要签署,直接跳过邮件通知。除了锚文本,你也可以用setPageNumber()和setXPosition()/setYPosition()来指定固定坐标。

  3. 排查辅助步骤:
    如果你还是有问题,可以登录DocuSign控制台,查看该信封的「收件人状态」和「日志」,里面会详细记录邮件发送情况、签署进度,帮你定位具体哪里出了问题。

内容的提问来源于stack exchange,提问作者Martin Strnad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:24:28