188 lines
6.2 KiB
Go
188 lines
6.2 KiB
Go
|
|
package fadada
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"fmt"
|
|||
|
|
"strings"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// AuthConfig 认证相关配置
|
|||
|
|
type AuthConfig struct {
|
|||
|
|
RedirectURL string `json:"redirectUrl" yaml:"redirect_url"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// SignConfig 签署相关配置
|
|||
|
|
type SignConfig struct {
|
|||
|
|
RedirectURL string `json:"redirectUrl" yaml:"redirect_url"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ContractConfig 合同相关配置
|
|||
|
|
type ContractConfig struct {
|
|||
|
|
Name string `json:"name" yaml:"name"`
|
|||
|
|
ExpireDays int `json:"expireDays" yaml:"expire_days"`
|
|||
|
|
RetryCount int `json:"retryCount" yaml:"retry_count"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// CallbackConfig 回调配置
|
|||
|
|
type CallbackConfig struct {
|
|||
|
|
Enabled bool `json:"enabled" yaml:"enabled"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TemplateFields 合作协议模板控件 fieldId
|
|||
|
|
type TemplateFields struct {
|
|||
|
|
// AgreementNo 协议编号控件编码列表(法大大控件不可复用,多处填同一值)
|
|||
|
|
AgreementNo []string `json:"agreementNo" yaml:"agreement_no"`
|
|||
|
|
ContractDate string `json:"contractDate" yaml:"contract_date"`
|
|||
|
|
// PartyAName 甲方企业名控件编码列表(多处填同一企业名)
|
|||
|
|
PartyAName []string `json:"partyAName" yaml:"party_a_name"`
|
|||
|
|
PartyAUSCC string `json:"partyAUscc" yaml:"party_a_uscc"`
|
|||
|
|
PartyAAddress string `json:"partyAAddress" yaml:"party_a_address"`
|
|||
|
|
PartyARep string `json:"partyARep" yaml:"party_a_rep"`
|
|||
|
|
PartyASignDate string `json:"partyASignDate" yaml:"party_a_sign_date"`
|
|||
|
|
PartyBSignDate string `json:"partyBSignDate" yaml:"party_b_sign_date"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Config 法大大服务配置
|
|||
|
|
type Config struct {
|
|||
|
|
AppID string `json:"appId" yaml:"app_id"`
|
|||
|
|
AppSecret string `json:"appSecret" yaml:"app_secret"`
|
|||
|
|
ServerURL string `json:"serverUrl" yaml:"server_url"`
|
|||
|
|
OpenCorpID string `json:"openCorpId" yaml:"open_corp_id"`
|
|||
|
|
// NoAuthSceneCode 免验证签场景码;仅 freeSignType=business 时需要。当前按模板免验证签,可留空。
|
|||
|
|
NoAuthSceneCode string `json:"noAuthSceneCode" yaml:"no_auth_scene_code"`
|
|||
|
|
TemplateID string `json:"templateId" yaml:"template_id"`
|
|||
|
|
// PartyAActorID / PartyBActorID 签署模板中的参与方标识(actorId),须与模板角色名一致
|
|||
|
|
PartyAActorID string `json:"partyAActorId" yaml:"party_a_actor_id"`
|
|||
|
|
PartyBActorID string `json:"partyBActorId" yaml:"party_b_actor_id"`
|
|||
|
|
// TemplateDocID 签署模板文档 docId(填单必填);为空则创建任务后从详情自动解析
|
|||
|
|
TemplateDocID string `json:"templateDocId" yaml:"template_doc_id"`
|
|||
|
|
TemplateFields *TemplateFields `json:"templateFields" yaml:"template_fields"`
|
|||
|
|
Contract *ContractConfig `json:"contract" yaml:"contract"`
|
|||
|
|
Auth *AuthConfig `json:"auth" yaml:"auth"`
|
|||
|
|
Sign *SignConfig `json:"sign" yaml:"sign"`
|
|||
|
|
Callback *CallbackConfig `json:"callback" yaml:"callback"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// NewConfig 创建并校验法大大配置
|
|||
|
|
func NewConfig(
|
|||
|
|
appID, appSecret, serverURL, openCorpID, noAuthSceneCode, templateID string,
|
|||
|
|
partyAActorID, partyBActorID, templateDocID string,
|
|||
|
|
fields *TemplateFields,
|
|||
|
|
contract *ContractConfig,
|
|||
|
|
auth *AuthConfig,
|
|||
|
|
sign *SignConfig,
|
|||
|
|
callback *CallbackConfig,
|
|||
|
|
) (*Config, error) {
|
|||
|
|
if appID == "" {
|
|||
|
|
return nil, fmt.Errorf("法大大应用ID不能为空")
|
|||
|
|
}
|
|||
|
|
if appSecret == "" {
|
|||
|
|
return nil, fmt.Errorf("法大大应用密钥不能为空")
|
|||
|
|
}
|
|||
|
|
if serverURL == "" {
|
|||
|
|
return nil, fmt.Errorf("法大大服务器URL不能为空")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return &Config{
|
|||
|
|
AppID: appID,
|
|||
|
|
AppSecret: appSecret,
|
|||
|
|
ServerURL: serverURL,
|
|||
|
|
OpenCorpID: openCorpID,
|
|||
|
|
NoAuthSceneCode: noAuthSceneCode,
|
|||
|
|
TemplateID: templateID,
|
|||
|
|
PartyAActorID: partyAActorID,
|
|||
|
|
PartyBActorID: partyBActorID,
|
|||
|
|
TemplateDocID: templateDocID,
|
|||
|
|
TemplateFields: fields,
|
|||
|
|
Contract: contract,
|
|||
|
|
Auth: auth,
|
|||
|
|
Sign: sign,
|
|||
|
|
Callback: callback,
|
|||
|
|
}, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Validate 验证配置完整性
|
|||
|
|
func (c *Config) Validate() error {
|
|||
|
|
if c.AppID == "" {
|
|||
|
|
return fmt.Errorf("法大大应用ID不能为空")
|
|||
|
|
}
|
|||
|
|
if c.AppSecret == "" {
|
|||
|
|
return fmt.Errorf("法大大应用密钥不能为空")
|
|||
|
|
}
|
|||
|
|
if c.ServerURL == "" {
|
|||
|
|
return fmt.Errorf("法大大服务器URL不能为空")
|
|||
|
|
}
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ValidateTemplateFields 校验模板填单所需配置
|
|||
|
|
func (c *Config) ValidateTemplateFields() error {
|
|||
|
|
if c.TemplateID == "" {
|
|||
|
|
return fmt.Errorf("法大大模板ID不能为空")
|
|||
|
|
}
|
|||
|
|
if c.OpenCorpID == "" {
|
|||
|
|
return fmt.Errorf("法大大 open_corp_id 不能为空")
|
|||
|
|
}
|
|||
|
|
if c.TemplateFields == nil {
|
|||
|
|
return fmt.Errorf("法大大 template_fields 未配置")
|
|||
|
|
}
|
|||
|
|
f := c.TemplateFields
|
|||
|
|
if len(f.AgreementNo) == 0 {
|
|||
|
|
return fmt.Errorf("法大大 template_fields.agreement_no 不能为空")
|
|||
|
|
}
|
|||
|
|
for i, id := range f.AgreementNo {
|
|||
|
|
if strings.TrimSpace(id) == "" {
|
|||
|
|
return fmt.Errorf("法大大 template_fields.agreement_no[%d] 不能为空", i)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if len(f.PartyAName) == 0 {
|
|||
|
|
return fmt.Errorf("法大大 template_fields.party_a_name 不能为空")
|
|||
|
|
}
|
|||
|
|
for i, id := range f.PartyAName {
|
|||
|
|
if strings.TrimSpace(id) == "" {
|
|||
|
|
return fmt.Errorf("法大大 template_fields.party_a_name[%d] 不能为空", i)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// party_a/b_sign_date 为签署控件,签署时自动写入,填单可不配
|
|||
|
|
required := map[string]string{
|
|||
|
|
"contract_date": f.ContractDate,
|
|||
|
|
"party_a_uscc": f.PartyAUSCC,
|
|||
|
|
"party_a_address": f.PartyAAddress,
|
|||
|
|
"party_a_rep": f.PartyARep,
|
|||
|
|
}
|
|||
|
|
for name, id := range required {
|
|||
|
|
if id == "" {
|
|||
|
|
return fmt.Errorf("法大大 template_fields.%s 不能为空", name)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ResolvePartyAActorID 甲方参与方标识(优先配置,默认与签署模板角色名一致)
|
|||
|
|
func (c *Config) ResolvePartyAActorID() string {
|
|||
|
|
if c != nil && c.PartyAActorID != "" {
|
|||
|
|
return c.PartyAActorID
|
|||
|
|
}
|
|||
|
|
return ActorIDPartyA
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ResolvePartyBActorID 乙方参与方标识(优先配置,默认与签署模板角色名一致)
|
|||
|
|
func (c *Config) ResolvePartyBActorID() string {
|
|||
|
|
if c != nil && c.PartyBActorID != "" {
|
|||
|
|
return c.PartyBActorID
|
|||
|
|
}
|
|||
|
|
return ActorIDPartyB
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const (
|
|||
|
|
// 接口成功码
|
|||
|
|
successCode = "100000"
|
|||
|
|
|
|||
|
|
// 个人证件类型:身份证(文档 userIdentType)
|
|||
|
|
UserIdentTypeIDCard = "id_card"
|
|||
|
|
|
|||
|
|
// 企业认证方式:法人认证(文档 corpIdentMethod)
|
|||
|
|
CorpIdentMethodLegalRep = "legalRep"
|
|||
|
|
// 经办人认证方式:手机号(文档 oprIdentMethod)
|
|||
|
|
OprIdentMethodMobile = "mobile"
|
|||
|
|
)
|