Bladeren bron

修改中融爱签实盘BUG

zhou.xiaoning 1 jaar geleden
bovenliggende
commit
db03e261f3

+ 1 - 1
config/config.xml

@@ -55,7 +55,7 @@
     <SignKey value="E7C6EA231F454BF1A5CF8C223D45C422"/>
   </Tencent>
   <Asign>
-  <Url value="https://oapi.asign.cn"/>
+    <Url value="https://oapi.asign.cn"/>
     <AppId value="964764021"/>
     <PrivateKey value="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCS/rJCcUMRiWehBmmr1E2nAs6vB5YHb9BhmjxgyGZH2JcEIwtz7Qi46GL2iJlHVzPT0sB/Y5r7ssukCFP3PIIwdjO03i+QkuEHqNAzWmjbX7yr48pNFAxafA7bkctAMOd8bO3AAQrznRnFBn5rkv/FBPth1H393p0h+SNce9s6Sdntc//GFkQcT4qQLqi6H/prQ7tMO3HAEpRUORVWBAGpARg9cLmm6X1g6SE6YoGsr0pfhzn/clQ3xTDvnTTaipfl2bnHRnbUfC8j4zq1IYfD21oRxaY4bFWYdnquhsmv1U7jGR7G/WtCh76tNz4OlYl1DHWX498MvDmN/8++tWDjAgMBAAECggEAe3gEM1r/gtNvgAnq6LHDJ+1rvgkZM9Xvqovq+0BY6TA8aPUmwZDwKqDHv1ytowbUObBkkJwRqilcc8OrA5iHoj0m4V1fhohZDB34A6qFOP8Jczg6zNNyLO7XbAbiOmDZj+HPMd+uW0IySxRRS/qFa+/rVxktWviJ8+dYlG5UjngDvfVZbUHNdJWxk+cxU5YkaBKEfpJqs2sVIfFx0aQs0A+UmgAUwszmNAmtvu7y/kT0U9f1lbrze1Ndgg6S/JLjOmORFsbAgCm7NhAWG6yAMViyZ6R9dewqUwOJ214KDAeRREPp6mzvbPLbUg1imBEP5QU3YcEeCP01f3qpxukowQKBgQDJjHVxLRC/ynR3pXF/nYGY/aaNdLAKvWwQFLg/Xs1/Jes8GJ96/9A5VLq4h5pt5EhO0zsVy9S7D0FLSseswVKnRIfjahhiYLRiN9Of4Vgm81vQDduQyweFDh9yiorTerrrKcfFGuOwRKWZOdoxgjSUkRVq1c1G3jJGDmMniibSRwKBgQC6tS6EBQvwxs9mgbVvYISsN2AuPwN9mmpa9y99l5Iv+V+TjToXUJeH+j/i8pB8VrUZRS5MGE4zFCuIru9A1qIoctuMzQ2Ho/yAsTnsZd/LTVApPxLfZWMtLpFhzpoNmVwtuSUWCxZfnDZpb8Bcn3wKjVSgZaJe1z5Sm2cKV4POhQKBgE3TGL484ozMRjC1B6B5V0OWHivc9OUQw5tqBMMjfkIsiCrKbzp1cRfSKc97PRxV273kPppp/JjGiTXjiDqi46GHCtm7a/MA2GZcnDDOONXBfqBV2YSNgTfVfjsiV/zVFTwdA/COM4Eq4K7L8f7QAjGj3BtGt184CT2X7J2l8NudAoGADk6f9+HjHlo9vl8mJhjBUekUZ7bQb6mLiNj0PK2GuEJlvorN7sdwNS1KA/wOcli6m+sfNxmNtIBRLbIqB0/rMSpMBKgZ51D7omjyRVkxIwUTpXV93ryIMwgkf9gzGeOsmpxbaSsEVeNEkCPOG8rk2HIoD/p5zMa1seLSrIo0QXkCgYEAxme+IEcMPzQ/B9ZLdz5zj1W+p7FTK157CZrDlBrg2f+okf1dhItimB4uU7VPOPtH6aI21m7k0BSnuz1fGe8nf6oceMVowV7dXgjNcrPvWpYEY1Dp/w4YGeB7RpJBExUl6oOz6QOrezSBWEfCzy8TKBFFIDnahwken6aHyUTn3Rg="/>
     <NotifyUrl value="http://218.17.158.45:15105/api/Asign/HandleASignCompleted"/>

+ 3 - 0
config/readme.md

@@ -93,6 +93,9 @@ SignKey 腾讯电子签密回调通知密钥,用于解密,使用公司账号
 4、在“印章管理”中新增交易所默认印章;
 5、在“应用管理”中“签章权限”查看“无感知签章权限”是否已开通,如未开通则让交易所与爱签协商开通。
 
