api.go 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. package tencentcloud
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "mtp2_if/config"
  7. "mtp2_if/db"
  8. "mtp2_if/logger"
  9. "mtp2_if/models"
  10. "mtp2_if/utils"
  11. "strings"
  12. reqModels "mtp2_if/services/asign"
  13. faceid "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/faceid/v20180301"
  14. "github.com/xormplus/builder"
  15. )
  16. type BankCard4Rsp struct {
  17. Code string `json:"code"` // 结果码 '0': '认证通过'; 非'0'表示认证失败
  18. Description string `json:"description"` // 业务结果描述。
  19. }
  20. func BankCard4EVerification(req reqModels.BankCard4Req) (rsp BankCard4Rsp) {
  21. var err error
  22. var authinfo []byte
  23. if req.Type == 1 {
  24. if authinfo, err = json.Marshal(req.Person); err != nil {
  25. rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
  26. return
  27. }
  28. } else {
  29. if authinfo, err = json.Marshal(req.Company); err != nil {
  30. rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
  31. return
  32. }
  33. }
  34. if utils.TencenCloudFaceIdClient == nil {
  35. err = fmt.Errorf("腾讯云FaceId客户端未初始化")
  36. logger.GetLogger().Errorf("CreateConsoleLoginUrl failed: %s", err.Error())
  37. rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
  38. return
  39. }
  40. // 校验入参
  41. if req.Type == 1 && req.Person == nil {
  42. err = errors.New("缺少参数")
  43. rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
  44. return
  45. }
  46. if req.Type == 2 && req.Company == nil {
  47. err = errors.New("缺少参数")
  48. rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
  49. return
  50. }
  51. // 从交易库中获取类型为实名认证的电子签信息
  52. var record models.Useresignrecord
  53. var has bool
  54. has, err = db.GetEngine().Where("TEMPLATETYPE = 5 AND USERID = ?", req.UserId).Get(&record)
  55. if err != nil {
  56. rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
  57. return
  58. }
  59. if !has {
  60. // err = errors.New("无对应实名认证记录信息")
  61. // logger.GetLogger().Error("无对应实名认证记录信息, userId:", req.UserId)
  62. rsp = BankCard4Rsp{Code: "0", Description: "认证通过"}
  63. return
  64. }
  65. if record.RECORDSTATUS == 3 {
  66. // 原信息已实名,则判断两次提交的内容是否一致,如不一致则重新实名
  67. if record.AUTHINFO == "" {
  68. err = errors.New("实名认证记录信息异常")
  69. logger.GetLogger().Error("实名认证记录信息异常, userId:", req.UserId)
  70. rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
  71. return
  72. }
  73. if req.Type == 1 {
  74. // 个人
  75. var oriAuthInfo reqModels.PersonBankCard4
  76. err = json.Unmarshal([]byte(record.AUTHINFO), &oriAuthInfo)
  77. if err != nil {
  78. rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
  79. return
  80. }
  81. if oriAuthInfo.RealName == req.Person.RealName &&
  82. oriAuthInfo.IdCardNo == req.Person.IdCardNo &&
  83. oriAuthInfo.BankCard == req.Person.BankCard &&
  84. oriAuthInfo.Mobile == req.Person.Mobile {
  85. // 信息一致,则直接返回已实名
  86. // err = errors.New("账户已实名")
  87. // logger.GetLogger().Error("账户已实名, userId:", req.UserId)
  88. rsp = BankCard4Rsp{Code: "0", Description: "认证通过"}
  89. return
  90. } else {
  91. // 信息不一致,重新进行实名认证
  92. sql := fmt.Sprintf(`
  93. UPDATE useresignrecord
  94. SET RECORDSTATUS = 1,
  95. UPDATETIME = SYSDATE,
  96. AUTHINFO = '%v'
  97. WHERE USERID = %v AND TEMPLATETYPE = 5
  98. `, string(authinfo), req.UserId)
  99. _, err = db.GetEngine().Exec(sql)
  100. if err != nil {
  101. rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
  102. return
  103. }
  104. }
  105. } else {
  106. // 企业
  107. var oriAuthInfo reqModels.CompanyBankCard4
  108. err = json.Unmarshal([]byte(record.AUTHINFO), &oriAuthInfo)
  109. if err != nil {
  110. rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
  111. return
  112. }
  113. if oriAuthInfo.CompanyName == req.Company.CompanyName &&
  114. oriAuthInfo.CreditCode == req.Company.CreditCode &&
  115. oriAuthInfo.RealName == req.Company.RealName &&
  116. oriAuthInfo.IdCardNo == req.Company.IdCardNo &&
  117. oriAuthInfo.BankCard == req.Company.BankCard &&
  118. oriAuthInfo.Mobile == req.Company.Mobile {
  119. // 信息一致,则直接返回已实名
  120. // err = errors.New("账户已实名")
  121. // logger.GetLogger().Error("账户已实名, userId:", req.UserId)
  122. rsp = BankCard4Rsp{Code: "0", Description: "认证通过"}
  123. return
  124. } else {
  125. // 信息不一致,重新进行实名认证
  126. sql := fmt.Sprintf(`
  127. UPDATE useresignrecord
  128. SET RECORDSTATUS = 1,
  129. UPDATETIME = SYSDATE,
  130. AUTHINFO = '%v'
  131. WHERE USERID = %v AND TEMPLATETYPE = 5
  132. `, string(authinfo), req.UserId)
  133. _, err = db.GetEngine().Exec(sql)
  134. if err != nil {
  135. rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
  136. return
  137. }
  138. }
  139. }
  140. }
  141. // 目前腾讯云不支持企业实名认识,如果类型为企业则直接返回认证成功
  142. if req.Type == 2 {
  143. // 企业
  144. sql := fmt.Sprintf(`
  145. UPDATE useresignrecord
  146. SET RECORDSTATUS = 3,
  147. UPDATETIME = SYSDATE,
  148. AUTHINFO = '%v'
  149. WHERE USERID = %v AND TEMPLATETYPE = 5
  150. `, string(authinfo), req.UserId)
  151. _, err = db.GetEngine().Exec(sql)
  152. if err == nil {
  153. rsp = BankCard4Rsp{Code: "0", Description: "认证通过"}
  154. }
  155. } else {
  156. // 判断当日是否已经超过配额
  157. type FeeCount struct {
  158. FeeCount int `xorm:"FEECOUNT"`
  159. }
  160. feeCount := FeeCount{}
  161. sql := fmt.Sprintf(`select count(t.logid) FEECOUNT
  162. from USERESIGNRECORDLOG t
  163. where t.userid = %d and trunc(t.createtime) = trunc(sysdate) and t.feeflag = 1`, req.UserId)
  164. has, err = db.GetEngine().SQL(sql).Get(&feeCount)
  165. if err != nil {
  166. rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
  167. return
  168. }
  169. if has {
  170. if feeCount.FeeCount >= config.SerCfg.TencentCloudCfg.DailyQuota {
  171. rsp = BankCard4Rsp{Code: "3", Description: "次数超过每日配额"}
  172. return
  173. }
  174. }
  175. // 个人
  176. // 调用腾讯云接口
  177. // request := &v20180301.BankCard4EVerificationRequest{
  178. // Name: &req.Person.RealName,
  179. // BankCard: &req.Person.BankCard,
  180. // Phone: &req.Person.Mobile,
  181. // IdCard: &req.Person.IdCardNo,
  182. // }
  183. request := faceid.NewBankCard4EVerificationRequest()
  184. request.Name = &req.Person.RealName
  185. request.BankCard = &req.Person.BankCard
  186. request.Phone = &req.Person.Mobile
  187. request.IdCard = &req.Person.IdCardNo
  188. var response *faceid.BankCard4EVerificationResponse
  189. response, err = utils.TencenCloudFaceIdClient.BankCard4EVerification(request)
  190. if err != nil {
  191. logger.GetLogger().Error("调用腾讯云实名认证接口发生错误:", err.Error())
  192. rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
  193. return
  194. }
  195. if response.Response.Result == nil {
  196. err = errors.New("返回结果为空")
  197. logger.GetLogger().Error("调用腾讯云实名认证接口发生错误:", err.Error())
  198. rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
  199. return
  200. }
  201. // 记录流水
  202. feeFlag := 2 // 是否计费
  203. // - 收费结果码:
  204. // '0': '认证通过'。
  205. // '-1': '认证未通过'。
  206. // '-6': '持卡人信息有误'。
  207. // '-7': '未开通无卡支付'。
  208. // '-8': '此卡被没收'。
  209. // '-9': '无效卡号'。
  210. // '-10': '此卡无对应发卡行'。
  211. // '-11': '该卡未初始化或睡眠卡'。
  212. // '-12': '作弊卡、吞卡'。
  213. // '-13': '此卡已挂失'。
  214. // '-14': '该卡已过期'。
  215. // '-15': '受限制的卡'。
  216. // '-16': '密码错误次数超限'。
  217. // '-17': '发卡行不支持此交易'。
  218. // - 不收费结果码:
  219. // '-2': '姓名校验不通过'。
  220. // '-3': '身份证号码有误'。
  221. // '-4': '银行卡号码有误'。
  222. // '-5': '手机号码不合法'。
  223. // '-18': '验证中心服务繁忙'。
  224. // '-19': '验证次数超限,请次日重试'。
  225. // '-20': '该证件号暂不支持核验,当前仅支持二代身份证'。
  226. switch *response.Response.Result {
  227. case "0", "-1", "-6", "-7", "-8", "-9", "-10", "-11", "-12", "-13", "-14", "-15", "-16", "-17":
  228. feeFlag = 1
  229. }
  230. sql, _ = builder.Insert(
  231. builder.Eq{
  232. "LOGID": "SEQ_USERESIGNRECORDLOG.nextval",
  233. "RECORDID": record.RECORDID,
  234. "USERID": record.USERID,
  235. "TEMPLATECONFIGID": record.TEMPLATECONFIGID,
  236. "TEMPLATETYPE": record.TEMPLATETYPE,
  237. "REQSTATUS": 2,
  238. "FEEFLAG": feeFlag,
  239. "REQCOMMENT": response.ToJsonString(),
  240. "CREATETIME": "SYSDATE",
  241. },
  242. ).Into("USERESIGNRECORDLOG").ToBoundSQL()
  243. sql = strings.ReplaceAll(sql, "'SEQ_USERESIGNRECORDLOG.nextval'", "SEQ_USERESIGNRECORDLOG.nextval")
  244. sql = strings.ReplaceAll(sql, "'SYSDATE'", "SYSDATE")
  245. db.GetEngine().Exec(sql)
  246. if *response.Response.Result == "0" {
  247. // 返回结果结果,更新记录状态
  248. sql = fmt.Sprintf(`
  249. UPDATE useresignrecord
  250. SET RECORDSTATUS = 3,
  251. UPDATETIME = SYSDATE,
  252. AUTHINFO = '%v'
  253. WHERE USERID = %v AND TEMPLATETYPE = 5
  254. `, string(authinfo), req.UserId)
  255. _, err = db.GetEngine().Exec(sql)
  256. if err != nil {
  257. rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
  258. return
  259. }
  260. }
  261. rsp = BankCard4Rsp{Code: *response.Response.Result, Description: *response.Response.Description}
  262. }
  263. return
  264. }