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
- OAuth基础路径固定为
- 优化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
相关产品推荐
相关产品推荐

