Files
tyapi-server/internal/shared/esign/client.go

270 lines
8.5 KiB
Go
Raw Normal View History

2025-07-20 20:53:26 +08:00
package esign
import (
"fmt"
)
// Client e签宝客户端
// 提供统一的e签宝服务接口整合所有功能模块
type Client struct {
config *Config // 配置信息
httpClient *HTTPClient // HTTP客户端
template *TemplateService // 模板服务
signFlow *SignFlowService // 签署流程服务
orgAuth *OrgAuthService // 机构认证服务
fileOps *FileOpsService // 文件操作服务
}
// NewClient 创建e签宝客户端
// 使用配置信息初始化客户端及所有服务模块
//
// 参数:
// - config: e签宝配置信息
//
// 返回: 客户端实例
func NewClient(config *Config) *Client {
httpClient := NewHTTPClient(config)
client := &Client{
config: config,
httpClient: httpClient,
}
// 初始化各个服务模块
client.template = NewTemplateService(httpClient, config)
client.signFlow = NewSignFlowService(httpClient, config)
client.orgAuth = NewOrgAuthService(httpClient, config)
client.fileOps = NewFileOpsService(httpClient, config)
return client
}
// GetConfig 获取当前配置
func (c *Client) GetConfig() *Config {
return c.config
}
// UpdateConfig 更新配置
func (c *Client) UpdateConfig(config *Config) {
c.config = config
c.httpClient.UpdateConfig(config)
// 更新各服务模块的配置
c.template.UpdateConfig(config)
c.signFlow.UpdateConfig(config)
c.orgAuth.UpdateConfig(config)
c.fileOps.UpdateConfig(config)
}
// ==================== 模板操作 ====================
// FillTemplate 填写模板
// 使用自定义数据填写模板生成文件
func (c *Client) FillTemplate(components map[string]string) (*FillTemplate, error) {
return c.template.FillWithCustomData(components)
}
// FillTemplateWithDefaults 使用默认数据填写模板
func (c *Client) FillTemplateWithDefaults(partyA, legalRepA, partyB, legalRepB string) (*FillTemplate, error) {
return c.template.FillWithDefaults(partyA, legalRepA, partyB, legalRepB)
}
// ==================== 签署流程 ====================
// CreateSignFlow 创建签署流程
func (c *Client) CreateSignFlow(req *CreateSignFlowRequest) (string, error) {
return c.signFlow.Create(req)
}
// GetSignURL 获取签署链接
func (c *Client) GetSignURL(signFlowID, psnAccount, orgName string) (string, string, error) {
return c.signFlow.GetSignURL(signFlowID, psnAccount, orgName)
}
// QuerySignFlowDetail 查询签署流程详情
func (c *Client) QuerySignFlowDetail(signFlowID string) (*QuerySignFlowDetailResponse, error) {
return c.fileOps.QuerySignFlowDetail(signFlowID)
}
// IsSignFlowCompleted 检查签署流程是否完成
func (c *Client) IsSignFlowCompleted(signFlowID string) (bool, error) {
result, err := c.QuerySignFlowDetail(signFlowID)
if err != nil {
return false, err
}
// 状态码2表示已完成
return result.Data.SignFlowStatus == 2, nil
}
// ==================== 机构认证 ====================
// GetOrgAuthURL 获取机构认证链接
func (c *Client) GetOrgAuthURL(req *OrgAuthRequest) (string, string, string, error) {
return c.orgAuth.GetAuthURL(req)
}
// ValidateOrgAuthInfo 验证机构认证信息
func (c *Client) ValidateOrgAuthInfo(req *OrgAuthRequest) error {
return c.orgAuth.ValidateAuthInfo(req)
}
// ==================== 文件操作 ====================
// DownloadSignedFile 下载已签署文件
func (c *Client) DownloadSignedFile(signFlowID string) (*DownloadSignedFileResponse, error) {
return c.fileOps.DownloadSignedFile(signFlowID)
}
// GetSignFlowStatus 获取签署流程状态
func (c *Client) GetSignFlowStatus(signFlowID string) (string, error) {
detail, err := c.QuerySignFlowDetail(signFlowID)
if err != nil {
return "", err
}
return GetSignFlowStatusText(detail.Data.SignFlowStatus), nil
}
// ==================== 业务集成接口 ====================
// ContractSigningRequest 合同签署请求
type ContractSigningRequest struct {
// 企业信息
CompanyName string `json:"companyName"` // 企业名称
UnifiedSocialCode string `json:"unifiedSocialCode"` // 统一社会信用代码
LegalPersonName string `json:"legalPersonName"` // 法人姓名
LegalPersonID string `json:"legalPersonId"` // 法人身份证号
LegalPersonPhone string `json:"legalPersonPhone"` // 法人手机号
// 经办人信息(可选,如果与法人不同)
TransactorName string `json:"transactorName,omitempty"` // 经办人姓名
TransactorPhone string `json:"transactorPhone,omitempty"` // 经办人手机号
TransactorID string `json:"transactorId,omitempty"` // 经办人身份证号
// 模板数据(可选)
CustomData map[string]string `json:"customData,omitempty"` // 自定义模板数据
}
// ContractSigningResult 合同签署结果
type ContractSigningResult struct {
FileID string `json:"fileId"` // 文件ID
SignFlowID string `json:"signFlowId"` // 签署流程ID
SignURL string `json:"signUrl"` // 签署链接
ShortURL string `json:"shortUrl"` // 短链接
}
// GenerateContractSigning 生成合同签署
// 一站式合同签署服务:填写模板 -> 创建签署流程 -> 获取签署链接
func (c *Client) GenerateContractSigning(req *ContractSigningRequest) (*ContractSigningResult, error) {
// 1. 准备模板数据
var err error
var fillTemplate *FillTemplate
if len(req.CustomData) > 0 {
// 使用自定义数据
fillTemplate, err = c.FillTemplate(req.CustomData)
} else {
// 使用默认数据
fillTemplate, err = c.FillTemplateWithDefaults(
"海南省学宇思网络科技有限公司",
"刘福思",
req.CompanyName,
req.LegalPersonName,
)
}
if err != nil {
return nil, fmt.Errorf("填写模板失败: %w", err)
}
// 2. 确定签署人信息
signerName := req.LegalPersonName
transactorName := req.LegalPersonName
transactorPhone := req.LegalPersonPhone
transactorID := req.LegalPersonID
if req.TransactorName != "" {
signerName = req.TransactorName
transactorName = req.TransactorName
transactorPhone = req.TransactorPhone
transactorID = req.TransactorID
}
// 3. 创建签署流程
signFlowReq := &CreateSignFlowRequest{
FileID: fillTemplate.FileID,
SignerAccount: req.UnifiedSocialCode,
SignerName: signerName,
TransactorPhone: transactorPhone,
TransactorName: transactorName,
TransactorIDCardNum: transactorID,
}
signFlowID, err := c.CreateSignFlow(signFlowReq)
if err != nil {
return nil, fmt.Errorf("创建签署流程失败: %w", err)
}
// 4. 获取签署链接
signURL, shortURL, err := c.GetSignURL(signFlowID, transactorPhone, signerName)
if err != nil {
return nil, fmt.Errorf("获取签署链接失败: %w", err)
}
return &ContractSigningResult{
FileID: fillTemplate.FileID,
SignFlowID: signFlowID,
SignURL: signURL,
ShortURL: shortURL,
}, nil
}
// EnterpriseAuthRequest 企业认证请求
type EnterpriseAuthRequest struct {
// 企业信息
CompanyName string `json:"companyName"` // 企业名称
UnifiedSocialCode string `json:"unifiedSocialCode"` // 统一社会信用代码
LegalPersonName string `json:"legalPersonName"` // 法人姓名
LegalPersonID string `json:"legalPersonId"` // 法人身份证号
// 经办人信息
TransactorName string `json:"transactorName"` // 经办人姓名
TransactorMobile string `json:"transactorMobile"` // 经办人手机号
TransactorID string `json:"transactorId"` // 经办人身份证号
}
// EnterpriseAuthResult 企业认证结果
type EnterpriseAuthResult struct {
AuthFlowID string `json:"authFlowId"` // 认证流程ID
AuthURL string `json:"authUrl"` // 认证链接
AuthShortURL string `json:"authShortUrl"` // 短链接
}
// GenerateEnterpriseAuth 生成企业认证
// 一站式企业认证服务
func (c *Client) GenerateEnterpriseAuth(req *EnterpriseAuthRequest) (*EnterpriseAuthResult, error) {
authReq := &OrgAuthRequest{
OrgName: req.CompanyName,
OrgIDCardNum: req.UnifiedSocialCode,
LegalRepName: req.LegalPersonName,
LegalRepIDCardNum: req.LegalPersonID,
TransactorName: req.TransactorName,
TransactorIDCardNum: req.TransactorID,
TransactorMobile: req.TransactorMobile,
}
// 验证信息
if err := c.ValidateOrgAuthInfo(authReq); err != nil {
return nil, fmt.Errorf("认证信息验证失败: %w", err)
}
// 获取认证链接
authFlowID, authURL, shortURL, err := c.GetOrgAuthURL(authReq)
if err != nil {
return nil, fmt.Errorf("获取认证链接失败: %w", err)
}
return &EnterpriseAuthResult{
AuthFlowID: authFlowID,
AuthURL: authURL,
AuthShortURL: shortURL,
}, nil
}