Files
tyapi-server/internal/shared/esign/client.go
2025-07-20 20:53:26 +08:00

270 lines
8.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}