+注意事项:
+1、合同里的填充项一定要注意设置是“发起方填写”还是“接收方填写”;
+
 ### 多元测试环境
 ```xml
 <Asign>

+ 33 - 5
controllers/asign/test.go

@@ -1,6 +1,7 @@
 package asign
 
 import (
+	"io"
 	"mtp2_if/global/app"
 	"mtp2_if/global/e"
 	"mtp2_if/logger"
@@ -158,13 +159,13 @@ func TestGetUser(c *gin.Context) {
 
 // GetUserSeals 查询印章(测试)
 // @Summary 查询印章(测试)
-// @Produce     json
-// @accept      application/json
+// @Produce json
+// @accept  application/json
 // @Param   data body     asignService.APIGetUserSealsReq true "入参"
 // @Success 200  {object} asignService.APIGetUserSealsRsp
-// @Failure     500  {object} app.Response
+// @Failure 500  {object} app.Response
 // @Router  /Asign/GetUserSeals [post]
-// @Tags        爱签
+// @Tags    爱签
 func GetUserSeals(c *gin.Context) {
 	appG := app.Gin{C: c}
 
@@ -188,7 +189,7 @@ func GetUserSeals(c *gin.Context) {
 	appG.Response(http.StatusOK, e.SUCCESS, apiRsp)
 }
 
-// GetUserSeals 上传待签署文件(测试)
+// TestCreateContract 上传待签署文件(测试)
 // @Summary 上传待签署文件(测试)
 // @Produce     json
 // @accept      application/json
@@ -219,3 +220,30 @@ func TestCreateContract(c *gin.Context) {
 
 	appG.Response(http.StatusOK, e.SUCCESS, apiRsp)
 }
+
+// TestAPI 文本入参(测试)
+// @Summary 文本入参(测试)
+// @Produce     json
+// @accept      application/json
+// @Param   data body     string true "入参"
+// @Success 200  {object} string
+// @Failure     500  {object} app.Response
+// @Router  /Asign/TestAPI [post]
+// @Tags        爱签
+func TestAPI(c *gin.Context) {
+	appG := app.Gin{C: c}
+
+	b, err := io.ReadAll(appG.C.Request.Body)
+	if err != nil {
+		appG.ResponseByMsg(http.StatusBadRequest, e.ERROR, err.Error(), nil)
+		return
+	}
+	req := string(b)
+	rspBody, err := asignService.TestAPI(req)
+	if err != nil {
+		appG.ResponseByMsg(http.StatusBadRequest, e.ERROR, err.Error(), nil)
+		return
+	}
+
+	appG.Response(http.StatusOK, e.SUCCESS, string(rspBody))
+}

+ 39 - 0
docs/docs.go

@@ -388,6 +388,45 @@ const docTemplate = `{
                 }
             }
         },
