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

如何通过Google Apps Script自动获取DocuSign的Access Token

解决Google Apps Script自动获取DocuSign Access Token的问题

一、修复「Error: Callback function name is required.」错误

这个错误的核心原因是你误用了http://localhost/作为回调URI,且未配置GAS OAuth2服务要求的回调函数。按以下步骤修正:

  1. 替换回调URI

    • 在GAS编辑器中点击「发布」>「部署为Web应用」,生成并复制专属的Web应用URL(首次部署需设置执行权限为「任何人,甚至匿名」,后续可按需调整)。
    • 登录DocuSign开发者后台,将应用的回调URI更新为上述Web应用URL。
  2. 补充OAuth服务的回调配置
    修改getOAuthService函数,添加回调函数声明,并配置token持久化存储:

二、实现无需重复手动授权的自动Token管理

Authorization Code Grant模式下,首次授权后会返回有效期30天的refresh token,利用它可自动刷新8小时有效期的access token,无需每次生成授权码。完整修正代码如下:

function getAuthorizationCodeGrant() {
  var clientId = 'xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
  var clientSecret = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
  // 替换为你的GAS Web应用URL
  var redirectUri = 'https://script.google.com/macros/s/你的Web应用ID/exec';
  var scope = 'signature';
  var authUrl = 'https://account-d.docusign.com/oauth/auth';
  var tokenUrl = 'https://account-d.docusign.com/oauth/token';

  var service = getOAuthService(clientId, clientSecret, redirectUri, scope, authUrl, tokenUrl);

  if (!service.hasAccess()) {
    var authorizationUrl = service.getAuthorizationUrl();
    Logger.log('首次授权请打开以下URL:');
    Logger.log(authorizationUrl);
    return HtmlService.createHtmlOutput('<a href="' + authorizationUrl + '" target="_blank">点击授权</a>');
  }

  // 自动获取有效access token(会自动用refresh token刷新过期的token)
  var accessToken = service.getAccessToken();
  Logger.log('Access token: ' + accessToken);

  // DocuSign API调用示例
  var apiUrl = 'https://demo.docusign.net/restapi/v2.1/accounts';
  var options = {
    headers: {
      'Authorization': 'Bearer ' + accessToken
    }
  };
  var response = UrlFetchApp.fetch(apiUrl, options);
  Logger.log('API response: ' + response.getContentText());
}

function getOAuthService(clientId, clientSecret, redirectUri, scope, authUrl, tokenUrl) {
  return OAuth2.createService('docusign')
    .setAuthorizationBaseUrl(authUrl)
    .setTokenUrl(tokenUrl)
    .setClientId(clientId)
    .setClientSecret(clientSecret)
    .setRedirectUri(redirectUri)
    .setScope(scope)
    .setCallbackFunction('authCallback') // 指定回调函数
    .setPropertyStore(PropertiesService.getUserProperties()); // 持久化存储token信息
}

// 授权回调处理函数
function authCallback(request) {
  var clientId = 'xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
  var clientSecret = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
  var redirectUri = 'https://script.google.com/macros/s/你的Web应用ID/exec';
  var scope = 'signature';
  var authUrl = 'https://account-d.docusign.com/oauth/auth';
  var tokenUrl = 'https://account-d.docusign.com/oauth/token';
  
  var service = getOAuthService(clientId, clientSecret, redirectUri, scope, authUrl, tokenUrl);
  var isAuthorized = service.handleCallback(request);
  
  return isAuthorized 
    ? HtmlService.createHtmlOutput('授权成功!可关闭此页面返回脚本编辑器查看日志。')
    : HtmlService.createHtmlOutput('授权失败,请重试。');
}

// 手动刷新token的辅助函数(可选)
function refreshToken() {
  var clientId = 'xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
  var clientSecret = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
  var redirectUri = 'https://script.google.com/macros/s/你的Web应用ID/exec';
  var scope = 'signature';
  var authUrl = 'https://account-d.docusign.com/oauth/auth';
  var tokenUrl = 'https://account-d.docusign.com/oauth/token';
  
  var service = getOAuthService(clientId, clientSecret, redirectUri, scope, authUrl, tokenUrl);
  if (service.hasAccess()) {
    service.refreshAccessToken();
    Logger.log('Token已刷新');
  }
}

三、关键注意事项

  • 首次授权:必须手动打开日志中的URL完成授权,之后脚本会自动通过refresh token刷新access token,无需重复手动操作。
  • refresh token有效期:DocuSign的refresh token有效期为30天,到期后需重新授权一次。
  • Web应用部署:部署时需选择「新建项目版本」,执行权限可按需设置为「自己」或「任何人」,访问权限首次授权需设为「任何人,甚至匿名」。
  • OAuth2库确认:确保已安装GAS OAuth2库(库ID:1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:15:17