请求服务器时出现docusign apiexception invalid_request 错误

时间:2021-07-02 15:26:09

标签: docusignapi

继续我的旅程,创建最简单的基线 DocuSign 电子签名项目,以便我们可以将 DocuSign 功能集成到更大的应用程序中。我创建了一个新的 C# .net 核心 Web 应用程序,并从 C# 快速入门示例项目中引入了 SDK 调用,据我所知。

我使用与 QuickStart 项目相同的集成密钥,并将 URL 添加到我在 DocuSign 仪表板中的新应用程序。我现在可以从 https://account-d.docusign.com/oauth/auth 获得重定向。我将 private.key 从 QuickStart 复制到我的项目中。当我尝试在 RequestItemService/UpdateUserFromJWT 中复制 ApiClient 调用时,我现在收到以下错误。

Screenshot of error

HomeController 代码:

using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DocuSign.eSign.Api;
using DocuSign.eSign.Model;
using DocuSign.eSign.Client;
using System.Text;
using DocusignStart.Common;
using System.Security.Claims;
using static DocuSign.eSign.Client.Auth.OAuth;
using static DocuSign.eSign.Client.Auth.OAuth.UserInfo;

namespace DocusignStart.Controllers
{
public class HomeController : Controller
{
    protected IRequestItemsService RequestItemsService { get; }
    protected static ApiClient _apiClient;
    public HomeController(IRequestItemsService requestItemsService)
    {
        RequestItemsService = requestItemsService;
        _apiClient = new ApiClient();
        ViewBag.title = "Signing request by email";
    }

    public IActionResult Index()
    {
        // ClientId is the integration key on the DocuSign dashboard
        string ClientId = "xxxxxxxx";
        string AuthorizationEndpoint = "https://account-d.docusign.com/oauth/auth";
        string AppUrl = "https://localhost:44340";

        string scopes = "signature impersonation";

        string DocuSignAuthUrl = AuthorizationEndpoint + "?response_type=code" +
                        "&scope=" + scopes +
                        "&client_id=" + ClientId +
                        "&redirect_uri=" + AppUrl + "/home/loggedin?authType=JWT";

        return Redirect(DocuSignAuthUrl);
    }

    public IActionResult LoggedIn(string authType)
    {
        string ClientId = "xxxxxxxxx";
        string ClientSecret = "xxxxxxxxxxxxxxxx";
        string TokenEndpoint = "https://account-d.docusign.com/oauth/token";
        string UserInformationEndpoint = "https://account-d.docusign.com/oauth/userinfo";
        string RoomsApiEndpoint = "https://demo.rooms.docusign.com";
        string SignerEmail = "example.com";
        string SignerName = "User";
        string GatewayAccountId = "{GATEWAY_ACCOUNT_ID}";
        string GatewayName = "TestApplication";
        string GatewayDisplayName = "TestApplication";
        string ImpersonatedUserId = "xxxxxxxxxxxxxxxxxxxx";
        string AuthServer = "account-d.docusign.com";
        string PrivateKeyFile = "private.key";
        List<string> scopes = new List<string>
            {
                "signature",
                "impersonation",
            };

        OAuthToken _authToken;
        
        Account _account;

        _authToken = _apiClient.RequestJWTUserToken(
            ClientId, ImpersonatedUserId, AuthServer,
            DSHelper.ReadFileContent(DSHelper.PrepareFullPrivateKeyFilePath(PrivateKeyFile)), 1, scopes);
        _account = GetAccountInfo(_authToken);


        var identity = HttpContext.User.Identity as ClaimsIdentity;
        bool auth = identity.IsAuthenticated;

        var accessToken = RequestItemsService.User.AccessToken;
        var basePath = "https://demo.docusign.net" + "/restapi";
        var accountId = RequestItemsService.Session.AccountId;

        // Call the Examples API method to create and send an envelope via email
        var envelopeId = SendEnvelopeViaEmail(SignerEmail, SignerName, accessToken, basePath, accountId, "Incomplete");

        //RequestItemsService.EnvelopeId = envelopeId;


        return View();
    }

    public static string SendEnvelopeViaEmail(/* same as original */)
    {
        // same as original
    }

    private static byte[] document1(string signerEmail, string signerName)
    {
        /// same as document1
    }

    private Account GetAccountInfo(OAuthToken authToken)
    {
        string AuthServer = "account-d.docusign.com";

        _apiClient.SetOAuthBasePath(AuthServer);
        DocuSign.eSign.Client.Auth.OAuth.UserInfo userInfo = _apiClient.GetUserInfo(authToken.access_token);
        Account acct = userInfo.Accounts.FirstOrDefault();
        if (acct == null)
        {
            throw new Exception("The user does not have access to account");
        }

        return acct;
    }
}
}

1 个答案:

答案 0 :(得分:0)

答案其实很简单。复制粘贴 ImpersonatedUserId 时,' - ' 字符之间添加了空格,即“xxxx-xxx-xxxx”变成了“xxxx - xxx - xxxx”。删除这些空格解决了这个问题。