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
 | ||
| }
 |