servcies.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  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["bankaccount"] = cacheMap["bankCard"]
  196. reqParam["userinfotype"] = 1 // 1 - 个人
  197. } else {
  198. reqParam["userid"] = req.UserId
  199. reqParam["customername"] = cacheMap["companyName"]
  200. reqParam["cardtype"] = 21
  201. reqParam["cardfrontphotourl"] = cacheMap["idCardPhoto"]
  202. reqParam["legalpersonname"] = cacheMap["realName"]
  203. reqParam["cardnum"] = cacheMap["creditCode"]
  204. reqParam["mobilephone"] = cacheMap["mobile"]
  205. }
  206. jsonParam, err := json.Marshal(&reqParam)
  207. if err != nil {
  208. logger.GetLogger().Error("反序列化JAVA实名认证入参失败, reqParam:", reqParam)
  209. return
  210. }
  211. // 构建请求
  212. javaUrl := config.SerCfg.AsignCfg.OpenApiUrl + "/onlineopen/userInfo/addAuth"
  213. javaReq, err := http.NewRequest("POST", javaUrl, bytes.NewReader(jsonParam))
  214. // 设置请求头
  215. javaReq.Header.Set("Content-Type", "application/json; charset=utf-8")
  216. client := &http.Client{}
  217. rsp, err := client.Do(javaReq)
  218. if err != nil {
  219. logger.GetLogger().Error("JAVA实名认证请求失败, err:", err)
  220. return
  221. }
  222. defer rsp.Body.Close()
  223. body, err := io.ReadAll(rsp.Body)
  224. if err != nil {
  225. logger.GetLogger().Error("JAVA实名认证请求获取body失败, err:", err)
  226. return
  227. }
  228. // rspData: map[code:0 hasAuth:1 message:认证成功]
  229. rspData := make(map[string]interface{})
  230. if err = json.Unmarshal(body, &rspData); err != nil {
  231. logger.GetLogger().Error("JAVA实名认证请求反序列化body失败, err:", err)
  232. return
  233. }
  234. logger.GetLogger().Info("调用JAVA实名认证接口返回, rspData:", rspData)
  235. code, ok := rspData["code"]
  236. if !ok {
  237. err = errors.New("实名认证失败,请稍后重试")
  238. logger.GetLogger().Error(err.Error())
  239. return
  240. }
  241. if code != "0" {
  242. err = fmt.Errorf("实名认证失败,%v", rspData["message"])
  243. logger.GetLogger().Error(err.Error())
  244. return
  245. }
  246. // 更新用户电子签记录 - 更新实名认证状态
  247. sql := fmt.Sprintf(`
  248. UPDATE useresignrecord
  249. SET RECORDSTATUS = 3,
  250. UPDATETIME = SYSDATE
  251. WHERE USERID = %v AND TEMPLATETYPE = 1
  252. `, req.UserId)
  253. _, err = db.GetEngine().Exec(sql)
  254. return
  255. }
  256. // SyncContractStatus 同步合同状态
  257. func SyncContractStatus(req SyncContractStatusReq) (rsp SyncContractStatusRsp, err error) {
  258. // 从交易库中获取类型为实名认证的电子签信息
  259. var record models.Useresignrecord
  260. has, err := db.GetEngine().Where("RECORDID = ?", req.RecordId).Get(&record)
  261. if err != nil {
  262. return
  263. }
  264. if !has {
  265. err = errors.New("查无此记录信息")
  266. logger.GetLogger().Error("查无此记录信息, RecordId:", req.RecordId)
  267. return
  268. }
  269. if record.CONTRACTNO == "" {
  270. err = errors.New("此记录未生成合同编号")
  271. logger.GetLogger().Error("此记录未生成合同编号, RecordId:", req.RecordId)
  272. return
  273. }
  274. // 调用爱签接口 - 查询合同状态
  275. apiReq := APIContractStatusReq{ContractNo: record.CONTRACTNO}
  276. apiRsp, err := APIContractStatus(apiReq)
  277. if err != nil {
  278. return
  279. }
  280. if apiRsp.Code != CODE_SUCCESS {
  281. err = errors.New(apiRsp.Msg)
  282. return
  283. }
  284. status := record.RECORDSTATUS // 记录状态: 1:未签署 2:签署中 3:已签署 4:签署拒绝
  285. switch apiRsp.Data.Status { // 合同状态:0:等待签约 1:签约中 2:已签约 3:过期 4:拒签 6:作废 -2:状态异常
  286. case 0:
  287. status = 1
  288. case 1:
  289. status = 2
  290. case 2:
  291. status = 3
  292. case 4:
  293. status = 4
  294. }
  295. // 更新用户电子签记录 - 更新合同签署状态
  296. sql := fmt.Sprintf(`
  297. UPDATE useresignrecord
  298. SET RECORDSTATUS = %v,
  299. UPDATETIME = SYSDATE
  300. WHERE RECORDID = %v
  301. `, status, req.RecordId)
  302. _, err = db.GetEngine().Exec(sql)
  303. if err != nil {
  304. return
  305. }
  306. rsp = SyncContractStatusRsp{
  307. ContractNo: apiRsp.Data.ContractNo,
  308. ContractName: apiRsp.Data.ContractName,
  309. Status: apiRsp.Data.Status,
  310. }
  311. return
  312. }
  313. // PARTYA_SIGNATURE
  314. // PARTYA_DATE
  315. //
  316. // P_PARTYB_SIGNATURE
  317. // P_PARTYB_ID
  318. // P_PARTYB_MOBILE
  319. // P_PARTYB_DATE
  320. //
  321. // E_PARTYB_SIGNATURE
  322. // E_PARTYB_LEGAL
  323. // E_PARTYB_DATE
  324. // CreateContract 创建合同
  325. func CreateContract(req CreateContractReq) (rsp CreateContractRsp, err error) {
  326. // 获取电子签信息
  327. var record models.Useresignrecord
  328. has, err := db.GetEngine().Where("RECORDID = ?", req.RecordId).Get(&record)
  329. if err != nil {
  330. logger.GetLogger().Error("获取电子签信息失败, err", err)
  331. err = errors.New("获取电子签信息失败")
  332. return
  333. }
  334. if !has {
  335. err = errors.New("查无此记录信息")
  336. logger.GetLogger().Error("查无此记录信息, RecordId:", req.RecordId)
  337. return
  338. }
  339. if record.RECORDSTATUS != 1 {
  340. err = errors.New("记录信息状态异常")
  341. logger.GetLogger().Error("记录信息状态异常, RecordId:", req.RecordId, record.RECORDSTATUS)
  342. return
  343. }
  344. // // 获取电子签模板字段配置信息
  345. // fields := make([]models.Esigntemplatefield, 0)
  346. // if err = db.GetEngine().Where("TEMPLATECONFIGID = ?", record.TEMPLATECONFIGID).Find(&fields); err != nil {
  347. // logger.GetLogger().Error("获取电子签模板字段配置信息失败, err", err)
  348. // err = errors.New("获取电子签模板字段配置信息失败")
  349. // return
  350. // }
  351. // if len(fields) == 0 {
  352. // err = errors.New("获取电子签模板字段配置信息异常")
  353. // logger.GetLogger().Error("获取电子签模板字段配置信息异常, templateconfigid:", record.TEMPLATECONFIGID)
  354. // return
  355. // }
  356. // 调用爱签接口 - 查询模板列表
  357. apiReq := APITemplateListReq{Page: 1, Rows: 10}
  358. apiRsp, err := APITemplateList(apiReq)
  359. if err != nil {
  360. return
  361. }
  362. if apiRsp.Code != CODE_SUCCESS {
  363. err = errors.New(apiRsp.Msg)
  364. return
  365. }
  366. if len(apiRsp.Data.List) == 0 {
  367. err = errors.New("获取查询模板列表失败")
  368. logger.GetLogger().Error("获取查询模板列表失败")
  369. return
  370. }
  371. // 获取用户信息
  372. userInfo, err := models.GetUserInfo(int(record.USERID))
  373. if err != nil {
  374. logger.GetLogger().Error("获取用户信息失败, err:", err)
  375. err = errors.New("获取用户信息失败")
  376. return
  377. }
  378. templateName := record.TEMPLATENAME
  379. if userInfo.Userinfotype == 1 { // 个人
  380. templateName += "-个人"
  381. } else { // 企业
  382. templateName += "-企业"
  383. }
  384. // 获取模板信息
  385. templateIdent := ""
  386. for _, item := range apiRsp.Data.List {
  387. if item.TemplateName == templateName {
  388. templateIdent = item.TemplateIdent
  389. break
  390. }
  391. }
  392. if templateIdent == "" {
  393. err = errors.New("获取模板信息失败")
  394. logger.GetLogger().Error("获取模板信息失败")
  395. return
  396. }
  397. // 获取用户实名信息
  398. var recordAuth models.Useresignrecord
  399. has, err = db.GetEngine().Where("TEMPLATETYPE = 1 AND USERID = ?", userInfo.Userid).Get(&recordAuth)
  400. if err != nil {
  401. return
  402. }
  403. if !has {
  404. err = errors.New("无对应实名认证记录信息")
  405. logger.GetLogger().Error("无对应实名认证记录信息, userId:", userInfo.Userid)
  406. return
  407. }
  408. // 调用爱签接口 - 上传待签署文件
  409. contractNo := strconv.Itoa(int(utils.GenID()))
  410. apiCreateContractReq := APICreateContractReq{
  411. ContractNo: contractNo,
  412. ContractName: templateName,
  413. SignOrder: 1,
  414. ValidityTime: 30,
  415. NotifyUrl: config.SerCfg.AsignCfg.NotifyUrl,
  416. }
  417. apiCreateContractReq.Templates = []APITemplate{
  418. {
  419. TemplateNo: templateIdent,
  420. },
  421. }
  422. apiCreateContractRsp, err := APICreateContract(apiCreateContractReq)
  423. if err != nil {
  424. return
  425. }
  426. if apiCreateContractRsp.Code != CODE_SUCCESS {
  427. err = errors.New(apiCreateContractRsp.Msg)
  428. return
  429. }
  430. // 将合同编号写入数据库
  431. sql := fmt.Sprintf(`
  432. UPDATE useresignrecord
  433. SET contractNo = '%v',
  434. UPDATETIME = SYSDATE
  435. WHERE RECORDID = %v
  436. `, contractNo, record.RECORDID)
  437. if _, err = db.GetEngine().Exec(sql); err != nil {
  438. logger.GetLogger().Error("更新合同编号失败, err:", err)
  439. err = errors.New("更新合同编号失败")
  440. return
  441. }
  442. // 添加签署方 - 甲方 - 交易所
  443. appAddSignerReq1 := APIAddSignerReq{
  444. ContractNo: contractNo,
  445. Account: "ZR_LEGAL",
  446. SignType: 2, // 无感知签约(需要开通权限)
  447. SignStrategyList: []APISignStrategy{
  448. {AttachNo: 1, LocationMode: 4, SignKey: "PARTYA_SIGNATURE", SignType: 1}, // 甲方签章
  449. {AttachNo: 1, LocationMode: 4, SignKey: "PARTYA_DATE", SignType: 2}, // 甲方签署时间
  450. },
  451. }
  452. // 获取临时存储的用户认证信息
  453. cacheMap := make(map[string]interface{})
  454. if err = json.Unmarshal([]byte(recordAuth.AUTHINFO), &cacheMap); err != nil {
  455. logger.GetLogger().Error("反序列化临时存储用户信息失败, AUTHINFO:", recordAuth.AUTHINFO)
  456. return
  457. }
  458. if recordAuth.AUTHINFO == "" {
  459. err = errors.New("获取实名信息失败")
  460. logger.GetLogger().Error("获取实名信息失败")
  461. return
  462. }
  463. // 添加签署方 - 乙方 - 投资者
  464. appAddSignerReq2 := APIAddSignerReq{
  465. ContractNo: contractNo,
  466. Account: strconv.Itoa(int(record.USERID)),
  467. SignType: 3,
  468. ValidateType: 3,
  469. }
  470. // 签章策略
  471. signStrategyList := make([]APISignStrategy, 0)
  472. // 接收方模板填充策略
  473. receiverFillStrategyList := make([]APIReceiverFillStrategy, 0)
  474. if userInfo.Userinfotype == 1 { // 个人
  475. // 乙方签章
  476. signStrategyList = append(signStrategyList, APISignStrategy{AttachNo: 1, LocationMode: 4, SignKey: "P_PARTYB_SIGNATURE", SignType: 1})
  477. // 乙方签署时间
  478. signStrategyList = append(signStrategyList, APISignStrategy{AttachNo: 1, LocationMode: 4, SignKey: "P_PARTYB_DATE", SignType: 2})
  479. // 身份证号
  480. receiverFillStrategyList = append(receiverFillStrategyList, APIReceiverFillStrategy{AttachNo: 1, Key: "P_PARTYB_ID", Value: cacheMap["idCardNo"].(string)})
  481. // 联系方式
  482. receiverFillStrategyList = append(receiverFillStrategyList, APIReceiverFillStrategy{AttachNo: 1, Key: "P_PARTYB_MOBILE", Value: cacheMap["mobile"].(string)})
  483. } else { // 企业
  484. // 乙方签章
  485. signStrategyList = append(signStrategyList, APISignStrategy{AttachNo: 1, LocationMode: 4, SignKey: "E_PARTYB_SIGNATURE", SignType: 1})
  486. // 乙方签署时间
  487. signStrategyList = append(signStrategyList, APISignStrategy{AttachNo: 1, LocationMode: 4, SignKey: "E_PARTYB_DATE", SignType: 2})
  488. // 法定代表人名称
  489. receiverFillStrategyList = append(receiverFillStrategyList, APIReceiverFillStrategy{AttachNo: 1, Key: "E_PARTYB_LEGAL", Value: cacheMap["realName"].(string)})
  490. }
  491. appAddSignerReq2.SignStrategyList = signStrategyList
  492. appAddSignerReq2.ReceiverFillStrategyList = receiverFillStrategyList
  493. apiAddSignerRsp, err := APIAddSigner([]APIAddSignerReq{appAddSignerReq1, appAddSignerReq2})
  494. if err != nil {
  495. return
  496. }
  497. if apiAddSignerRsp.Code != CODE_SUCCESS {
  498. err = errors.New(apiAddSignerRsp.Msg)
  499. return
  500. }
  501. if len(apiAddSignerRsp.Data.SignUser) == 0 {
  502. err = errors.New("获取合同签署地址失败")
  503. logger.GetLogger().Error("获取合同签署地址失败")
  504. return
  505. }
  506. // 将返回的合同签署地址写入数据库
  507. sql = fmt.Sprintf(`
  508. UPDATE useresignrecord
  509. SET RECORDSTATUS = 2,
  510. SIGNURL = '%v',
  511. UPDATETIME = SYSDATE
  512. WHERE RECORDID = %v
  513. `, apiAddSignerRsp.Data.SignUser[0].SignUrl, record.RECORDID)
  514. if _, err = db.GetEngine().Exec(sql); err != nil {
  515. logger.GetLogger().Error("合同签署地址失败, err:", err)
  516. err = errors.New("合同签署地址失败")
  517. return
  518. }
  519. rsp = CreateContractRsp{SignUrl: apiAddSignerRsp.Data.SignUser[0].SignUrl}
  520. return
  521. }
  522. func ASignCompleted(contractNo, status string) (err error) {
  523. /*
  524. // 合同签署完成后回调通知示例
  525. String publickey = "MFwwDQcccccxxxxmEz/nw27Ln6AP90ZCMPi+iNF1m9mhNECAwEAAQ==";
  526. String remark = ""; // 若被拒签则会返回拒签原因,拒签原因不参与签名
  527. Map <String, String> map = new HashMap<>();
  528. map.put("action", "signCompleted");
  529. map.put("contractNo", "20221114142140345");
  530. map.put("status", "2");
  531. map.put("signTime", "2022-11-14 14:22:00");
  532. map.put("timestamp", "1668406920005");
  533. map.put("validityTime", "2022-11-24 23:59:59");
  534. String json = JSONObject.toJSONString(map, SerializerFeature.MapSortField);
  535. System.out.println("数据:" + json);
  536. // 计算签名
  537. try {
  538. String sign = "feFfcprGjdmDDqRmxK5qlWlMncX0mc6LJ5agebOGIx2QiAern+6ZRg/SBHOgvHp/+1ywVRdyKNUKxPneETwKPw==";
  539. System.out.println(RSAUtils.rsaSignCheck(sign, json, publickey));
  540. } catch (Exception e) {
  541. e.printStackTrace();
  542. }
  543. */
  544. // 获取合同编号
  545. if contractNo == "" {
  546. logger.GetLogger().Error("获取合同编号失败")
  547. err = errors.New("获取合同编号失败")
  548. return
  549. }
  550. // 获取合同状态
  551. if status == "" {
  552. logger.GetLogger().Error("获取获取合同状态失败")
  553. err = errors.New("获取获取合同状态失败")
  554. return
  555. }
  556. // 更新数据库记录
  557. sql := fmt.Sprintf(`
  558. UPDATE useresignrecord
  559. SET RECORDSTATUS = 3,
  560. UPDATETIME = SYSDATE
  561. WHERE CONTRACTNO = '%v'
  562. `, contractNo)
  563. _, err = db.GetEngine().Exec(sql)
  564. return
  565. }