在Google Apps Script中用JWT认证DocuSign API创建模板报错求助
DocuSign JWT认证创建模板错误修复
核心问题分析
你遇到的“You need to enable JavaScript to run this app”错误,本质是请求路径错误加上认证方式误用导致的,以下是具体问题和修复步骤:
1. API请求URL错误
你把OAuth token获取接口和模板创建接口的路径混在一起了:
- 错误URL:
https://account-d.docusign.com/oauth/token/restapi/v2.1/accounts/<accountid>/templates - 正确模板创建URL(演示环境):
https://demo.docusign.net/restapi/v2.1/accounts/<accountid>/templates
2. 认证头配置错误
调用DocuSign API时,需要用JWT交换得到的access token通过Authorization头传递,而不是把grant_type和assertion放在请求头里(那是获取token的请求参数)。
3. 请求Content-Type错误
创建模板需要发送JSON格式的请求体,所以Content-Type必须设为application/json,而非application/x-www-form-urlencoded。
4. JWT使用逻辑错误
JWT本身不是access token,你需要先调用OAuth token接口,用JWT交换得到有效的access token,再用这个token调用模板创建接口。
修复后的完整代码
function createTemplate() { // 1. 先通过JWT获取access token const jwtAssertion = "你的JWT断言"; // 注意:这是生成的JWT,不是access token const tokenUrl = "https://account-d.docusign.com/oauth/token"; const tokenPayload = { grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer", assertion: jwtAssertion }; const tokenOptions = { method: "post", contentType: "application/x-www-form-urlencoded", payload: tokenPayload, muteHttpExceptions: true }; const tokenResponse = UrlFetchApp.fetch(tokenUrl, tokenOptions); const tokenData = JSON.parse(tokenResponse.getContentText()); const accessToken = tokenData.access_token; // 得到有效的access token // 2. 准备模板创建的参数 const driveFile = DriveApp.getFileById("FILEID"); const changeorderEncode = Utilities.base64Encode(driveFile.getBlob().getBytes()); const accountId = "你的账户ID"; const templateUrl = `https://demo.docusign.net/restapi/v2.1/accounts/${accountId}/templates`; const templatePayload = { "envelopeTemplateDefinition": { "name": "TestTemplate5" }, "documents": [ { "documentBase64": changeorderEncode, "documentId": "1", "fileExtension": "pdf", "name": "Change Order Test 5" } ], "emailSubject": "1234 Easy St Change Order", "recipients": { "signers": [ { "name": "Recipient Name", "recipientId": "1", "tabs": { "signHereTabs": [ { "documentId": "1", "pageNumber": "1", "tabLabel": "Signature2", "xPosition": "407", "yPosition": "650" }, { "documentId": "1", "pageNumber": "1", "tabLabel": "Signature", "xPosition": "140", "yPosition": "650" } ], "dateTabs": [ { "documentId": "1", "pageNumber": "1", "tabLabel": "date", "xPosition": "140", "yPosition": "715" }, { "documentId": "1", "pageNumber": "1", "tabLabel": "date", "xPosition": "407", "yPosition": "715" } ], "textTabs": [ { "documentId": "1", "pageNumber": "1", "name": "Project Address", "value": "1234 Easy St, Roseville, CA 95678", "width": 55, "xPosition":"76", "yPosition":"159" } ] } } ] }, "status": "created" }; // 3. 发送模板创建请求 const templateOptions = { method: "post", headers: { "Authorization": `Bearer ${accessToken}`, "Accept": "application/json", "Content-Type": "application/json" }, payload: JSON.stringify(templatePayload), muteHttpExceptions: true }; const templateResponse = UrlFetchApp.fetch(templateUrl, templateOptions); Logger.log(templateResponse.getContentText()); }
额外注意事项
- 确保你的JWT断言包含正确的
iss(集成商密钥)、sub(用户ID)、aud(演示环境为account-d.docusign.com)等声明 - 已完成用户的JWT授权(即用户至少登录过一次你的集成应用进行授权)
- 替换代码中的
你的JWT断言、你的账户ID、FILEID为实际值
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

