Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Docusign API集成问题

Docusign API集成问题
EN

Stack Overflow用户
提问于 2021-07-21 17:01:43
回答 1查看 145关注 0票数 1

我正在尝试将Docusign集成到我们的Java (Java-11)应用程序中。

我正在尝试使用JWT流来实现同样的目的。授权应用程序后,我可以创建获取访问令牌,但是在尝试创建信封和创建嵌入的请求时,我看到以下错误:

代码语言:javascript
运行
AI代码解释
复制
[2021-07-21 15:00:32.954] [EC2AMAZ-5EFUJD8] [http-nio-8080-exec-2] ERROR c.p.e.h.GovCloudBaseExceptionHandler@handleException:237 - -- handleException() - {}
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=text/html;charset=utf-8, type=class com.docusign.esign.model.EnvelopeSummary, genericType=class com.docusign.esign.model.EnvelopeSummary.
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:232)
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156)
    at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1091)
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:834)
    at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:363)
    at org.glassfish.jersey.client.InboundJaxrsResponse$2.call(InboundJaxrsResponse.java:126)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:316)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:298)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:229)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestSco

下面代码中的createEnvelope方法抛出错误

代码语言:javascript
运行
AI代码解释
复制
void CreateEnvelope()
        {
            // Create the envelope definition
            EnvelopeDefinition envelope = null;
            try {
                envelope = makeEnvelope("anur.puniyani@teliolabs.com", "Anur");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            // Call DocuSign to create the envelope
            //ApiClient apiClient = createApiClient("", bearerToken);
            
              
            
            
            EnvelopesApi envelopesApi = new EnvelopesApi(apiClient);
            EnvelopeSummary envelopeSummary = null  ;
            try {
                envelopeSummary = envelopesApi.createEnvelope("1a9c289e-f63d-4f63-b6cd-5c43af184603", envelope);
            } catch (ApiException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            

             envelopeId = envelopeSummary.getEnvelopeId();
             System.out.println("Envelope ID (&(*&(&( !!!!= "+envelopeId);
        }

我为ApiClient构造函数使用了以下基本url:https://account-d.docusign.com,因为我的应用程序仪表板(demo.docusign.com)中的url似乎不能用于授予权限,并且抛出了一个page not found错误。

请帮助我和我的同事一整天都被这个问题困扰着。我们尝试联系支持人员,但他们不提供API支持,除非您有许可证。

EN

回答 1

Stack Overflow用户

发布于 2021-07-21 19:30:14

编辑:我发现你使用的基本路径缺少/restapi,它应该是https://demo.docusign.com/restapi。另外,我错误地说了docusign.net,而它应该是docusign.com

据我所知,在EnvelopeDefinition中没有直接创建信封的类方法。您需要指定API调用成功所需的各种关联部分。这部分代码来自我们启动器中的eSignature example 002。我做了一些小改动,使它可以与单个文档一起工作。您需要将此信封定义发送到主机"demo.docusign.net“:

代码语言:javascript
运行
AI代码解释
复制
package com.docusign.controller.eSignature.examples;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Base64;
import com.docusign.esign.api.EnvelopesApi;
import com.docusign.esign.client.ApiClient;
import com.docusign.esign.client.ApiException;
import com.docusign.esign.model.Document;
import com.docusign.esign.model.EnvelopeDefinition;
import com.docusign.esign.model.EnvelopeSummary;
import com.docusign.esign.model.Recipients;
import com.docusign.esign.model.SignHere;
import com.docusign.esign.model.Signer;
import com.docusign.esign.model.Tabs;

class CreateEnvelope
        {
        public static void main(String[] args) {
        // Create the envelope definition
        String accessToken = "eyJ0eXAi......JgAkJuZ8A";
        String accountId = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxx";
        

        // Call DocuSign to create the envelope
        ApiClient apiClient = new ApiClient("https://demo.docusign.net/restapi");
        apiClient.addDefaultHeader("Authorization", "Bearer " + accessToken);

        EnvelopesApi envelopesApi = new EnvelopesApi(apiClient);
        EnvelopeDefinition envelope = makeEnvelope("anur.puniyani@teliolabs.com", "Anur");
        try {
            EnvelopeSummary envelopeSummary = envelopesApi.createEnvelope(accountId, envelope);

            String envelopeId = envelopeSummary.getEnvelopeId();
            System.out.println("Envelope ID = "+envelopeId);
        } catch (ApiException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
              

     

        }

        private static EnvelopeDefinition makeEnvelope(String signerEmail, String signerName) {
            // Create a signer recipient to sign the document, identified by name and email
            // We set the clientUserId to enable embedded signing for the recipient
            Signer signer = new Signer();
            signer.setEmail(signerEmail);
            signer.setName(signerName);
            // signer.clientUserId("1000"); # will not receive docuSign email to sign if client user id is present
            signer.recipientId("1");

            SignHere signHere = new SignHere();
            signHere.setAnchorString("/sn1/");
            signHere.setAnchorUnits("pixels");
            signHere.setAnchorYOffset("20");
            signHere.setAnchorXOffset("10");

            Tabs signerTabs = new Tabs();
            signerTabs.setSignHereTabs(Arrays.asList(signHere));
    
            // Add the recipient to the envelope object
            Recipients recipients = new Recipients();
            recipients.setSigners(Arrays.asList(signer));
    
            EnvelopeDefinition envelopeDefinition = new EnvelopeDefinition();
            envelopeDefinition.setEmailSubject("Please sign this document");
            envelopeDefinition.setRecipients(recipients);
            
            Path path = Paths.get("./path/to/my/code-examples-java/src/main/resources/World_Wide_Corp_lorem.pdf");
            
            byte[] data = null;
            try {
                data = Files.readAllBytes(path);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            Document document = new Document();
            document.setDocumentBase64(Base64.getEncoder().encodeToString(data));
            document.setName("Hello Doc");
            document.setFileExtension("pdf");
            document.setDocumentId("3");

            envelopeDefinition.setDocuments(Arrays.asList(document));
            // Request that the envelope be sent by setting |status| to "sent".
            // To request that the envelope be created as a draft, set to "created"
            envelopeDefinition.setStatus("sent");
    
            return envelopeDefinition;
        }
    }

上面的代码来自代码示例启动器here。还提供了一个预打包版本,其中包含您在快速入门页面上的here中填写的所有配置详细信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68473692

复制
相关文章
Discourse 修改上传附件的大小
官方的帖子在:Change the maximum attachment/upload size - sysadmin - Discourse Meta 页面中。
HoneyMoose
2023/06/14
2970
Discourse 修改上传附件的大小
织梦dede修改附件图片储存路径
在用织梦建站时,在运营网站一段时间后,会发现织梦默认的图片上传路径有问题,织梦默认保存图片附件是按照日期来建目录,路径为uploads/allimg/171008/ ,网站每天都上传图片,时间长了uploads/allimg就有太多的目录了
用户8851537
2021/07/20
3.3K0
Emlog文章列表获取附件(图片)数量方法
本方法实际获取的是文章附件的数量,而非只是图片的数量,如果你的文章含有文件附件,列表也会显示成图片数量。所以此方法最适合于文章图片特别多而且没有附件的博客。Emlog文章列表获取附件(图片)数量,方法过于简单,修改博客emlog模板文件步骤如下:
用户8099761
2023/05/10
4330
NetCMS修改之二:单击新闻附件,直接打开文件「建议收藏」
NetCMS系统的新闻附件,是通过down.aspx页面实现下载附件的。这样做的好处可能是可以隐藏附件的真实地址,但给用户使用会带来一个小麻烦:无法使用右键单击来实现将下载的文件另存为。
全栈程序员站长
2022/11/11
3660
abstract修改方法
抽象的方法是要让子类继承下去再定义它的。让抽象的概念得以设计。比如当一种面向对象设计遇到一种方法有多种设计的时候,能够在基类暂且不设计他,把设计的工作交给子类去完毕,但子类设计时。要么继续继承他超类的抽象概念,要么就把抽象的方法定义出来。
全栈程序员站长
2022/07/18
2540
Typecho上传附件失败最佳解决方法
2.继续下面的工作:找到usr/uploads这个文件夹,修改777权限,linux和Windows系统修改的方法不同,但网上都有很多介绍:Windows下网站目录777可读写权限设置方法 然后重启服务器,上传附件成功。
白衣少年
2022/12/26
1.3K0
Typecho上传附件失败最佳解决方法
爬虫课堂(十四)|URL的去重方法
所谓的URL去重,就是爬虫将重复抓取的URL去除,避免多次抓取同一网页。爬虫一般会将待抓取的URL放在一个队列中,从抓取后的网页中提取到新的URL,在他们被放入队列之前,首先要确定这些新的URL没有被
黄小怪
2018/05/21
2.1K0
梁老师小课堂|谈谈模板方法模式
众多设计模式中,我觉得模板方法模式是很好理解,也很值得深入研究的技巧。定义如下,在一个包含多个步骤的业务框架中,大部分步骤是固定不变,并且适用于多种业务场景,可变的步骤则留给子类独立实现,从而分离了稳定和变化。
公众号_松华说
2020/11/17
3900
梁老师小课堂|谈谈模板方法模式
远程字体修改方法
注释: 其中font-family: ‘xxx’; 中的 xxx 字体名称(可随意命名,需要与使用时的名字保持一直)
小狐狸说事
2022/11/17
9990
JbuilderX的修改方法
打开JBuilderX/bin/jbuilder.config文件,在 #TunethisVMtoprovideenoughheadroomtoworkonlarge #applications vmparam-Xms32m vmparam-Xmx256m 后面追加一行 vmparam-Dprimetime.editor.useVariableWidthFont=true 此方法方法,在不同的系统和机器上表现的结果可能会不尽相同,大家自己研究吧。 可以把%system%/document.andSettings/you_user 目录下的/.primetimeX和/.jbuilderX目录删掉,然后再启动JBuilderX试试,一般就正常了。这时,可以看到“Tools”—“Perferences”中“Edit”—“Display”的“Fontfamily”选项为“DialogInput”。无论中文显示还光标位置应该都没有问题了,而且即使系统格掉重装,也不会有影响,不需要再重新设置。
逍遥剑客
2019/02/20
4370
JbuilderX的修改方法
打开JBuilderX/bin/jbuilder.config文件,在 #TunethisVMtoprovideenoughheadroomtoworkonlarge #applications vmparam-Xms32m vmparam-Xmx256m 后面追加一行 vmparam-Dprimetime.editor.useVariableWidthFont=true 此方法方法,在不同的系统和机器上表现的结果可能会不尽相同,大家自己研究吧。 可以把%system%/document.andSettin
逍遥剑客
2018/05/21
4820
go上传附件
package main import ( "fmt" "html/template" "io" "log" "net/http" "os" ) //上传方法 func upload(w http.ResponseWriter, r *http.Request) { //这里是get请求 if r.Method == "GET" { t, _ := template.ParseFiles("upload.html") t.Execute(w, nil) } else if r.Method == "POST" { // 服务端调用r.ParseMultipartForm,把上传的文件存储在内存和临时文件中 32 << 20 是一个很大的值:33554432 r.ParseMultipartForm(32 << 20) //这里获取表单的uploadfile file, handler, err := r.FormFile("uploadfile") if err != nil { fmt.Println(err) return } defer file.Close() //这里打开文件buffer f, err := os.OpenFile("./upload/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666) if err != nil { fmt.Println(err) return } defer f.Close() //把文件cp到指定目录下。 io.Copy(f, file) fmt.Fprintf(w, "%v", handler.Header) fmt.Fprintf(w, "上传成功") } else { fmt.Println("error") } } func main() { http.HandleFunc("/upload", upload) err := http.ListenAndServe(":8081", nil) if err != nil { log.Fatal("ListenAndServe:", err) } } ------------------------------------------------------------ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>go 上传test</title> </head> <body> <form method="POST" action="/upload" enctype="multipart/form-data" > <input type="file" name="uploadfile" /> <input type="submit" value="上传"> </form> </body> </html>
公众号-利志分享
2022/04/25
1.2K0
小课堂|计算文件Checksum的几种方法
比如,我们到Apache网站上去下载用于操作Excel的依赖包 - Apache POI,就可以看到checksum:SHA-256, SHA-512,如下图所示:
孟君
2021/11/23
1.4K0
小课堂|计算文件Checksum的几种方法
emlog缩略图不同实现方法:正文-附件-随机图片
实现emlog列表也缩略图按先调用正文第一张图片,没有则调用附件图片,如果前两者都没有则调用随机图片代码
用户8099761
2023/05/10
2380
Linux修改主机名修改hostname的方法
Linux主机名即hostname,如何修改?可以临时修改主机名,但是Linux服务器重启后,主机名就失效了。还有一种方式可以永久修改主机名,Linux重启与否依然有效。两种方法都来说一说:
用户1685462
2021/08/27
27.1K1
Ubuntu修改主机名修改hostname的方法
Ubuntu主机名即hostname,如何修改?可以临时修改主机名,但是Linux服务器重启后,主机名就失效了。还有一种方式可以永久修改主机名,Linux重启与否依然有效。两种方法都来说一说:
用户8965210
2021/08/31
7.9K1
Nodejs课堂笔记—第一课:修改Webstorm的默认主题
    最近小半年一直在忙于研究Docker源码,也在写相关的分析文章。但受限于某些条件不能发布到网上,甚为郁闷。而最近几天,接到新的开发任务,需要使用nodejs。之前一直听说过nodejs,但从来没有真正使用过。     因此,在博客中就记录下学习过程,权当课堂笔记了。 OK,第一节课开始了。 正所谓:工欲善其事,必先利其器。因此在google上面搜索一番,发现nodejs开发人员都比较推崇Web-storm这个IDE。并且说这款IDE是"js 开发神器"。站在巨人们的肩膀上,可以少走不少弯路。因此我也
随机来个数
2018/04/16
7790
SAP BOM批量修改方法
BOM批量更改操作步骤分为:选择参考对象-定义选择标准-选择更改类型-定义更改数据-执行更改,查看日志。
用户5495712
2019/05/29
7.9K0
点击加载更多

相似问题

谷歌课堂API -用户ID可以修改吗?

130

谷歌课堂-入门

11

谷歌课堂API

22

谷歌课堂表单

11

谷歌课堂网站整合链接

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文