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

PHP集成Docusign调用createEnvelope()返回HTTP 302问题求助

Docusign createEnvelope接口返回302错误修复方案

错误原因

302响应本质是地址重定向,触发原因是你配置的eSign API请求主机地址不匹配:Docusign的OAuth认证基础路径和eSign业务接口的请求路径是两套独立地址,你当前代码中复用了同一个base_path配置同时赋值给了OAuth配置和API主机配置,导致请求被重定向到正确接口域名,而SDK默认不会自动处理重定向,因此返回302响应。

修复步骤

  • 拆分两套地址配置,不要混用:
    沙箱环境配置规则:
    • OAuth基础路径固定为account-d.docusign.com,仅用于setOAuthBasePath方法传参
    • eSign API请求主机固定为https://demo.docusign.net/restapi,仅用于Configuration的setHost方法传参
      生产环境配置规则:
    • OAuth基础路径固定为account.docusign.com
    • eSign API请求主机固定为https://www.docusign.net/restapi
  • 优化ApiClient实例复用逻辑,不需要在generate方法中重复初始化ApiClient和Configuration,避免配置参数不一致
  • 建议通过getUserInfo接口自动获取绑定的账户ID,不要硬编码createEnvelope的account_id参数,避免参数填写错误

修正后核心代码示例

<?php
require_once('../vendor/autoload.php');
require_once('../config/docusignConfiguration.php');
use DocuSign\eSign\Client\ApiClient;
use DocuSign\eSign\Configuration;
use DocuSign\eSign\Api\EnvelopesApi;

class DocumentSigner{
    private $jwtUserToken = null;
    private $apiClient = null;
    private $accountId = null;

    // 初始化统一ApiClient实例
    private function initApiClient(){
        global $DOCUSIGN_CONFIG;
        if($this->apiClient) return;

        // 先处理JWT认证
        $oauthBasePath = $DOCUSIGN_CONFIG['oauth_base_path']; // 单独配置oauth地址
        $apiHost = $DOCUSIGN_CONFIG['api_host']; // 单独配置API请求地址

        $this->apiClient = new ApiClient();
        $this->apiClient->getOAuth()->setOAuthBasePath($oauthBasePath);
        // 获取JWT token
        $jwtToken = $this->apiClient->requestJWTUserToken(
            $DOCUSIGN_CONFIG['client_id'], 
            $DOCUSIGN_CONFIG['user_id'], 
            $DOCUSIGN_CONFIG['rsa_key'], 
            $DOCUSIGN_CONFIG['scope']
        );
        $this->jwtUserToken = $jwtToken[0]->getAccessToken();

        // 配置API请求参数
        $config = Configuration::getDefaultConfiguration()
            ->setHost($apiHost)
            ->addDefaultHeader('Authorization', 'Bearer ' . $this->jwtUserToken);
        $this->apiClient = new ApiClient($config);

        // 自动获取accountId
        $userInfo = $this->apiClient->getUserInfo($this->jwtUserToken);
        $this->accountId = $userInfo[0]->getAccounts()[0]->getAccountId();
    }

    public function getAccessToken(){
        if(!$this->jwtUserToken){
            $this->initApiClient();
        }
        return $this->jwtUserToken;
    }

    public function make_envelope()
    {
        $demo_docs_path = '../documents/Sample';
        $content_bytes = file_get_contents($demo_docs_path . ".pdf");
        $base64_file_content = base64_encode($content_bytes);
        $document = new \DocuSign\eSign\Model\Document([
            'document_base64' => $base64_file_content,
            'name' => 'Example document',
            'file_extension' => 'pdf',
            'document_id' => 1
        ]);
        $signer = new \DocuSign\eSign\Model\Signer([
            'email' => 'check@gmail.com', 'name' => 'Checker Singh',
            'recipient_id' => "1", 'routing_order' => "1",
            'client_user_id' => 1000
        ]);
        $sign_here = new \DocuSign\eSign\Model\SignHere([
            'anchor_string' => '/sn1/', 'anchor_units' => 'pixels',
            'anchor_y_offset' => '10', 'anchor_x_offset' => '20'
        ]);
        $signer->setTabs(new \DocuSign\eSign\Model\Tabs(['sign_here_tabs' => [$sign_here]]));
        $envelope_definition = new \DocuSign\eSign\Model\EnvelopeDefinition([
            'email_subject' => "Please sign this document sent from the PHP SDK",
            'documents' => [$document],
            'recipients' => new \DocuSign\eSign\Model\Recipients(['signers' => [$signer]]),
            'status' => "sent"
        ]);
        return $envelope_definition;
    }


    public function generate(){
        $this->initApiClient();
        $envelope_definition = $this->make_envelope();
        $envelope_api = new EnvelopesApi($this->apiClient);
        try{
            $results = $envelope_api->createEnvelope($this->accountId, $envelope_definition);
            return $results->getEnvelopeId();
        } catch(\DocuSign\eSign\Client\ApiException $e){
            var_dump($e->getResponseBody());
        }
    }
}

$documentSigner = new DocumentSigner();
var_dump($documentSigner->generate());
?>

配置文件参考

你需要修改docusignConfiguration.php中的配置,新增两套地址参数:

// 沙箱环境示例
$DOCUSIGN_CONFIG = [
    'oauth_base_path' => 'account-d.docusign.com',
    'api_host' => 'https://demo.docusign.net/restapi',
    'client_id' => '你的集成密钥',
    'user_id' => '你的用户ID',
    'rsa_key' => '你的RSA私钥内容',
    'scope' => 'signature impersonation'
];

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:54:05