基于法大大开放平台 V3 API 实现,双轮 HMAC-SHA256 签名 + Token 自动管理。
包信息
- NuGet 包:
Bitzsoft.Integrations.ElectronicSignature.Fadada - 接口:
IElectronicSignatureProvider - 鉴权:HMAC-SHA256 签名 + OAuth Token(自动获取与刷新)
- Provider ID:
Fadada
配置
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
AppId | string | 是 | — | 应用标识 |
AppKey | string | 是 | — | 应用密钥(参与 HMAC-SHA256 签名,不传输) |
BaseUrl | string | 否 | https://openapi.fadada.com/api/v3/ | API 基地址(沙箱 https://uat-openapi.fadada.com/api/v3/) |
Timeout | TimeSpan | 否 | 00:00:30 | HTTP 请求超时(文件上传/下载可调大) |
HttpClientName | string | 否 | FadadaElectronicSignatureProvider | 命名 HttpClient 标识 |
{ "Fadada": { "AppId": "your-app-id", "AppKey": "your-app-key", "BaseUrl": "https://openapi.fadada.com/api/v3/", "Timeout": "00:00:30" }}注册
using Bitzsoft.Integrations.ElectronicSignature.Fadada;
// 方式一:IConfiguration(默认读取 "Fadada" 配置节)services.AddBitzsoftFadadaElectronicSignature(configuration);
// 方式二:委托配置services.AddBitzsoftFadadaElectronicSignature(options =>{ options.AppId = "your-app-id"; options.AppKey = "your-app-key"; options.BaseUrl = "https://openapi.fadada.com/api/v3/";});使用示例
// 注入 IElectronicSignatureProvider,ProviderName == "Fadada"var createResult = await provider.CreateContractAsync(new SimpleContractRequest{ Title = "采购合同", FileName = "contract.pdf", FileData = await File.ReadAllBytesAsync("contract.pdf"), SignerName = "张三", SignerPhone = "13800000000"});
var contractId = createResult.Data!;
// 查询详情、获取签署页面、下载合同var detail = await provider.GetContractDetailAsync(contractId);var signUrl = await provider.GetSigningUrlAsync(contractId, "signer-id");var bytes = await provider.DownloadContractAsync(contractId);鉴权机制
- 首次请求自动获取 Token,内存缓存并在过期前 5 分钟自动刷新。
SemaphoreSlim保证并发安全(双重检查锁模式)。- 回调验签:校验
X-Fadada-Timestamp时间戳新鲜度(5 分钟)与X-Fadada-Signature,使用固定时间比较防止时序攻击。
已知限制
统一接口仅覆盖极简场景(单文件、单签署方)。复杂签署任务、账号、组织、模板、印章等通过 FadadaElectronicSignatureProvider 的 partial class 扩展方法调用。