servcies.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603
  1. package asign
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "io"
  8. "mtp2_if/config"
  9. "mtp2_if/db"
  10. "mtp2_if/logger"
  11. "mtp2_if/models"
  12. "mtp2_if/utils"
  13. "net/http"
  14. "strconv"
  15. )
  16. // BankCard4 银行卡四要素认证
  17. func BankCard4(req BankCard4Req) (rsp BankCard4Rsp, err error) {
  18. // 校验入参
  19. if req.Type == 1 && req.Person == nil {
  20. err = errors.New("缺少参数")
  21. return
  22. }
  23. if req.Type == 2 && req.Company == nil {
  24. err = errors.New("缺少参数")
  25. return
  26. }
  27. // 判断证件号码是否已经在爱签平台存在
  28. var getUserReq APIGetUserReq
  29. getUserReq.Account = strconv.Itoa(req.UserId)
  30. apiRsp, err := APIGetUser(getUserReq)
  31. if err != nil {
  32. return
  33. }
  34. if apiRsp.Code == CODE_SUCCESS {
  35. err = errors.New("电子签平台用户编号已存在")
  36. logger.GetLogger().Error("电子签平台用户编号已存在, apiRsp:", apiRsp)
  37. return
  38. }
  39. getUserReq.Account = ""
  40. if req.Type == 1 {
  41. getUserReq.IdCard = req.Person.IdCardNo
  42. } else {
  43. getUserReq.CreditCode = req.Company.CreditCode
  44. }
  45. apiRsp, err = APIGetUser(getUserReq)
  46. if err != nil {
  47. return
  48. }
  49. if apiRsp.Code == CODE_SUCCESS && len(apiRsp.Data) > 0 {
  50. err = errors.New("电子签平台证件号码已存在")
  51. logger.GetLogger().Error("电子签平台证件号码已存在, apiRsp:", apiRsp)
  52. return
  53. }
  54. // 从交易库中获取类型为实名认证的电子签信息
  55. var record models.Useresignrecord
  56. has, err := db.GetEngine().Where("TEMPLATETYPE = 1 AND USERID = ?", req.UserId).Get(&record)
  57. if err != nil {
  58. return
  59. }
  60. if !has {
  61. err = errors.New("无对应实名认证记录信息")
  62. logger.GetLogger().Error("无对应实名认证记录信息, userId:", req.UserId)
  63. return
  64. }
  65. if record.RECORDSTATUS == 3 {
  66. err = errors.New("账户已实名")
  67. logger.GetLogger().Error("账户已实名, userId:", req.UserId)
  68. return
  69. }
  70. // 调用爱签接口
  71. var authinfo []byte
  72. var bankCard4Rsp *APIRsp[APIBankCard4Rsp]
  73. if req.Type == 1 { // 个人
  74. personBankCard4Req := APIPersonBankCard4Req{
  75. RealName: req.Person.RealName,
  76. IdCardNo: req.Person.IdCardNo,
  77. BankCard: req.Person.BankCard,
  78. Mobile: req.Person.Mobile,
  79. }
  80. if bankCard4Rsp, err = APIPersonBankCard4(personBankCard4Req); err != nil {
  81. return
  82. }
  83. if authinfo, err = json.Marshal(req.Person); err != nil {
  84. return
  85. }
  86. } else { // 企业
  87. companyBankCard4Req := APICompanyBankCard4Req{
  88. CompanyName: req.Company.CompanyName,
  89. CreditCode: req.Company.CreditCode,
  90. RealName: req.Company.RealName,
  91. IdCardNo: req.Company.IdCardNo,
  92. BankCard: req.Company.BankCard,
  93. Mobile: req.Company.Mobile,
  94. }
  95. if bankCard4Rsp, err = APICompanyBankCard4(companyBankCard4Req); err != nil {
  96. return
  97. }
  98. if authinfo, err = json.Marshal(req.Company); err != nil {
  99. return
  100. }
  101. }
  102. if bankCard4Rsp.Code != CODE_SUCCESS {
  103. err = errors.New(bankCard4Rsp.Msg)
  104. return
  105. }
  106. rsp.SerialNo = bankCard4Rsp.Data.SerialNo
  107. // 更新用户电子签记录-记录实名信息
  108. sql := fmt.Sprintf(`
  109. UPDATE useresignrecord
  110. SET RECORDSTATUS = 2,
  111. UPDATETIME = SYSDATE,
  112. AUTHINFO = '%v'
  113. WHERE USERID = %v AND TEMPLATETYPE = 1
  114. `, string(authinfo), req.UserId)
  115. _, err = db.GetEngine().Exec(sql)
  116. return
  117. }
  118. // CaptcaResend 重新发送认证验证码
  119. func CaptcaResend(req CaptchaResendReq) (err error) {
  120. apiReq := APICaptchaResendReq{SerialNo: req.SerialNo}
  121. apiRsp, err := APICaptchaResend(apiReq)
  122. if err != nil {
  123. return
  124. }
  125. if apiRsp.Code != CODE_SUCCESS {
  126. err = errors.New(apiRsp.Msg)
  127. return
  128. }
  129. return
  130. }
  131. // CaptchaVerify 认证验证码校验
  132. func CaptchaVerify(req CaptchaVerifyReq) (err error) {
  133. // 从交易库中获取类型为实名认证的电子签信息
  134. var record models.Useresignrecord
  135. has, err := db.GetEngine().Where("TEMPLATETYPE = 1 AND RECORDSTATUS = 2 AND USERID = ?", req.UserId).Get(&record)
  136. if err != nil {
  137. return
  138. }
  139. if !has {
  140. err = errors.New("无对应实名认证记录信息")
  141. logger.GetLogger().Error("无对应实名认证记录信息, userId:", req.UserId)
  142. return
  143. }
  144. // 调用爱签接口 - 认证验证码校验
  145. apiReq := APICaptchaVerifyReq{
  146. SerialNo: req.SerialNo,
  147. Captcha: req.Captcha,
  148. }
  149. apiRsp, err := APICaptchaVerify(apiReq)
  150. if err != nil {
  151. return
  152. }
  153. if apiRsp.Code != CODE_SUCCESS {
  154. err = errors.New(apiRsp.Msg)
  155. return
  156. }
  157. // 调用爱签接口 - 添加用户
  158. var addUserRsp *APIRsp[APIAddUserRsp]
  159. if req.Type == 1 { // 个人
  160. addPersonalUserReq := APIAddPersonalUserReq{
  161. Account: strconv.Itoa(req.UserId),
  162. SerialNo: req.SerialNo,
  163. }
  164. if addUserRsp, err = APIAddPersonalUser(addPersonalUserReq); err != nil {
  165. return
  166. }
  167. } else { // 企业
  168. addEnterpriseUserReq := APIAddEnterpriseUserReq{
  169. Account: strconv.Itoa(req.UserId),
  170. SerialNo: req.SerialNo,
  171. }
  172. if addUserRsp, err = APIAddEnterpriseUser(addEnterpriseUserReq); err != nil {
  173. return
  174. }
  175. }
  176. if addUserRsp.Code != CODE_SUCCESS {
  177. err = errors.New(addUserRsp.Msg)
  178. return
  179. }
  180. // 获取临时存储的用户认证信息
  181. cacheMap := make(map[string]interface{})
  182. if err = json.Unmarshal([]byte(record.AUTHINFO), &cacheMap); err != nil {
  183. logger.GetLogger().Error("反序列化临时存储用户信息失败, AUTHINFO:", record.AUTHINFO)
  184. return
  185. }
  186. // 调用JAVA实名认证接口
  187. reqParam := make(map[string]interface{})
  188. if req.Type == 1 { // 个人
  189. reqParam["userid"] = req.UserId
  190. reqParam["cardnum"] = cacheMap["idCardNo"]
  191. reqParam["username"] = cacheMap["realName"]
  192. reqParam["cardtype"] = 0 // 目前写死证件类型为身份证 - 0
  193. reqParam["cardfrontphotourl"] = cacheMap["idCardPhoto"]
  194. reqParam["cardbackphotourl"] = cacheMap["idCardPhotoBackURL"]
  195. reqParam["userinfotype"] = 1 // 1 - 个人
  196. } else {
  197. reqParam["userid"] = req.UserId
  198. reqParam["customername"] = cacheMap["companyName"]
  199. reqParam["cardtype"] = 21
  200. reqParam["cardfrontphotourl"] = cacheMap["idCardPhoto"]
  201. reqParam["legalpersonname"] = cacheMap["realName"]
  202. reqParam["cardnum"] = cacheMap["creditCode"]
  203. reqParam["mobilephone"] = cacheMap["mobile"]
  204. }
  205. jsonParam, err := json.Marshal(&reqParam)
  206. if err != nil {
  207. logger.GetLogger().Error("反序列化JAVA实名认证入参失败, reqParam:", reqParam)
  208. return
  209. }
  210. // 构建请求
  211. javaUrl := config.SerCfg.AsignCfg.OpenApiUrl + "/onlineopen/userInfo/addAuth"
  212. javaReq, err := http.NewRequest("POST", javaUrl, bytes.NewReader(jsonParam))
  213. // 设置请求头
  214. javaReq.Header.Set("Content-Type", "application/json; charset=utf-8")
  215. client := &http.Client{}
  216. rsp, err := client.Do(javaReq)
  217. if err != nil {
  218. logger.GetLogger().Error("JAVA实名认证请求失败, err:", err)
  219. return
  220. }
  221. defer rsp.Body.Close()
  222. body, err := io.ReadAll(rsp.Body)
  223. if err != nil {
  224. logger.GetLogger().Error("JAVA实名认证请求获取body失败, err:", err)
  225. return
  226. }
  227. // rspData: map[code:0 hasAuth:1 message:认证成功]
  228. rspData := make(map[string]interface{})
  229. if err = json.Unmarshal(body, &rspData); err != nil {
  230. logger.GetLogger().Error("JAVA实名认证请求反序列化body失败, err:", err)
  231. return
  232. }
  233. logger.GetLogger().Info("调用JAVA实名认证接口返回, rspData:", rspData)
  234. code, ok := rspData["code"]
  235. if !ok {
  236. err = errors.New("实名认证失败,请稍后重试")
  237. logger.GetLogger().Error(err.Error())
  238. return
  239. }
  240. if code != "0" {
  241. err = fmt.Errorf("实名认证失败,%v", rspData["message"])
  242. logger.GetLogger().Error(err.Error())
  243. return
  244. }
  245. // 更新用户电子签记录 - 更新实名认证状态
  246. sql := fmt.Sprintf(`
  247. UPDATE useresignrecord
  248. SET RECORDSTATUS = 3,
  249. UPDATETIME = SYSDATE
  250. WHERE USERID = %v AND TEMPLATETYPE = 1
  251. `, req.UserId)
  252. _, err = db.GetEngine().Exec(sql)
  253. return
  254. }
  255. // SyncContractStatus 同步合同状态
  256. func SyncContractStatus(req SyncContractStatusReq) (rsp SyncContractStatusRsp, err error) {
  257. // 从交易库中获取类型为实名认证的电子签信息
  258. var record models.Useresignrecord
  259. has, err := db.GetEngine().Where("RECORDID = ?", req.RecordId).Get(&record)
  260. if err != nil {
  261. return
  262. }
  263. if !has {
  264. err = errors.New("查无此记录信息")
  265. logger.GetLogger().Error("查无此记录信息, RecordId:", req.RecordId)
  266. return
  267. }
  268. if record.CONTRACTNO == "" {
  269. err = errors.New("此记录未生成合同编号")
  270. logger.GetLogger().Error("此记录未生成合同编号, RecordId:", req.RecordId)
  271. return
  272. }
  273. // 调用爱签接口 - 查询合同状态
  274. apiReq := APIContractStatusReq{ContractNo: record.CONTRACTNO}
  275. apiRsp, err := APIContractStatus(apiReq)
  276. if err != nil {
  277. return
  278. }
  279. if apiRsp.Code != CODE_SUCCESS {
  280. err = errors.New(apiRsp.Msg)
  281. return
  282. }
  283. status := record.RECORDSTATUS // 记录状态: 1:未签署 2:签署中 3:已签署 4:签署拒绝
  284. switch apiRsp.Data.Status { // 合同状态:0:等待签约 1:签约中 2:已签约 3:过期 4:拒签 6:作废 -2:状态异常
  285. case 0:
  286. status = 1
  287. case 1:
  288. status = 2
  289. case 2:
  290. status = 3
  291. case 4:
  292. status = 4
  293. }
  294. // 更新用户电子签记录 - 更新合同签署状态
  295. sql := fmt.Sprintf(`
  296. UPDATE useresignrecord
  297. SET RECORDSTATUS = %v,
  298. UPDATETIME = SYSDATE
  299. WHERE RECORDID = %v
  300. `, status, req.RecordId)
  301. _, err = db.GetEngine().Exec(sql)
  302. if err != nil {
  303. return
  304. }
  305. rsp = SyncContractStatusRsp{
  306. ContractNo: apiRsp.Data.ContractNo,
  307. ContractName: apiRsp.Data.ContractName,
  308. Status: apiRsp.Data.Status,
  309. }
  310. return
  311. }
  312. // PARTYA_SIGNATURE
  313. // PARTYA_DATE
  314. //
  315. // P_PARTYB_SIGNATURE
  316. // P_PARTYB_ID
  317. // P_PARTYB_MOBILE
  318. // P_PARTYB_DATE
  319. //
  320. // E_PARTYB_SIGNATURE
  321. // E_PARTYB_LEGAL
  322. // E_PARTYB_DATE
  323. // CreateContract 创建合同
  324. func CreateContract(req CreateContractReq) (rsp CreateContractRsp, err error) {
  325. // 获取电子签信息
  326. var record models.Useresignrecord
  327. has, err := db.GetEngine().Where("RECORDID = ?", req.RecordId).Get(&record)
  328. if err != nil {
  329. logger.GetLogger().Error("获取电子签信息失败, err", err)
  330. err = errors.New("获取电子签信息失败")
  331. return
  332. }
  333. if !has {
  334. err = errors.New("查无此记录信息")
  335. logger.GetLogger().Error("查无此记录信息, RecordId:", req.RecordId)
  336. return
  337. }
  338. if record.RECORDSTATUS != 1 {
  339. err = errors.New("记录信息状态异常")
  340. logger.GetLogger().Error("记录信息状态异常, RecordId:", req.RecordId, record.RECORDSTATUS)
  341. return
  342. }
  343. // // 获取电子签模板字段配置信息
  344. // fields := make([]models.Esigntemplatefield, 0)
  345. // if err = db.GetEngine().Where("TEMPLATECONFIGID = ?", record.TEMPLATECONFIGID).Find(&fields); err != nil {
  346. // logger.GetLogger().Error("获取电子签模板字段配置信息失败, err", err)
  347. // err = errors.New("获取电子签模板字段配置信息失败")
  348. // return
  349. // }
  350. // if len(fields) == 0 {
  351. // err = errors.New("获取电子签模板字段配置信息异常")
  352. // logger.GetLogger().Error("获取电子签模板字段配置信息异常, templateconfigid:", record.TEMPLATECONFIGID)
  353. // return
  354. // }
  355. // 调用爱签接口 - 查询模板列表
  356. apiReq := APITemplateListReq{Page: 1, Rows: 10}
  357. apiRsp, err := APITemplateList(apiReq)
  358. if err != nil {
  359. return
  360. }
  361. if apiRsp.Code != CODE_SUCCESS {
  362. err = errors.New(apiRsp.Msg)
  363. return
  364. }
  365. if len(apiRsp.Data.List) == 0 {
  366. err = errors.New("获取查询模板列表失败")
  367. logger.GetLogger().Error("获取查询模板列表失败")
  368. return
  369. }
  370. // 获取用户信息
  371. userInfo, err := models.GetUserInfo(int(record.USERID))
  372. if err != nil {
  373. logger.GetLogger().Error("获取用户信息失败, err:", err)
  374. err = errors.New("获取用户信息失败")
  375. return
  376. }
  377. templateName := record.TEMPLATENAME
  378. if userInfo.Userinfotype == 1 { // 个人
  379. templateName += "-个人"
  380. } else { // 企业
  381. templateName += "-企业"
  382. }
  383. // 获取模板信息
  384. templateIdent := ""
  385. for _, item := range apiRsp.Data.List {
  386. if item.TemplateName == templateName {
  387. templateIdent = item.TemplateIdent
  388. break
  389. }
  390. }
  391. if templateIdent == "" {
  392. err = errors.New("获取模板信息失败")
  393. logger.GetLogger().Error("获取模板信息失败")
  394. return
  395. }
  396. // 获取用户实名信息
  397. var recordAuth models.Useresignrecord
  398. has, err = db.GetEngine().Where("TEMPLATETYPE = 1 AND USERID = ?", userInfo.Userid).Get(&recordAuth)
  399. if err != nil {
  400. return
  401. }
  402. if !has {
  403. err = errors.New("无对应实名认证记录信息")
  404. logger.GetLogger().Error("无对应实名认证记录信息, userId:", userInfo.Userid)
  405. return
  406. }
  407. // 调用爱签接口 - 上传待签署文件
  408. contractNo := strconv.Itoa(int(utils.GenID()))
  409. apiCreateContractReq := APICreateContractReq{
  410. ContractNo: contractNo,
  411. ContractName: templateName,
  412. SignOrder: 1,
  413. ValidityTime: 30,
  414. NotifyUrl: config.SerCfg.AsignCfg.NotifyUrl,
  415. }
  416. apiCreateContractReq.Templates = []APITemplate{
  417. {
  418. TemplateNo: templateIdent,
  419. },
  420. }
  421. apiCreateContractRsp, err := APICreateContract(apiCreateContractReq)
  422. if err != nil {
  423. return
  424. }
  425. if apiCreateContractRsp.Code != CODE_SUCCESS {
  426. err = errors.New(apiCreateContractRsp.Msg)
  427. return
  428. }
  429. // 将合同编号写入数据库
  430. sql := fmt.Sprintf(`
  431. UPDATE useresignrecord
  432. SET contractNo = '%v',
  433. UPDATETIME = SYSDATE
  434. WHERE RECORDID = %v
  435. `, contractNo, record.RECORDID)
  436. if _, err = db.GetEngine().Exec(sql); err != nil {
  437. logger.GetLogger().Error("更新合同编号失败, err:", err)
  438. err = errors.New("更新合同编号失败")
  439. return
  440. }
  441. // 添加签署方 - 甲方 - 交易所
  442. appAddSignerReq1 := APIAddSignerReq{
  443. ContractNo: contractNo,
  444. Account: "ZR_LEGAL",
  445. SignType: 2, // 无感知签约(需要开通权限)
  446. SignStrategyList: []APISignStrategy{
  447. {AttachNo: 1, LocationMode: 4, SignKey: "PARTYA_SIGNATURE", SignType: 1}, // 甲方签章
  448. {AttachNo: 1, LocationMode: 4, SignKey: "PARTYA_DATE", SignType: 2}, // 甲方签署时间
  449. },
  450. }
  451. // 获取临时存储的用户认证信息
  452. cacheMap := make(map[string]interface{})
  453. if err = json.Unmarshal([]byte(recordAuth.AUTHINFO), &cacheMap); err != nil {
  454. logger.GetLogger().Error("反序列化临时存储用户信息失败, AUTHINFO:", recordAuth.AUTHINFO)
  455. return
  456. }
  457. if recordAuth.AUTHINFO == "" {
  458. err = errors.New("获取实名信息失败")
  459. logger.GetLogger().Error("获取实名信息失败")
  460. return
  461. }
  462. // 添加签署方 - 乙方 - 投资者
  463. appAddSignerReq2 := APIAddSignerReq{
  464. ContractNo: contractNo,
  465. Account: strconv.Itoa(int(record.USERID)),
  466. SignType: 3,
  467. ValidateType: 3,
  468. }
  469. // 签章策略
  470. signStrategyList := make([]APISignStrategy, 0)
  471. // 接收方模板填充策略
  472. receiverFillStrategyList := make([]APIReceiverFillStrategy, 0)
  473. if userInfo.Userinfotype == 1 { // 个人
  474. // 乙方签章
  475. signStrategyList = append(signStrategyList, APISignStrategy{AttachNo: 1, LocationMode: 4, SignKey: "P_PARTYB_SIGNATURE", SignType: 1})
  476. // 乙方签署时间
  477. signStrategyList = append(signStrategyList, APISignStrategy{AttachNo: 1, LocationMode: 4, SignKey: "P_PARTYB_DATE", SignType: 2})
  478. // 身份证号
  479. receiverFillStrategyList = append(receiverFillStrategyList, APIReceiverFillStrategy{AttachNo: 1, Key: "P_PARTYB_ID", Value: cacheMap["idCardNo"].(string)})
  480. // 联系方式
  481. receiverFillStrategyList = append(receiverFillStrategyList, APIReceiverFillStrategy{AttachNo: 1, Key: "P_PARTYB_MOBILE", Value: cacheMap["mobile"].(string)})
  482. } else { // 企业
  483. // 乙方签章
  484. signStrategyList = append(signStrategyList, APISignStrategy{AttachNo: 1, LocationMode: 4, SignKey: "E_PARTYB_SIGNATURE", SignType: 1})
  485. // 乙方签署时间
  486. signStrategyList = append(signStrategyList, APISignStrategy{AttachNo: 1, LocationMode: 4, SignKey: "E_PARTYB_DATE", SignType: 2})
  487. // 法定代表人名称
  488. receiverFillStrategyList = append(receiverFillStrategyList, APIReceiverFillStrategy{AttachNo: 1, Key: "E_PARTYB_LEGAL", Value: cacheMap["realName"].(string)})
  489. }
  490. appAddSignerReq2.SignStrategyList = signStrategyList
  491. appAddSignerReq2.ReceiverFillStrategyList = receiverFillStrategyList
  492. apiAddSignerRsp, err := APIAddSigner([]APIAddSignerReq{appAddSignerReq1, appAddSignerReq2})
  493. if err != nil {
  494. return
  495. }
  496. if apiAddSignerRsp.Code != CODE_SUCCESS {
  497. err = errors.New(apiAddSignerRsp.Msg)
  498. return
  499. }
  500. if len(apiAddSignerRsp.Data.SignUser) == 0 {
  501. err = errors.New("获取合同签署地址失败")
  502. logger.GetLogger().Error("获取合同签署地址失败")
  503. return
  504. }
  505. // 将返回的合同签署地址写入数据库
  506. sql = fmt.Sprintf(`
  507. UPDATE useresignrecord
  508. SET RECORDSTATUS = 2,
  509. SIGNURL = '%v',
  510. UPDATETIME = SYSDATE
  511. WHERE RECORDID = %v
  512. `, apiAddSignerRsp.Data.SignUser[0].SignUrl, record.RECORDID)
  513. if _, err = db.GetEngine().Exec(sql); err != nil {
  514. logger.GetLogger().Error("合同签署地址失败, err:", err)
  515. err = errors.New("合同签署地址失败")
  516. return
  517. }
  518. rsp = CreateContractRsp{SignUrl: apiAddSignerRsp.Data.SignUser[0].SignUrl}
  519. return
  520. }
  521. func ASignCompleted(contractNo, status string) (err error) {
  522. /*
  523. // 合同签署完成后回调通知示例
  524. String publickey = "MFwwDQcccccxxxxmEz/nw27Ln6AP90ZCMPi+iNF1m9mhNECAwEAAQ==";
  525. String remark = ""; // 若被拒签则会返回拒签原因,拒签原因不参与签名
  526. Map <String, String> map = new HashMap<>();
  527. map.put("action", "signCompleted");
  528. map.put("contractNo", "20221114142140345");
  529. map.put("status", "2");
  530. map.put("signTime", "2022-11-14 14:22:00");
  531. map.put("timestamp", "1668406920005");
  532. map.put("validityTime", "2022-11-24 23:59:59");
  533. String json = JSONObject.toJSONString(map, SerializerFeature.MapSortField);
  534. System.out.println("数据:" + json);
  535. // 计算签名
  536. try {
  537. String sign = "feFfcprGjdmDDqRmxK5qlWlMncX0mc6LJ5agebOGIx2QiAern+6ZRg/SBHOgvHp/+1ywVRdyKNUKxPneETwKPw==";
  538. System.out.println(RSAUtils.rsaSignCheck(sign, json, publickey));
  539. } catch (Exception e) {
  540. e.printStackTrace();
  541. }
  542. */
  543. // 获取合同编号
  544. if contractNo == "" {
  545. logger.GetLogger().Error("获取合同编号失败")
  546. err = errors.New("获取合同编号失败")
  547. return
  548. }
  549. // 获取合同状态
  550. if status == "" {
  551. logger.GetLogger().Error("获取获取合同状态失败")
  552. err = errors.New("获取获取合同状态失败")
  553. return
  554. }
  555. // 更新数据库记录
  556. sql := fmt.Sprintf(`
  557. UPDATE useresignrecord
  558. SET RECORDSTATUS = 3,
  559. UPDATETIME = SYSDATE
  560. WHERE CONTRACTNO = '%v'
  561. `, contractNo)
  562. _, err = db.GetEngine().Exec(sql)
  563. return
  564. }