api.go 7.4 KB

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