+        "/Asign/TestAPI": {
+            "post": {
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "爱签"
+                ],
+                "summary": "文本入参(测试)",
+                "parameters": [
+                    {
+                        "description": "入参",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "type": "string"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "type": "string"
+                        }
+                    },
+                    "500": {
+                        "description": "Internal Server Error",
+                        "schema": {
+                            "$ref": "#/definitions/app.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/Asign/TestAddEnterpriseUser": {
             "post": {
                 "consumes": [

+ 39 - 0
docs/swagger.json

@@ -379,6 +379,45 @@
                 }
             }
         },
+        "/Asign/TestAPI": {
+            "post": {
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "爱签"
+                ],
+                "summary": "文本入参(测试)",
+                "parameters": [
+                    {
+                        "description": "入参",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "type": "string"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "type": "string"
+                        }
+                    },
+                    "500": {
+                        "description": "Internal Server Error",
+                        "schema": {
+                            "$ref": "#/definitions/app.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/Asign/TestAddEnterpriseUser": {
             "post": {
                 "consumes": [

+ 25 - 0
docs/swagger.yaml

@@ -31645,6 +31645,31 @@ paths:
       summary: 同步合同状态
       tags:
       - 爱签
+  /Asign/TestAPI:
+    post:
+      consumes:
+      - application/json
+      parameters:
+      - description: 入参
+        in: body
+        name: data
+        required: true
+        schema:
+          type: string
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            type: string
+        "500":
+          description: Internal Server Error
+          schema:
+            $ref: '#/definitions/app.Response'
+      summary: 文本入参(测试)
+      tags:
+      - 爱签
   /Asign/TestAddEnterpriseUser:
     post:
       consumes:

+ 12 - 8
routers/router.go

@@ -855,14 +855,18 @@ func InitRouter() *gin.Engine {
 		asignR.Use().POST("SyncContractStatus", asign.SyncContractStatus)
 		asignR.Use().POST("HandleASignCompleted", asign.HandleASignCompleted)
 
-		asignR.Use().POST("TestBankCard4", asign.TestBankCard4)
-		asignR.Use().POST("TestCaptcaResend", asign.TestCaptcaResend)
-		asignR.Use().POST("TestCaptchaVerify", asign.TestCaptchaVerify)
-		asignR.Use().POST("TestAddEnterpriseUser", asign.TestAddEnterpriseUser)
-		asignR.Use().POST("TestGetUser", asign.TestGetUser)
-		asignR.Use().POST("CreateSeal", asign.CreateSeal)
-		asignR.Use().POST("GetUserSeals", asign.GetUserSeals)
-		asignR.Use().POST("TestCreateContract", asign.TestCreateContract)
+		if config.SerCfg.GetDebugMode() {
+			asignR.Use().POST("CreateSeal", asign.CreateSeal)
+			asignR.Use().POST("GetUserSeals", asign.GetUserSeals)
+			asignR.Use().POST("TestBankCard4", asign.TestBankCard4)
+			asignR.Use().POST("TestCaptcaResend", asign.TestCaptcaResend)
+			asignR.Use().POST("TestCaptchaVerify", asign.TestCaptchaVerify)
+			asignR.Use().POST("TestAddEnterpriseUser", asign.TestAddEnterpriseUser)
+			asignR.Use().POST("TestGetUser", asign.TestGetUser)
+			asignR.Use().POST("TestCreateContract", asign.TestCreateContract)
+
+			asignR.Use().POST("TestAPI", asign.TestAPI)
+		}
 
 		asignR.Use(token.Auth()).POST("BankCard4", asign.BankCard4)
 		asignR.Use(token.Auth()).POST("CaptcaResend", asign.CaptcaResend)

+ 5 - 0
services/asign/api.go

@@ -70,6 +70,11 @@ func APIPost[T_REQ APIReqData, T_RSP APIRspData](req APIReq[T_REQ], apiPort APIU
 	return
 }
 
+func TestHttpPost(apiUrl string, sortedData string) (rspBody []byte, err error) {
+	apiUrl = config.SerCfg.AsignCfg.Url + string(apiUrl)
+	return httpPost(apiUrl, sortedData)
+}
+
 func httpPost(apiUrl string, sortedData string) (rspBody []byte, err error) {
 	appId := config.SerCfg.AsignCfg.AppId
 	privateKey := fmt.Sprintf("-----BEGIN PRIVATE KEY-----\n%s\n-----END PRIVATE KEY-----", config.SerCfg.AsignCfg.PrivateKey)

+ 52 - 52
services/asign/apiModels.go

@@ -210,26 +210,26 @@ type APITemplate struct {
 //
 // 参数说明:https://preweb.asign.cn/platform/openDoc/docDetail?mid=createContract
 type APICreateContractReq struct {
-	ContractNo           string        `json:"contractNo" binding:"required"`             // 合同ID,合同唯一编号
-	ContractName         string        `json:"contractName" binding:"required"`           // 合同名称
-	ValidityTime         int           `json:"validityTime" structs:",omitempty"`         // 合同签署剩余天数(系统当前时间+该天数=在此日期之前可以签署合同日期),【注】与合同有效截止日期必传其一,【例】可传剩余天数:15
-	ValidityDate         string        `json:"validityDate" structs:",omitempty"`         // 合同有效截止日期(在此日期之前可以签署合同,格式要求:yyyyMMddHHmmss),【注】与合同有效天数必传其一,【例】传值“20231207190000” 为:2023年12月07日19时00分00秒
-	SignOrder            int           `json:"signOrder" binding:"required"`              // 签约方式 1:无序签约(默认) 2:顺序签约
-	ReadSeconds          int           `json:"readSeconds" structs:",omitempty"`          // 强制阅读时间(秒)
-	ReadType             int           `json:"readType" structs:",omitempty"`             // 强制阅读设置 1:倒计时读秒方式 2:必须滑动到文件最底部(有多个文件务必逐个阅读) 3:必须点击打开查看(有多个文件务必逐个打开查看)【注】当readType不传值,仅readSeconds传值时,倒计时读秒是针对整体合同(不强制每个文件逐个阅读)。当readType传值1时,readSeconds也传值时,倒计时(要求每个文件逐个阅读)。当readType传值2或3时,readSeconds也传值时,倒计时读秒是针对整体合同(不强制每个文件逐个阅读)。
-	NeedAgree            int           `json:"needAgree" structs:",omitempty"`            // 同意协议开关:(开启后表示必须同意协议才可签署合同) 1 - 开,0 - 关(默认)
-	AutoExpand           int           `json:"autoExpand" structs:",omitempty"`           // 多文件时,是否自动展开文件列表 1 - 展开, 0 - 不展开(默认)
-	NotifyUrl            string        `json:"notifyUrl" structs:",omitempty"`            // 合同签署完成后(合同状态 status=2)回调通知地址,响应【"ok"】表示接收回调成功。
-	CallbackUrl          string        `json:"callbackUrl" structs:",omitempty"`          // 合同拒签或过期后(合同状态 status=3/4)回调通知地址,响应【"ok"】表示接收回调成功。
-	UserNotifyUrl        string        `json:"userNotifyUrl" structs:",omitempty"`        // 某个用户签署完成(用户签署状态 signStatus=2,参考 查询合同信息接口)之后回调地址,响应【"ok"】表示接收回调成功。
-	RedirectUrl          string        `json:"redirectUrl" structs:",omitempty"`          // 合同签署完成后同步回调地址: redirectUrl 若不为空,可以跳转业务方自己的前端过渡页面,实现业务方自己的逻辑。redirectUrl 为空,签署成功后,会回调小程序或app的方法。具体调用方法参考如下。
-	RefuseOn             int           `json:"refuseOn" structs:",omitempty"`             // 合同签署页退回按钮开关: 1 - 开启,0 - 关闭(默认)
-	AutoContinue         int           `json:"autoContinue" structs:",omitempty"`         // 当前签署人签署完成自动跳转至下一签署人签署开关(仅对顺序签合同生效): 1 - 开启,0 - 关闭(默认)
-	ViewFlg              int           `json:"viewFlg" structs:",omitempty"`              // 合同签署完是否允许可以通过链接查看合同内容: 1:不允许查看 不传值:可以查看(默认)
-	RedirectReturnUrl    string        `json:"redirectReturnUrl" structs:",omitempty"`    // 合同发起页面返回按钮跳转url 若不为空,可以跳转业务方自己的前端页面。
-	RedirectCompletedUrl string        `json:"redirectCompletedUrl" structs:",omitempty"` // 合同发起页面完成后跳转url 若不为空,可以跳转业务方自己的前端过渡页面,实现业务方自己的逻辑。
-	ContractFiles        []interface{} `json:"contractFiles" structs:",omitempty"`        // 合同附件(与合同模板必传其一)(支持多文件上传)
-	Templates            []APITemplate `json:"templates" structs:",omitempty"`            // 合同模板列表(与合同附件必传其一)
+	ContractNo           string        `json:"contractNo" structs:"contractNo" binding:"required"`            // 合同ID,合同唯一编号
+	ContractName         string        `json:"contractName" structs:"contractName" binding:"required"`        // 合同名称
+	ValidityTime         int           `json:"validityTime" structs:"validityTime,omitempty"`                 // 合同签署剩余天数(系统当前时间+该天数=在此日期之前可以签署合同日期),【注】与合同有效截止日期必传其一,【例】可传剩余天数:15
+	ValidityDate         string        `json:"validityDate" structs:"validityDate,omitempty"`                 // 合同有效截止日期(在此日期之前可以签署合同,格式要求:yyyyMMddHHmmss),【注】与合同有效天数必传其一,【例】传值“20231207190000” 为:2023年12月07日19时00分00秒
+	SignOrder            int           `json:"signOrder" structs:"signOrder" binding:"required"`              // 签约方式 1:无序签约(默认) 2:顺序签约
+	ReadSeconds          int           `json:"readSeconds" structs:"readSeconds,omitempty"`                   // 强制阅读时间(秒)
+	ReadType             int           `json:"readType" structs:"readType,omitempty"`                         // 强制阅读设置 1:倒计时读秒方式 2:必须滑动到文件最底部(有多个文件务必逐个阅读) 3:必须点击打开查看(有多个文件务必逐个打开查看)【注】当readType不传值,仅readSeconds传值时,倒计时读秒是针对整体合同(不强制每个文件逐个阅读)。当readType传值1时,readSeconds也传值时,倒计时(要求每个文件逐个阅读)。当readType传值2或3时,readSeconds也传值时,倒计时读秒是针对整体合同(不强制每个文件逐个阅读)。
+	NeedAgree            int           `json:"needAgree" structs:"needAgree,omitempty"`                       // 同意协议开关:(开启后表示必须同意协议才可签署合同) 1 - 开,0 - 关(默认)
+	AutoExpand           int           `json:"autoExpand" structs:"autoExpand,omitempty"`                     // 多文件时,是否自动展开文件列表 1 - 展开, 0 - 不展开(默认)
+	NotifyUrl            string        `json:"notifyUrl" structs:"notifyUrl,omitempty"`                       // 合同签署完成后(合同状态 status=2)回调通知地址,响应【"ok"】表示接收回调成功。
+	CallbackUrl          string        `json:"callbackUrl" structs:"callbackUrl,omitempty"`                   // 合同拒签或过期后(合同状态 status=3/4)回调通知地址,响应【"ok"】表示接收回调成功。
+	UserNotifyUrl        string        `json:"userNotifyUrl" structs:"userNotifyUrl,omitempty"`               // 某个用户签署完成(用户签署状态 signStatus=2,参考 查询合同信息接口)之后回调地址,响应【"ok"】表示接收回调成功。
+	RedirectUrl          string        `json:"redirectUrl" structs:"redirectUrl,omitempty"`                   // 合同签署完成后同步回调地址: redirectUrl 若不为空,可以跳转业务方自己的前端过渡页面,实现业务方自己的逻辑。redirectUrl 为空,签署成功后,会回调小程序或app的方法。具体调用方法参考如下。
+	RefuseOn             int           `json:"refuseOn" structs:"refuseOn,omitempty"`                         // 合同签署页退回按钮开关: 1 - 开启,0 - 关闭(默认)
+	AutoContinue         int           `json:"autoContinue" structs:"autoContinue,omitempty"`                 // 当前签署人签署完成自动跳转至下一签署人签署开关(仅对顺序签合同生效): 1 - 开启,0 - 关闭(默认)
+	ViewFlg              int           `json:"viewFlg" structs:"viewFlg,omitempty"`                           // 合同签署完是否允许可以通过链接查看合同内容: 1:不允许查看 不传值:可以查看(默认)
+	RedirectReturnUrl    string        `json:"redirectReturnUrl" structs:"redirectReturnUrl,omitempty"`       // 合同发起页面返回按钮跳转url 若不为空,可以跳转业务方自己的前端页面。
+	RedirectCompletedUrl string        `json:"redirectCompletedUrl" structs:"redirectCompletedUrl,omitempty"` // 合同发起页面完成后跳转url 若不为空,可以跳转业务方自己的前端过渡页面,实现业务方自己的逻辑。
+	ContractFiles        []interface{} `json:"contractFiles" structs:"contractFiles,omitempty"`               // 合同附件(与合同模板必传其一)(支持多文件上传)
+	Templates            []APITemplate `json:"templates" structs:"templates,omitempty"`                       // 合同模板列表(与合同附件必传其一)
 }
 
 // APICreateContractRsp 上传待签署文件出参
@@ -240,16 +240,16 @@ type APICreateContractRsp struct {
 
 // APISignStrategy 签章策略
 type APISignStrategy struct {
-	AttachNo     int     `json:"attachNo" binding:"required"`     // 附件编号 注:对应上传待签署文件接口(createContract)中,合同附件(contractFiles)或合同模板(templates)参数中的List排序序号(例如:1,2,3...)
-	LocationMode int     `json:"locationMode" binding:"required"` // 定位方式:2:坐标签章 3:关键字签章 4:模板坐标签章
-	CanDrag      int     `json:"canDrag" structs:",omitempty"`    // 签章位置是否可以拖动 1:可以, 其他值:不可以
-	SignKey      string  `json:"signKey" structs:",omitempty"`    // 关键字或签署区名称key(定位方式为关键字签章时此处需传定位关键字,定位方式为模板坐标签章时此处需传模板中设置的签署区名称)
-	SignType     int     `json:"signType" structs:",omitempty"`   // 印章类型:1:签名/签章(默认) 2:时间戳
-	SignPage     int     `json:"signPage" structs:",omitempty"`   // 签章页码(定位方式为坐标签章时必传)
-	SignX        float64 `json:"signX" structs:",omitempty"`      // 签章位置与当前签约文件的左内边距与当前签约文件宽度的比例(精确到小数点后2位)(定位方式为坐标签章时必传)
-	SignY        float64 `json:"signY" structs:",omitempty"`      // 签章位置与当前签约文件的上内边距与当前签约文件高度的比例(精确到小数点后2位)(定位方式为坐标签章时必传)
-	OffsetX      float64 `json:"offsetX" structs:",omitempty"`    // 坐标偏移量(像素PX)
-	OffsetY      float64 `json:"offsetY" structs:",omitempty"`    // 坐标偏移量(像素PX)
+	AttachNo     int     `json:"attachNo" structs:"attachNo" binding:"required"`         // 附件编号 注:对应上传待签署文件接口(createContract)中,合同附件(contractFiles)或合同模板(templates)参数中的List排序序号(例如:1,2,3...)
+	LocationMode int     `json:"locationMode" structs:"locationMode" binding:"required"` // 定位方式:2:坐标签章 3:关键字签章 4:模板坐标签章
+	CanDrag      int     `json:"canDrag" structs:"canDrag,omitempty"`                    // 签章位置是否可以拖动 1:可以, 其他值:不可以
+	SignKey      string  `json:"signKey" structs:"signKey,omitempty"`                    // 关键字或签署区名称key(定位方式为关键字签章时此处需传定位关键字,定位方式为模板坐标签章时此处需传模板中设置的签署区名称)
+	SignType     int     `json:"signType" structs:"signType,omitempty"`                  // 印章类型:1:签名/签章(默认) 2:时间戳
+	SignPage     int     `json:"signPage" structs:"signPage,omitempty"`                  // 签章页码(定位方式为坐标签章时必传)
+	SignX        float64 `json:"signX" structs:"signX,omitempty"`                        // 签章位置与当前签约文件的左内边距与当前签约文件宽度的比例(精确到小数点后2位)(定位方式为坐标签章时必传)
+	SignY        float64 `json:"signY" structs:"signY,omitempty"`                        // 签章位置与当前签约文件的上内边距与当前签约文件高度的比例(精确到小数点后2位)(定位方式为坐标签章时必传)
+	OffsetX      float64 `json:"offsetX" structs:"offsetX,omitempty"`                    // 坐标偏移量(像素PX)
+	OffsetY      float64 `json:"offsetY" structs:"offsetY,omitempty"`                    // 坐标偏移量(像素PX)
 }
 
 // APIReceiverFillStrategy 接收方模板填充策略
@@ -266,28 +266,28 @@ type APIReceiverFillStrategy struct {
 //
 // 参数说明:https://preweb.asign.cn/platform/openDoc/docDetail?mid=addSigner
 type APIAddSignerReq struct {
-	ContractNo               string                    `json:"contractNo" binding:"required"`                 // 合同唯一编码 (40位之内)
-	Account                  string                    `json:"account" binding:"required"`                    // 用户唯一识别码
-	SignType                 int                       `json:"signType" binding:"required"`                   // 签约方式:2:无感知签约(需要开通权限) 3:有感知签约
-	SealNo                   string                    `json:"sealNo" structs:",omitempty"`                   // 印章编号【注】若不传值,则由当前主体的默认印章进行签署
-	AuthSignAccount          string                    `json:"authSignAccount" structs:",omitempty"`          // 指定授权签约用户,该用户需要有印章编号【sealNo】的有效授权记录,如若不指定则印章的默认使用者进行签署,如无默认使用者,则由当前主体【account】进行签署
-	NoticeMobile             string                    `json:"noticeMobile" structs:",omitempty"`             // 通知手机号(用于接收合同签署链接的通知短信)
-	NoticeEmail              string                    `json:"noticeEmail" structs:",omitempty"`              // 通知邮箱号(用于接收合同签署链接的通知短信)
-	SignOrder                string                    `json:"signOrder" structs:",omitempty"`                // 使用顺序签约时签约顺序编号(从1开始),无序签约都为1
-	IsNotice                 int                       `json:"isNotice" structs:",omitempty"`                 // 是否接收合同签署链接的短信通知,优先级高于添加用户接口同名参数:0 - 否(默认),1 - 是
-	ValidateType             int                       `json:"validateType" structs:",omitempty"`             // 签署方式指定:(从以下分类中指定一种) 1:短信验证码签约(支持企业和个人) 2:签约密码签约(支持企业和个人) 3:人脸识别签约(支持企业和个人) 4:手写签名(不推荐,仅限个人,需要开通权限) 5:宋体章签名(不推荐,仅限个人,需要开通权限) 6:手写识别签名+短信签约(仅限个人) 7:手写签名+短信签约(仅限个人) 8:手写签名+人脸识别签约(仅限个人) 9:手写识别签名+人脸识别签约(仅限个人) 10:手写签名 + 认证意愿合一(仅支持个人陌生用户) 11:手写签名识别 + 认证意愿合一(仅支持个人陌生用户) 12:宋体章 + 认证意愿合一(仅支持个人陌生用户) 13:视频双录核身签约(需要开通权限)
-	FaceAuthMode             int                       `json:"faceAuthMode" structs:",omitempty"`             // 人脸识别方式:1:支付宝(不可在支付宝小程序中接入) 2:H5(默认) 4:微信小程序(支持在微信小程序内唤起人脸识别,需联系商务人员开启权限后使用) 5:支付宝小程序(支持在支付宝小程序内唤起人脸识别,需联系商务人员开启权限后使用) 【注】签署方式包含人脸(3,8,9)时,可指定人脸识别方式,不传默认为H5
-	ValidateTypeList         string                    `json:"validateTypeList" structs:",omitempty"`         // 组合签署方式指定:(从以上分类中指定多种以逗号间隔,示例:1,2,3)。允许开发者可以自主控制展示几种签署方式,让签约用户选择。【注】 validateTypeList和validateType都有传值时,签署方式按照validateTypeList指定
-	AutoSwitch               int                       `json:"autoSwitch" structs:",omitempty"`               // 自动切换签约方式:开发者可以自主控制手写内容识别和人脸刷脸识别多次不通过时,是否允许用户切换方式 1 - 仅手写识别允许切换(默认) 2 - 仅人脸识别允许切换 3 - 全部允许 0 - 全部不允许 【注】手写识别三次失败时,会允许用户切换成宋体印章。人脸识别三次不通过,允许切换为短信验证码方式。
-	IsNoticeComplete         int                       `json:"isNoticeComplete" structs:",omitempty"`         // 合同签署完成后是否通知用户:1 - 是,0 - 否(默认)
-	WaterMark                int                       `json:"waterMark" structs:",omitempty"`                // 是否在距底部10px中央位置添加日期水印: 1 - 是,0 - 否(默认)
-	AutoSms                  int                       `json:"autoSms" structs:",omitempty"`                  // 是否自动触发验证码短信:(仅短信验证码方式签署时生效)1:是(默认) 0:否(需要用户手动点击“获取验证码”触发)
-	CustomSignFlag           int                       `json:"customSignFlag" structs:",omitempty"`           // 签章位置策略:0(默认)- 由该接口的参数signStrategyList或signStrikeList指定 1 - 签署用户在签署时自行拖动签章位置 2 - 签署用户在签署时自行拖动签章位置和骑缝章位置
-	IsIframe                 int                       `json:"isIframe" structs:",omitempty"`                 // 如果认证页面使用了iframe,且签约涉及人脸识别,则需传入此参数 1.是 0.否(默认) 接入方需要给iframe开启相机权限,方可正常使用实时检测人脸核身功能<iframe allow="camera;"></iframe>
-	SignStrategyList         []APISignStrategy         `json:"signStrategyList" binding:"required"`           // 签章策略
-	SignStrikeList           []interface{}             `json:"signStrikeList" structs:",omitempty"`           // 骑缝章策略
-	ReceiverFillStrategyList []APIReceiverFillStrategy `json:"receiverFillStrategyList" structs:",omitempty"` // 接收方模板填充策略
-	AuthConfig               interface{}               `json:"authConfig" structs:",omitempty"`               // 添加陌生签署人认证参数配置
+	ContractNo               string                    `json:"contractNo" structs:"contractNo" binding:"required"`                    // 合同唯一编码 (40位之内)
+	Account                  string                    `json:"account" structs:"account" binding:"required"`                          // 用户唯一识别码
+	SignType                 int                       `json:"signType" structs:"signType" binding:"required"`                        // 签约方式:2:无感知签约(需要开通权限) 3:有感知签约
+	SealNo                   string                    `json:"sealNo" structs:"sealNo,omitempty"`                                     // 印章编号【注】若不传值,则由当前主体的默认印章进行签署
+	AuthSignAccount          string                    `json:"authSignAccount" structs:"authSignAccount,omitempty"`                   // 指定授权签约用户,该用户需要有印章编号【sealNo】的有效授权记录,如若不指定则印章的默认使用者进行签署,如无默认使用者,则由当前主体【account】进行签署
+	NoticeMobile             string                    `json:"noticeMobile" structs:"noticeMobile,omitempty"`                         // 通知手机号(用于接收合同签署链接的通知短信)
+	NoticeEmail              string                    `json:"noticeEmail" structs:"noticeEmail,omitempty"`                           // 通知邮箱号(用于接收合同签署链接的通知短信)
+	SignOrder                string                    `json:"signOrder" structs:"signOrder,omitempty"`                               // 使用顺序签约时签约顺序编号(从1开始),无序签约都为1
+	IsNotice                 int                       `json:"isNotice" structs:"isNotice,omitempty"`                                 // 是否接收合同签署链接的短信通知,优先级高于添加用户接口同名参数:0 - 否(默认),1 - 是
+	ValidateType             int                       `json:"validateType" structs:"validateType,omitempty"`                         // 签署方式指定:(从以下分类中指定一种) 1:短信验证码签约(支持企业和个人) 2:签约密码签约(支持企业和个人) 3:人脸识别签约(支持企业和个人) 4:手写签名(不推荐,仅限个人,需要开通权限) 5:宋体章签名(不推荐,仅限个人,需要开通权限) 6:手写识别签名+短信签约(仅限个人) 7:手写签名+短信签约(仅限个人) 8:手写签名+人脸识别签约(仅限个人) 9:手写识别签名+人脸识别签约(仅限个人) 10:手写签名 + 认证意愿合一(仅支持个人陌生用户) 11:手写签名识别 + 认证意愿合一(仅支持个人陌生用户) 12:宋体章 + 认证意愿合一(仅支持个人陌生用户) 13:视频双录核身签约(需要开通权限)
+	FaceAuthMode             int                       `json:"faceAuthMode" structs:"faceAuthMode,omitempty"`                         // 人脸识别方式:1:支付宝(不可在支付宝小程序中接入) 2:H5(默认) 4:微信小程序(支持在微信小程序内唤起人脸识别,需联系商务人员开启权限后使用) 5:支付宝小程序(支持在支付宝小程序内唤起人脸识别,需联系商务人员开启权限后使用) 【注】签署方式包含人脸(3,8,9)时,可指定人脸识别方式,不传默认为H5
+	ValidateTypeList         string                    `json:"validateTypeList" structs:"validateTypeList,omitempty"`                 // 组合签署方式指定:(从以上分类中指定多种以逗号间隔,示例:1,2,3)。允许开发者可以自主控制展示几种签署方式,让签约用户选择。【注】 validateTypeList和validateType都有传值时,签署方式按照validateTypeList指定
+	AutoSwitch               int                       `json:"autoSwitch" structs:"autoSwitch,omitempty"`                             // 自动切换签约方式:开发者可以自主控制手写内容识别和人脸刷脸识别多次不通过时,是否允许用户切换方式 1 - 仅手写识别允许切换(默认) 2 - 仅人脸识别允许切换 3 - 全部允许 0 - 全部不允许 【注】手写识别三次失败时,会允许用户切换成宋体印章。人脸识别三次不通过,允许切换为短信验证码方式。
+	IsNoticeComplete         int                       `json:"isNoticeComplete" structs:"isNoticeComplete,omitempty"`                 // 合同签署完成后是否通知用户:1 - 是,0 - 否(默认)
+	WaterMark                int                       `json:"waterMark" structs:"waterMark,omitempty"`                               // 是否在距底部10px中央位置添加日期水印: 1 - 是,0 - 否(默认)
+	AutoSms                  int                       `json:"autoSms" structs:"autoSms,omitempty"`                                   // 是否自动触发验证码短信:(仅短信验证码方式签署时生效)1:是(默认) 0:否(需要用户手动点击“获取验证码”触发)
+	CustomSignFlag           int                       `json:"customSignFlag" structs:"customSignFlag,omitempty"`                     // 签章位置策略:0(默认)- 由该接口的参数signStrategyList或signStrikeList指定 1 - 签署用户在签署时自行拖动签章位置 2 - 签署用户在签署时自行拖动签章位置和骑缝章位置
+	IsIframe                 int                       `json:"isIframe" structs:"isIframe,omitempty"`                                 // 如果认证页面使用了iframe,且签约涉及人脸识别,则需传入此参数 1.是 0.否(默认) 接入方需要给iframe开启相机权限,方可正常使用实时检测人脸核身功能<iframe allow="camera;"></iframe>
+	SignStrategyList         []APISignStrategy         `json:"signStrategyList" structs:"signStrategyList" binding:"required"`        // 签章策略
+	SignStrikeList           []interface{}             `json:"signStrikeList" structs:"signStrikeList,omitempty"`                     // 骑缝章策略
+	ReceiverFillStrategyList []APIReceiverFillStrategy `json:"receiverFillStrategyList" structs:"receiverFillStrategyList,omitempty"` // 接收方模板填充策略
+	AuthConfig               interface{}               `json:"authConfig" structs:"authConfig,omitempty"`                             // 添加陌生签署人认证参数配置
 }
 
 // APISignUserDetail 合同用户信息

+ 1 - 1
services/asign/templates/中融/MTP2.0_db_init_R0041_054_00811_01.sql

@@ -8,7 +8,7 @@ values (1, 1, '', 1, '实名认证', 1, 1, sysdate, sysdate);
 insert into esigntemplateconfig (templateconfigid, esigntype, templateno, templatetype, templatename, orderindex, creatorid, createtime, updatetime)
 values (2, 1, '', 2, '客户交易须知', 2, 1, sysdate, sysdate);
 
-
+delete from esigntemplatefield;
 insert into esigntemplatefield (TEMPLATEFIELDID, TEMPLATECONFIGID, FIELDNAME, FIELDKEY, FIELDTYPE, REMARK, CREATETIME, FIELDUSERTYPE)
 values ('1', '2', '甲方签章(企业印章)', 'PARTYA_SIGNATURE', '3', null, sysdate, '2');
 insert into esigntemplatefield (TEMPLATEFIELDID, TEMPLATECONFIGID, FIELDNAME, FIELDKEY, FIELDTYPE, REMARK, CREATETIME, FIELDUSERTYPE)

+ 7 - 0
services/asign/test.go

@@ -0,0 +1,7 @@
+package asign
+
+func TestAPI(req string) (rspBody []byte, err error) {
+	rspBody, err = TestHttpPost(APIURL_AddSigner, req)
+
+	return
+}