diff --git a/Sdk/.editorconfig b/Sdk/.editorconfig new file mode 100644 index 0000000000000000000000000000000000000000..3dda769e61d1eafe9b3af0f8de9ed22b3143e5fb --- /dev/null +++ b/Sdk/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 4 +end_of_line = lf +trim_trailing_whitespace = true + diff --git a/Sdk/Entity/BaseFileData.cs b/Sdk/Entity/BaseFileData.cs index 47f9b24a84e37d74f9b616d80b661e7b2c7c4855..9e591689e6881a8af9b8159db07da2c4681cc0bf 100644 --- a/Sdk/Entity/BaseFileData.cs +++ b/Sdk/Entity/BaseFileData.cs @@ -1,8 +1,20 @@ -namespace Signit.Sdk.Entity +namespace Signit.Sdk.Entity { public class BaseFileData { + /// + /// 文件数据 URL 地址 + /// public string Url { get; set; } + + /// + /// 采用 BASE64 编码的文件内容,支持最大约 10MB 文件数据 + /// public string Base64 { get; set; } + + /// + /// 文件名 + /// + public string Name { get; set; } } } diff --git a/Sdk/Entity/FileData.cs b/Sdk/Entity/FileData.cs index ea2c98a8b62f2eb3dec104f54dea7e79ab02b37b..b0814a3fc87701fd9590e6940a4f0f4cb5337a84 100644 --- a/Sdk/Entity/FileData.cs +++ b/Sdk/Entity/FileData.cs @@ -1,13 +1,31 @@ -namespace Signit.Sdk.Entity +using System; + +namespace Signit.Sdk.Entity { public class FileData { + /// + /// 待签名文件(html/pdf/doc/docx/xls/xlsx/ppt/pptx)的URL地址。 + /// 注意:如果 Url 和 Base64 同时存在,优先使用 Base64 + /// public string Url { get; set; } + + /// + /// 待签名文件(html/pdf/doc/docx/xls/xlsx/ppt/pptx)数据的 BASE64 编码, + /// 支持最大约 10MB 的文件数据。 + /// 注意:如果 Url 和 Base64 同时存在,优先使用 Base64 + /// public string Base64 { get; set; } + + /// + /// 待签名的文件是否转换成单页的形式,否则,默认使用A4尺寸自动进行分页。 + /// 注:待签名文件为html时该值有效,且此单页最大支持的高度为5000mm + /// public bool EnableSinglePage { get; set; } public FileData() { } + [Obsolete("将在 v1.2 中删除此构造,请使用对象初始化语法代替")] public FileData(string url) { Url = url; diff --git a/Sdk/Entity/InitialValue.cs b/Sdk/Entity/InitialValue.cs index e8bf1cc69ab33941f38508dd7728137b892b35d4..4a7bcb64d6cdaeccb66ae68d8b0b71646980d127 100644 --- a/Sdk/Entity/InitialValue.cs +++ b/Sdk/Entity/InitialValue.cs @@ -1,73 +1,80 @@ -using Signit.Sdk.Types; +using Signit.Sdk.Types; namespace Signit.Sdk.Entity { - /** - * 签名初始化数据。包含印章数据、手写数据、证书数据、证书签名证书秘钥访问口令、证书类型、 渲染模式、签名地理位置、联系方式、签名是否锁定、签名原因。 - * 印章数据、手写数据仅一个不为空的有效。 - */ + /// + /// 签名初始化数据。包含印章数据、手写数据、证书数据、证书签名证书秘钥访问口令、证书类型、 + /// 渲染模式、签名地理位置、联系方式、签名是否锁定、签名原因。 + /// 印章数据、手写数据仅一个不为空的有效。 + /// public class InitialValue { - /** - * 印章数据. - */ + /// + /// 印章数据. + /// public SealData SealData { get; set; } - /** - * 手写签名数据. - */ + /// + /// 手写签名数据. + /// public WriteData WriteData { get; set; } - /** - * 证书数据. - */ + /// + /// 证书数据. + /// public CertData CertData { get; set; } - /** - * 证书签名证书密钥访问口令. - */ + /// + /// 证书签名证书密钥访问口令. + /// public string CertPassin { get; set; } - /** - * 证书类型. - * 对应枚举:CertType - */ + /// + /// 证书类型. + /// 对应枚举:CertType + /// public CertType CertType { get; set; } - /** - * 渲染模式. 对应枚举: - * 对应枚举:RenderMode - */ + /// + /// 渲染模式. 对应枚举: + /// 对应枚举:RenderMode + /// public RenderMode RenderingMode { get; set; } = RenderMode.GRAPHIC; - /** - * 签名地理位置. - */ + /// + /// 签名地理位置. + /// public string Location { get; set; } - /** - * 联系方式. - */ + /// + /// 联系方式. + /// public string Contact { get; set; } - /** - * 签名是否锁定. - */ + /// + /// 签名是否锁定. + /// public bool Locked { get; set; } - /** - * 签名原因. - */ + /// + /// 签名原因. + /// public string Reason { get; set; } - /** - * 文本框文本内容 - */ + /// + /// 文本框文本内容 + /// public string TextContent { get; set; } - /** - * 二维码内容字符串. - */ + /// + /// 二维码内容字符串. + /// public string QrcodeContent { get; set; } + + /// + /// 时间表单的时间戳(单位:毫秒(ms)). + /// @since v1.1 + /// + public long Timestamp { get; set; } } -} \ No newline at end of file +} diff --git a/Sdk/Entity/KeywordPosition.cs b/Sdk/Entity/KeywordPosition.cs index d928c7af7e81dc5c9445d9b6d69a80af0df94c97..f338530c1d57480e30f531f59e64eac11b3faadf 100644 --- a/Sdk/Entity/KeywordPosition.cs +++ b/Sdk/Entity/KeywordPosition.cs @@ -1,4 +1,4 @@ -using Signit.Sdk.Types; +using Signit.Sdk.Types; namespace Signit.Sdk.Entity { @@ -15,6 +15,9 @@ namespace Signit.Sdk.Entity public float? Scale { get; set; } public string Pages { get; set; } + public string ReplaceTextAfterLocate { get; set; } + public bool DeleteTextAfterLocate { get; set; } + /// /// x 方向的便移量 正是往右,负是往左,坐标缩放前进行最后的微调参数 /// diff --git a/Sdk/Entity/Receiver.cs b/Sdk/Entity/Receiver.cs index 65fcbc520a0688a202bf3cae416d0279d01850f9..c311e8b22d2bc204c85af9d3d26e383710bededb 100644 --- a/Sdk/Entity/Receiver.cs +++ b/Sdk/Entity/Receiver.cs @@ -1,85 +1,130 @@ -using Signit.Sdk.Types; using System.Collections.Generic; +using Signit.Sdk.Types; namespace Signit.Sdk.Entity { - /** - * 接收方信息。 包含接收方名字、接收方联系方式、安全等级、接收方类型、 接收方是否必须预分配表单域、设置接收方私人信息、接收方处理顺序、 - * 签署认证等级、接收方所在企业名称、信封自定义元数据信息、预设表单信息. - */ + /// + /// 接收方信息。 包含接收方名字、接收方联系方式、安全等级、接收方类型、 + /// 接收方是否必须预分配表单域、设置接收方私人信息、接收方处理顺序、 + /// 签署认证等级、接收方所在企业名称、信封自定义元数据信息、预设表单信息. + /// public class Receiver { - /** - * 接收方名字. - */ + /// + /// 接收方名字. + /// public string Name { get; set; } - /** - * 接收方联系方式. - */ + + /// + /// 接收方联系方式. + /// public Contact Contact { get; set; } - /** - * 安全等级. - *

- * 对应枚举:SecureLevel - * - */ + + /// + /// 安全等级. + ///

+ /// 对应枚举:SecureLevel + /// + ///
public SecureLevel SecureLevel { get; set; } - /** - * 接收方类型。 接收方类型:ReceiverType - * - */ + + /// + /// 接收方类型。 接收方类型:ReceiverType + /// + /// public ReceiverType Type { get; set; } - /** - * 接收方是否必须预分配表单域. - */ + + /// + /// 接收方是否必须预分配表单域. + /// public bool NeedForm { get; set; } - /** - * 设置接收方私人信息. - */ + + /// + /// 设置接收方私人信息. + /// public string AssignedMessage { get; set; } - /** - * 接收方处理顺序. - */ + + /// + /// 接收方处理顺序. + /// public int AssignedSequence { get; set; } - /** - * 接收方所在企业名称. - */ + /// + /// 接收方所在企业名称. + /// public string EnterpriseName { get; set; } - /** - * 信封自定义元数据信息. - */ + + /// + /// 信封自定义元数据信息. + /// public string Metadata { get; set; } - /** - * 预设表单信息. - */ + + /// + /// 预设表单信息. + /// public IList PresetForms { get; set; } public EnvelopeRoleType RoleType { get; set; } - /** - * 流程完成后删除当前参与者的信封。 默认:false - * - */ + /// + /// 流程完成后删除当前参与者的信封。 默认:false + /// public bool DeleteCompletedEnvelope { get; set; } - /** - * 参与者处理表单各种模式的枚举 - */ + + /// + /// 参与者处理表单各种模式的枚举 + /// public ParticipantHandleMode HandleMode { get; set; } public IList SelectedAuthTypes { get; set; } - /** - * 启用嵌入模式,调用方系统中直接嵌入易企签WEB流程时设置为true,签署流程消息只会通过webhook事件消息方式通知,用户在易企签平台设置的短信/邮件等消息将自动屏蔽。非必填,默认值:false. - * @since 2.1.0 - */ + /// + /// 启用嵌入模式,调用方系统中直接嵌入易企签WEB流程时设置为true, + /// 签署流程消息只会通过webhook事件消息方式通知,用户在易企签平台设置的短信/邮件等消息将自动屏蔽。 + /// 非必填,默认值:false. + /// public bool EnableEmbeddedMode { get; set; } - /** - * 签署接收方用户在调用方系统的唯一标识.
- * enableEmbeddedMode为false时,非必填;当enableEmbeddedMode为true时,则必填。默认:null - * @since 2.1.0 - */ + /// + /// 签署接收方用户在调用方系统的唯一标识. + /// enableEmbeddedMode为false时,非必填;当enableEmbeddedMode为true时,则必填。默认:null + /// public string ClientId { get; set; } + + /// + /// 参与者唯一标识. + /// @since v1.1 + /// + public string ParticipantWsid { get; set; } + + /// + /// 是否是外部. + /// @since v1.1 + /// + public bool IsExternal { get; set; } + + /// + /// 是否是委托外部. + /// @since v1.1 + /// + public bool IsEntrust { get; set; } + + /// + /// 是否允许撤销. + /// @since v1.1 + /// + public bool AllowRevoke { get; set; } + + /// + /// 是否区分顺序. + /// @since v1.1 + /// + public bool SequenceSensitive { get; set; } + + /// + /// 用户ID. + /// @since v1.1 + /// + public string UserWsid { get; set; } } } diff --git a/Sdk/HISTORY.md b/Sdk/HISTORY.md new file mode 100644 index 0000000000000000000000000000000000000000..7f0a1ce2b2fe8e1bb20e4db32fee5967923ae77b --- /dev/null +++ b/Sdk/HISTORY.md @@ -0,0 +1,18 @@ +# 升级历史简要记录 + +> Ref Repository (Java) +> +> - https://github.com/signit-wesign/java-sdk.git +> - https://github.com/signit-wesign/java-sdk-sample + +## v1.0.1 2020-06-05 + +> *Ref: [java-sdk]: `575a3bc7fcb5e2b817ea1a9fe1e1899d30fe89d2`* + +### 已知问题 + +- 没有 `cn.signit.sdk.type.WebhookEventType` + +## v1.0.0 2019-05-26 + +> *Ref: java-sdk: `c06f5d4156657198d61f8ba7f4816cdf848fa8d6`* \ No newline at end of file diff --git a/Sdk/Http/Enterprise/EnterpriseVerifyRequest.cs b/Sdk/Http/Enterprise/EnterpriseVerifyRequest.cs index 0745b3e7e3be9a690f5a6244162b0566638fce8c..915eb7fb9bf45a48fdd79c382d5cc0446a2b57f7 100644 --- a/Sdk/Http/Enterprise/EnterpriseVerifyRequest.cs +++ b/Sdk/Http/Enterprise/EnterpriseVerifyRequest.cs @@ -1,6 +1,6 @@ -using Signit.Sdk.Entity; -using Signit.Sdk.Types; using System.Collections.Generic; +using Signit.Sdk.Entity; +using Signit.Sdk.Types; namespace Signit.Sdk.Http.Enterprise { @@ -54,6 +54,12 @@ namespace Signit.Sdk.Http.Enterprise /// public EnterpriseAuthType AuthType { get; set; } + /// + /// 设置经办人或者法人的个人实名认证方式,默认为:PHONE_AUTH + /// @since v1.1 + /// + public List AuthModes { get; set; } + /// /// 企业对公银行信息. /// @@ -63,5 +69,13 @@ namespace Signit.Sdk.Http.Enterprise /// 额外认证所需照片信息数组. /// public IList ExtraAuthImages { get; set; } + + /// + /// 启用嵌入模式,调用方系统中直接嵌入易企签WEB流程时设置为true, + /// 签署流程消息只会通过webhook事件消息方式通知,用户在易企签平台设置的短信/邮件等消息将自动屏蔽。 + /// 非必填,默认值:false. + /// @since v1.1 + /// + public bool? EnableEmbeddedMode { get; set; } } -} \ No newline at end of file +} diff --git a/Sdk/Http/Envelope/EnvelopeBasicInfo.cs b/Sdk/Http/Envelope/EnvelopeBasicInfo.cs index 4ee4af034ba141bc9d83ed7ee0e89361f47f6497..c685ac051825d0702a5bd5aed92ca6a167b2b004 100644 --- a/Sdk/Http/Envelope/EnvelopeBasicInfo.cs +++ b/Sdk/Http/Envelope/EnvelopeBasicInfo.cs @@ -1,37 +1,55 @@ -using Signit.Sdk.Types; +using Signit.Sdk.Types; namespace Signit.Sdk.Http.Envelope { - /** - * 信封基本信息. 包含信封标题、信封主题、信封类型、信封认证等级、自定义元数据信息. - */ + /// + /// 信封基本信息. 包含信封标题、信封主题、信封类型、信封认证等级、自定义元数据信息. + /// public class EnvelopeBasicInfo { - /** - * 信封标题. - */ + /// + /// 信封标题. + /// public string Title { get; set; } - /** - * 信封主题. - */ + /// + /// 信封主题. + /// public string Subject { get; set; } - /** - * 信封类型. - * 对应枚举:EnvelopeType - */ + /// + /// 信封类型. + /// 对应枚举:EnvelopeType + /// public EnvelopeType Type { get; set; } - /** - * 信封认证等级. - * 对应枚举:AuthLevel - */ + /// + /// 信封认证等级. + /// 对应枚举:AuthLevel + /// public AuthLevel AuthLevel { get; set; } - /** - * 自定义元数据信息. - */ + /// + /// 自定义元数据信息. + /// public string Metadata { get; set; } + + /// + /// 时间单位:天;如果 `当前时间 > 信封发起时间 + 逾期时间` 后,信封将不可签署 + /// @since v1.1 + /// + public int? Expire { get; set; } + + /// + /// 信封ID. + /// @since v1.1 + /// + public string EnvelopeWsid { get; set; } + + /// + /// 模式. + /// @since v1.1 + /// + public string Mode { get; set; } } -} \ No newline at end of file +} diff --git a/Sdk/Http/HttpClientSync.Response.cs b/Sdk/Http/HttpClientSync.Response.cs index 546d403f914242dadc5578b38fc6fec565f26d34..9ed173d3ed344daf0c8fe07fb24e273e36fbefd3 100644 --- a/Sdk/Http/HttpClientSync.Response.cs +++ b/Sdk/Http/HttpClientSync.Response.cs @@ -1,5 +1,6 @@ -using Newtonsoft.Json; using System.Net; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; namespace Signit.Sdk.Http { @@ -15,7 +16,33 @@ namespace Signit.Sdk.Http { return string.IsNullOrWhiteSpace(Content) ? default(T) - : JsonConvert.DeserializeObject(Content); + : FromJson(Content); + } + + private T FromJson(string json) + { + try + { + var jo = JsonConvert.DeserializeObject(json) as JObject; + + if (jo.ContainsKey("error")) + { + throw new SignitException(jo + .GetValue("error") + .Value()); + } + + if (jo.ContainsKey("errorWsid")) + { + throw new SignitException(json); + } + + return jo.ToObject(); + } + catch (JsonSerializationException jse) + { + throw new SignitException(jse); + } } } } diff --git a/Sdk/Http/JsonContent.cs b/Sdk/Http/JsonContent.cs index 28253da1e377ee0e543eb3a7c64ed01f223d3a72..ddb15d6090e382d8a4dc9fd897e718adae458208 100644 --- a/Sdk/Http/JsonContent.cs +++ b/Sdk/Http/JsonContent.cs @@ -1,8 +1,6 @@ -using Newtonsoft.Json; -using Newtonsoft.Json.Converters; -using Newtonsoft.Json.Serialization; -using System.Net.Http; +using System.Net.Http; using System.Text; +using Signit.Sdk.Util; namespace Signit.Sdk.Http { @@ -10,22 +8,6 @@ namespace Signit.Sdk.Http { public JsonContent(object model) : base(ToJson(model), Encoding.UTF8, "application/json") { } - private static readonly JsonSerializerSettings defaultJsonSettings = CreateDefaultJsonSettings(); - - private static JsonSerializerSettings CreateDefaultJsonSettings() - { - var settings = new JsonSerializerSettings - { - ContractResolver = new CamelCasePropertyNamesContractResolver(), - }; - - settings.Converters.Add(new StringEnumConverter()); - return settings; - } - - private static string ToJson(object model, JsonSerializerSettings settings = null) - { - return JsonConvert.SerializeObject(model, settings ?? defaultJsonSettings); - } + private static string ToJson(object model) => model.ToJson(); } } diff --git a/Sdk/Http/Webhook/EnvelopeStarted.cs b/Sdk/Http/Webhook/EnvelopeStarted.cs index 532a2812c03517e05d11d7a6088f1dea6d70b26d..5d8215bc0a3dddb1ffcc694221634d5e84c95b49 100644 --- a/Sdk/Http/Webhook/EnvelopeStarted.cs +++ b/Sdk/Http/Webhook/EnvelopeStarted.cs @@ -1,28 +1,40 @@ -using System.Collections.Generic; +using System.Collections.Generic; namespace Signit.Sdk.Http.Webhook { public class EnvelopeStarted : AbstractWebhookResponse { - // 执行的动作对应的URL地址 + /// + /// 执行的动作对应的URL地址 + /// public string ActionUrl { get; set; } - // 流程允许在易企签WEB执行的动作 + /// + /// 流程允许在易企签WEB执行的动作 + /// public IList Actions { get; set; } - // 接收方对应的在易企签的帐号 + /// + /// 接收方对应的在易企签的帐号 + /// public string Account { get; set; } - // 信封基本信息 + /// + /// 信封基本信息 + /// public RawDataBasicInfo BasicEnvelope { get; set; } public Sender SenderParticipant { get; set; } public Receiver ReceiverParticipant { get; set; } - // 已完成的签署数据 + /// + /// 已完成的签署数据 + /// public SignData SignData { get; set; } - // 客户端回调地址 + /// + /// 客户端回调地址 + /// public string ReturnUrl { get; set; } } } diff --git a/Sdk/Http/Webhook/RawDataBasicInfo.cs b/Sdk/Http/Webhook/RawDataBasicInfo.cs index a68643cba4a596db80773fce36e1fdac7e3b268d..6df9d8bc4d8d8204c958d0a4487f42465c73aace 100644 --- a/Sdk/Http/Webhook/RawDataBasicInfo.cs +++ b/Sdk/Http/Webhook/RawDataBasicInfo.cs @@ -1,31 +1,68 @@ -namespace Signit.Sdk.Http.Webhook +namespace Signit.Sdk.Http.Webhook { - /** - * 信封基本信息. - * - * @since 2.0.0 - */ + /// + /// 信封基本信息. + /// public class RawDataBasicInfo { - // 信封全局唯一ID + /// + /// 信封全局唯一ID + /// public string Wsid { get; set; } - // 信封状态 + /// + /// 信封发起者ID + /// + public string SenderWsid { get; set; } + + /// + /// 信封发起者名字 + /// + public string SenderName { get; set; } + + /// + /// 信封状态 + /// public string Status { get; set; } - // 信封创建时间 + /// + /// 信封类型 + /// + public string Type { get; set; } + + /// + /// 信封标题 + /// + public string Title { get; set; } + + /// + /// 信封主题 + /// + public string Subject { get; set; } + + /// + /// 信封创建时间 + /// public long? CreatedDatetime { get; set; } - // 信封过期时间 + /// + /// 信封过期时间 + /// public long? ExpireDatetime { get; set; } - // 信封最新状态时间 + /// + /// 信封最新状态时间 + /// public long? StatusDatetime { get; set; } - // 信封最新状态原因 + /// + /// 信封最新状态原因 + /// public string StatusReason { get; set; } - // 当前签署方的序号 + /// + /// 当前签署方的序号 + /// public int? CurrentSequence { get; set; } } } diff --git a/Sdk/Http/Webhook/WebhookDataBase.cs b/Sdk/Http/Webhook/WebhookDataBase.cs index e93638470b4ea179a77bab4897cf50812e9711b9..ab05580c931e3cc6b82f7c30a91cf37a78453bed 100644 --- a/Sdk/Http/Webhook/WebhookDataBase.cs +++ b/Sdk/Http/Webhook/WebhookDataBase.cs @@ -1,11 +1,11 @@ -namespace Signit.Sdk.Http.Webhook +namespace Signit.Sdk.Http.Webhook { public class WebhookDataBase { public string Event { get; set; } public SourceType Source { get; set; } public TargetType Target { get; set; } - public bool NeedCallback { get; set; } + public bool? NeedCallBack { get; set; } public class SourceType { diff --git a/Sdk/Properties/AssemblyInfo.cs b/Sdk/Properties/AssemblyInfo.cs index 4a7bf64a80a2b6547324dd884f996f731a74fd03..7418c03dba3deee724b0d53f5e0128bed2a7d8f5 100644 --- a/Sdk/Properties/AssemblyInfo.cs +++ b/Sdk/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -using System.Reflection; +using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -10,7 +10,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("SignIt")] [assembly: AssemblyProduct("Sdk")] -[assembly: AssemblyCopyright("Copyright © SignIt 2019")] +[assembly: AssemblyCopyright("Copyright © SignIt 2020")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 //通过使用 "*",如下所示: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("1.1.1.0")] +[assembly: AssemblyFileVersion("1.1.1.0")] diff --git a/Sdk/Sdk.csproj b/Sdk/Sdk.csproj index 6417192fe6cf1661bde441a8c4ec538606e10ebe..269d1c767ba9dc2e3877c702927abce8601eec86 100644 --- a/Sdk/Sdk.csproj +++ b/Sdk/Sdk.csproj @@ -153,7 +153,6 @@ - @@ -161,13 +160,16 @@ + + + diff --git a/Sdk/SignitClient.cs b/Sdk/SignitClient.cs index 02e1cf20d59c066093596279f807b47a20972fc4..a9690fc4bfa68c45cf74f8886b0ed282e7914679 100644 --- a/Sdk/SignitClient.cs +++ b/Sdk/SignitClient.cs @@ -1,16 +1,47 @@ -using Newtonsoft.Json; +/** + * The MIT License (MIT) + * + * Copyright (C) 2018 signit.cn + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +using System.Collections.Specialized; +using System.Threading; +using Newtonsoft.Json; using Signit.Sdk.Http; using Signit.Sdk.Http.Webhook; using Signit.Sdk.Types; using Signit.Sdk.Util; -using System.Collections.Specialized; -using System.Diagnostics; using Viyi.Util; namespace Signit.Sdk { + // TODO 还没有添加重试机制 + + /// + /// 易企签快捷签署 Java SDK的基本操作类. + /// public class SignitClient { + private const int MAX_COUNT = 3; + public static WebhookData ParseWebhookData(string raw) { return JsonConvert.DeserializeObject(raw); @@ -25,14 +56,25 @@ namespace Signit.Sdk private readonly ApiOptions options; //private HttpClientWrapper httpClient; - //private readonly int MAX_COUNT = 3; //private readonly AtomicInteger count = new AtomicInteger(MAX_COUNT); //private const Pattern LEFT_QUOTATION = Pattern.compile("\"\\{"); //private const Pattern RIGHT_QUOTATION = Pattern.compile("\\}\""); //private const Pattern BACKLASH_QUOTATION = Pattern.compile("\\\\\""); - public string BaseUrl { get; set; } - public string OAuthTokenUrl { get; set; } + private ThreadLocal baseUrl = new ThreadLocal(); + private ThreadLocal oAuthTokenUrl = new ThreadLocal(); + + public string BaseUrl + { + get => baseUrl.Value; + set => baseUrl.Value = value; + } + + public string OAuthTokenUrl + { + get => oAuthTokenUrl.Value; + set => oAuthTokenUrl.Value = value; + } public SignitClient(ApiOptions options = null) : this(null, null, options) { } @@ -144,7 +186,7 @@ namespace Signit.Sdk .Post(BaseUrl, request, headers); var result = response.GetObject(); - if (!result.IsSuccess) + if (result?.IsSuccess != true) { result.Error = response.GetObject(); } diff --git a/Sdk/Types/FormType.cs b/Sdk/Types/FormType.cs index 074c598daae92fa9bdff12af3388eb39b02af179..bfdf00c8eec1322ca11f598ca6dfe88ff9f4ea32 100644 --- a/Sdk/Types/FormType.cs +++ b/Sdk/Types/FormType.cs @@ -1,33 +1,30 @@ namespace Signit.Sdk.Types { - /** - * - * 表单类型枚举. - * - * @since 2.0.0 - */ + /// + /// 表单类型枚举. + /// @since v1.0 + /// public enum FormType { - - /** - * 印章签名表单域 - */ + /// 印章签名表单域 SEAL_SIGN, - /** - * 手写签名表单域 - */ + + /// 手写签名表单域 WRITE_SIGN, - /** - * 文本表单域 - */ + + /// 文本表单域 TEXT, - /** - * 骑缝章表单域 - */ + + /// 骑缝章表单域 MULTI_CHECK_MARK, - /** - * 二维码骑缝章表单域 - */ - MULTI_QRCODE_MARK + + /// 二维码骑缝章表单域 + MULTI_QRCODE_MARK, + + /// + /// 时间戳表单 + /// @since v1.1 + /// + DATE, } -} \ No newline at end of file +} diff --git a/Sdk/Types/IdCardType.cs b/Sdk/Types/IdCardType.cs index ae9990fdd4994d027b136488ca9b4e8b67d89716..a81690eddd71251c8490eb7f47563b67ceefa5f9 100644 --- a/Sdk/Types/IdCardType.cs +++ b/Sdk/Types/IdCardType.cs @@ -1,25 +1,36 @@ namespace Signit.Sdk.Types { - /** - * - * 身份证类型枚举. - * - * @since 1.0.2 - */ + /// + /// 身份证类型枚举 + /// @since 1.0 + /// public enum IdCardType { - /** - * 二代身份证 - */ + /// 二代身份证 SECOND_GENERATION_IDCARD, - /** - * 临时身份证 - */ + + /// 临时身份证 TEMPORARY_IDCARD, - /** - * 护照 - */ - PASSPORT + /// 护照 + PASSPORT, + + /// + /// 香港身份证 + /// @since v1.1 + /// + HONG_KONG_IDCARD, + + /// + /// 澳门身份证 + /// @since v1.1 + /// + MA_CAO_IDCARD, + + /// + /// 台湾身份证 + /// @since v1.1 + /// + TAI_WAN_IDCARD, } -} \ No newline at end of file +} diff --git a/Sdk/Types/NamingStyle.cs b/Sdk/Types/NamingStyle.cs deleted file mode 100644 index 23138ce82f493108676e00b1201be8c26fd74182..0000000000000000000000000000000000000000 --- a/Sdk/Types/NamingStyle.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace Signit.Sdk.Types -{ - /** - * 命名风格的枚举. - * - * @author zhd - * @since 1.0.0 - */ - public enum NamingStyle - { - /** - * 小驼峰命名风格.如:nameStyle - */ - CAMEL, - - /** - * 字母间均大写命名风格.如:NameStyle - */ - PASCAL, - - /** - * 字母间均以下划线分隔命名风格(unix命名风格).如:name_style - */ - SNAKE, - - /** - * 字母间均以连词符分隔命名风格.如:name-style - */ - KEBAB - } -} diff --git a/Sdk/Types/ParticipantHandleMode.cs b/Sdk/Types/ParticipantHandleMode.cs index b73840cc6464a21b84902dfba6f32cfe385f7f03..ce36477d5f1bf81b67b98fa68265c50efc21762b 100644 --- a/Sdk/Types/ParticipantHandleMode.cs +++ b/Sdk/Types/ParticipantHandleMode.cs @@ -1,25 +1,22 @@ namespace Signit.Sdk.Types { - /** - * 参与者处理表单的模式枚举 - * - * @since 2.0.0 - */ + /// + /// 参与者处理表单的模式枚举 + /// public enum ParticipantHandleMode { - /** - * 正常处理模式(默认). - * - * @since 2.0.0 - */ + /// + /// 正常处理模式(默认). + /// NORMAL, - /** - * 静默处理模式. - * 该接受方不用执行签署流程,自动完成签署。接收方设置为静默签署条件:①接收方类型为签署者SIGNER;②接收方和发起方为同一企业下的同一人;③该接收方有预设表单,且该接收方的预设表单均设置了初始值(手写签名表单除外)。 - * - * @since 2.0.0 - */ - SILENCE + /// + /// 静默处理模式。 + /// 该接受方不用执行签署流程,自动完成签署。接收方设置为静默签署条件: + /// - ① 接收方类型为签署者SIGNER; + /// - ② 接收方和发起方为同一企业下的同一人; + /// - ③ 该接收方有预设表单,且该接收方的预设表单均设置了初始值(手写签名表单除外)。 + /// + SILENCE, } } \ No newline at end of file diff --git a/Sdk/Types/PersonAuthType.cs b/Sdk/Types/PersonAuthType.cs index aa78860ee100b996bc5a954a74214b5ade1e6469..75eb2aae2565c84d3e56e07565703b03d920718e 100644 --- a/Sdk/Types/PersonAuthType.cs +++ b/Sdk/Types/PersonAuthType.cs @@ -1,16 +1,30 @@ namespace Signit.Sdk.Types { - /** - * 个人实名认证方式 - * - * @since 2.1.0 - */ + /// + /// 个人实名认证方式 + /// @since v1.0 + /// public enum PersonAuthType { - /** - * 三网手机号三元素实名认证方式 - */ - PHONE_AUTH + /// 三网手机号三元素实名认证方式 + PHONE_AUTH, + /// + /// 人脸识别认证方式 + /// @since v1.1 + /// + FACE_AUTH, + + /// + /// 支付宝芝麻认证方式 + /// @since v1.1 + /// + ZM_AUTH, + + /// + /// 三网手机号三元素实名认证+人脸识别认证,双重认证方式 + /// @since v1.1 + /// + PHONE_FACE_AUTH, } } \ No newline at end of file diff --git a/Sdk/Util/Json.cs b/Sdk/Util/Json.cs new file mode 100644 index 0000000000000000000000000000000000000000..a629208a63eeb02b322897cd727c64ac222b1a9a --- /dev/null +++ b/Sdk/Util/Json.cs @@ -0,0 +1,48 @@ +using System; +using System.IO; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; + +namespace Signit.Sdk.Util +{ + public static class Json + { + private static readonly JsonSerializerSettings defaultJsonSettings = CreateDefaultJsonSettings(); + + private static JsonSerializerSettings CreateDefaultJsonSettings() + { + var settings = new JsonSerializerSettings + { + ContractResolver = new CamelCasePropertyNamesContractResolver(), + }; + + settings.Converters.Add(new StringEnumConverter()); + return settings; + } + + public static string ToJson(this object model, JsonSerializerSettings settings = null) + { + return JsonConvert.SerializeObject(model, settings ?? defaultJsonSettings); + } + + public static string ToJson(this object model, Action configure) + { + if (configure == null) { return ToJson(model); } + var settings = CreateDefaultJsonSettings(); + configure(settings); + return ToJson(model, settings); + } + + public static T FromFile(string filePath) + { + using (var reader = new StreamReader(filePath)) + using (var jsonReader = new JsonTextReader(reader)) + { + var jo = JToken.ReadFrom(jsonReader) as JObject; + return jo.ToObject(); + } + } + } +}