Browse Source

修改中融爱签实盘BUG

zhou.xiaoning 1 year ago
parent
commit
db03e261f3

+ 1 - 1
config/config.xml

@@ -55,7 +55,7 @@
     <SignKey value="E7C6EA231F454BF1A5CF8C223D45C422"/>
     <SignKey value="E7C6EA231F454BF1A5CF8C223D45C422"/>
   </Tencent>
   </Tencent>
   <Asign>
   <Asign>
-  <Url value="https://oapi.asign.cn"/>
+    <Url value="https://oapi.asign.cn"/>
     <AppId value="964764021"/>
     <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="/>
     <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"/>
     <NotifyUrl value="http://218.17.158.45:15105/api/Asign/HandleASignCompleted"/>

+ 3 - 0
config/readme.md

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

+ 33 - 5
controllers/asign/test.go

@@ -1,6 +1,7 @@
 package asign
 package asign
 
 
 import (
 import (
+	"io"
 	"mtp2_if/global/app"
 	"mtp2_if/global/app"
 	"mtp2_if/global/e"
 	"mtp2_if/global/e"
 	"mtp2_if/logger"
 	"mtp2_if/logger"
@@ -158,13 +159,13 @@ func TestGetUser(c *gin.Context) {
 
 
 // GetUserSeals 查询印章(测试)
 // GetUserSeals 查询印章(测试)
 // @Summary 查询印章(测试)
 // @Summary 查询印章(测试)
-// @Produce     json
-// @accept      application/json
+// @Produce json
+// @accept  application/json
 // @Param   data body     asignService.APIGetUserSealsReq true "入参"
 // @Param   data body     asignService.APIGetUserSealsReq true "入参"
 // @Success 200  {object} asignService.APIGetUserSealsRsp
 // @Success 200  {object} asignService.APIGetUserSealsRsp
-// @Failure     500  {object} app.Response
+// @Failure 500  {object} app.Response
 // @Router  /Asign/GetUserSeals [post]
 // @Router  /Asign/GetUserSeals [post]
-// @Tags        爱签
+// @Tags    爱签
 func GetUserSeals(c *gin.Context) {
 func GetUserSeals(c *gin.Context) {
 	appG := app.Gin{C: c}
 	appG := app.Gin{C: c}
 
 
@@ -188,7 +189,7 @@ func GetUserSeals(c *gin.Context) {
 	appG.Response(http.StatusOK, e.SUCCESS, apiRsp)
 	appG.Response(http.StatusOK, e.SUCCESS, apiRsp)
 }
 }
 
 
-// GetUserSeals 上传待签署文件(测试)
+// TestCreateContract 上传待签署文件(测试)
 // @Summary 上传待签署文件(测试)
 // @Summary 上传待签署文件(测试)
 // @Produce     json
 // @Produce     json
 // @accept      application/json
 // @accept      application/json
@@ -219,3 +220,30 @@ func TestCreateContract(c *gin.Context) {
 
 
 	appG.Response(http.StatusOK, e.SUCCESS, apiRsp)
 	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": {
         "/Asign/TestAddEnterpriseUser": {
             "post": {
             "post": {
                 "consumes": [
                 "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": {
         "/Asign/TestAddEnterpriseUser": {
             "post": {
             "post": {
                 "consumes": [
                 "consumes": [

+ 25 - 0
docs/swagger.yaml

@@ -31645,6 +31645,31 @@ paths:
       summary: 同步合同状态
       summary: 同步合同状态
       tags:
       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:
   /Asign/TestAddEnterpriseUser:
     post:
     post:
       consumes:
       consumes:

+ 12 - 8
routers/router.go

@@ -855,14 +855,18 @@ func InitRouter() *gin.Engine {
 		asignR.Use().POST("SyncContractStatus", asign.SyncContractStatus)
 		asignR.Use().POST("SyncContractStatus", asign.SyncContractStatus)
 		asignR.Use().POST("HandleASignCompleted", asign.HandleASignCompleted)
 		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("BankCard4", asign.BankCard4)
 		asignR.Use(token.Auth()).POST("CaptcaResend", asign.CaptcaResend)
 		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
 	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) {
 func httpPost(apiUrl string, sortedData string) (rspBody []byte, err error) {
 	appId := config.SerCfg.AsignCfg.AppId
 	appId := config.SerCfg.AsignCfg.AppId
 	privateKey := fmt.Sprintf("-----BEGIN PRIVATE KEY-----\n%s\n-----END PRIVATE KEY-----", config.SerCfg.AsignCfg.PrivateKey)
 	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
 // 参数说明:https://preweb.asign.cn/platform/openDoc/docDetail?mid=createContract
 type APICreateContractReq struct {
 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 上传待签署文件出参
 // APICreateContractRsp 上传待签署文件出参
@@ -240,16 +240,16 @@ type APICreateContractRsp struct {
 
 
 // APISignStrategy 签章策略
 // APISignStrategy 签章策略
 type APISignStrategy struct {
 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 接收方模板填充策略
 // APIReceiverFillStrategy 接收方模板填充策略
@@ -266,28 +266,28 @@ type APIReceiverFillStrategy struct {
 //
 //
 // 参数说明:https://preweb.asign.cn/platform/openDoc/docDetail?mid=addSigner
 // 参数说明:https://preweb.asign.cn/platform/openDoc/docDetail?mid=addSigner
 type APIAddSignerReq struct {
 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 合同用户信息
 // 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)
 insert into esigntemplateconfig (templateconfigid, esigntype, templateno, templatetype, templatename, orderindex, creatorid, createtime, updatetime)
 values (2, 1, '', 2, '客户交易须知', 2, 1, sysdate, sysdate);
 values (2, 1, '', 2, '客户交易须知', 2, 1, sysdate, sysdate);
 
 
-
+delete from esigntemplatefield;
 insert into esigntemplatefield (TEMPLATEFIELDID, TEMPLATECONFIGID, FIELDNAME, FIELDKEY, FIELDTYPE, REMARK, CREATETIME, FIELDUSERTYPE)
 insert into esigntemplatefield (TEMPLATEFIELDID, TEMPLATECONFIGID, FIELDNAME, FIELDKEY, FIELDTYPE, REMARK, CREATETIME, FIELDUSERTYPE)
 values ('1', '2', '甲方签章(企业印章)', 'PARTYA_SIGNATURE', '3', null, sysdate, '2');
 values ('1', '2', '甲方签章(企业印章)', 'PARTYA_SIGNATURE', '3', null, sysdate, '2');
 insert into esigntemplatefield (TEMPLATEFIELDID, TEMPLATECONFIGID, FIELDNAME, FIELDKEY, FIELDTYPE, REMARK, CREATETIME, FIELDUSERTYPE)
 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
+}