270 lines
8.5 KiB
Go
270 lines
8.5 KiB
Go
|
|
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
|
|||
|
|
}
|