package tencentcloud import ( "encoding/json" "errors" "fmt" "mtp2_if/db" "mtp2_if/logger" "mtp2_if/models" "mtp2_if/utils" "strings" reqModels "mtp2_if/services/asign" faceid "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/faceid/v20180301" "github.com/xormplus/builder" ) type BankCard4Rsp struct { Code string `json:"code"` // 结果码 '0': '认证通过'; 非'0'表示认证失败 Description string `json:"description"` // 业务结果描述。 } func BankCard4EVerification(req reqModels.BankCard4Req) (rsp BankCard4Rsp, err error) { if utils.TencenCloudFaceIdClient == nil { err = fmt.Errorf("腾讯云FaceId客户端未初始化") logger.GetLogger().Errorf("CreateConsoleLoginUrl failed: %s", err.Error()) return } // 校验入参 if req.Type == 1 && req.Person == nil { err = errors.New("缺少参数") return } if req.Type == 2 && req.Company == nil { err = errors.New("缺少参数") return } // 从交易库中获取类型为实名认证的电子签信息 var authinfo []byte var record models.Useresignrecord var has bool has, err = db.GetEngine().Where("TEMPLATETYPE = 5 AND USERID = ?", req.UserId).Get(&record) if err != nil { return } if !has { err = errors.New("无对应实名认证记录信息") logger.GetLogger().Error("无对应实名认证记录信息, userId:", req.UserId) return } if record.RECORDSTATUS == 3 { // 原信息已实名,则判断两次提交的内容是否一致,如不一致则重新实名 if record.AUTHINFO == "" { err = errors.New("实名认证记录信息异常") logger.GetLogger().Error("实名认证记录信息异常, userId:", req.UserId) return } if req.Type == 1 { // 个人 var oriAuthInfo reqModels.PersonBankCard4 err = json.Unmarshal([]byte(record.AUTHINFO), &oriAuthInfo) if err != nil { return } if oriAuthInfo.RealName == req.Person.RealName && oriAuthInfo.IdCardNo == req.Person.IdCardNo && oriAuthInfo.BankCard == req.Person.BankCard && oriAuthInfo.Mobile == req.Person.Mobile { // 信息一致,则直接返回已实名 err = errors.New("账户已实名") logger.GetLogger().Error("账户已实名, userId:", req.UserId) return } else { // 信息不一致,重新进行实名认证 if authinfo, err = json.Marshal(req.Person); err != nil { return } sql := fmt.Sprintf(` UPDATE useresignrecord SET RECORDSTATUS = 1, UPDATETIME = SYSDATE, AUTHINFO = '%v' WHERE USERID = %v AND TEMPLATETYPE = 5 `, string(authinfo), req.UserId) _, err = db.GetEngine().Exec(sql) if err != nil { return } } } else { // 企业 var oriAuthInfo reqModels.CompanyBankCard4 err = json.Unmarshal([]byte(record.AUTHINFO), &oriAuthInfo) if err != nil { return } if oriAuthInfo.CompanyName == req.Company.CompanyName && oriAuthInfo.CreditCode == req.Company.CreditCode && oriAuthInfo.RealName == req.Company.RealName && oriAuthInfo.IdCardNo == req.Company.IdCardNo && oriAuthInfo.BankCard == req.Company.BankCard && oriAuthInfo.Mobile == req.Company.Mobile { // 信息一致,则直接返回已实名 err = errors.New("账户已实名") logger.GetLogger().Error("账户已实名, userId:", req.UserId) return } else { // 信息不一致,重新进行实名认证 if authinfo, err = json.Marshal(req.Company); err != nil { return } sql := fmt.Sprintf(` UPDATE useresignrecord SET RECORDSTATUS = 1, UPDATETIME = SYSDATE, AUTHINFO = '%v' WHERE USERID = %v AND TEMPLATETYPE = 5 `, string(authinfo), req.UserId) _, err = db.GetEngine().Exec(sql) if err != nil { return } } } } // 目前腾讯云不支持企业实名认识,如果类型为企业则直接返回认证成功 if req.Type == 2 { // 企业 sql := fmt.Sprintf(` UPDATE useresignrecord SET RECORDSTATUS = 3, UPDATETIME = SYSDATE WHERE USERID = %v AND TEMPLATETYPE = 5 `, req.UserId) _, err = db.GetEngine().Exec(sql) if err == nil { rsp = BankCard4Rsp{Code: "0", Description: "认证通过"} } } else { // 个人 // 调用腾讯云接口 // request := &v20180301.BankCard4EVerificationRequest{ // Name: &req.Person.RealName, // BankCard: &req.Person.BankCard, // Phone: &req.Person.Mobile, // IdCard: &req.Person.IdCardNo, // } request := faceid.NewBankCard4EVerificationRequest() request.Name = &req.Person.RealName request.BankCard = &req.Person.BankCard request.Phone = &req.Person.Mobile request.IdCard = &req.Person.IdCardNo var response *faceid.BankCard4EVerificationResponse response, err = utils.TencenCloudFaceIdClient.BankCard4EVerification(request) if err != nil { logger.GetLogger().Error("调用腾讯云实名认证接口发生错误:", err.Error()) return } if response.Response.Result == nil { err = errors.New("返回结果为空") logger.GetLogger().Error("调用腾讯云实名认证接口发生错误:", err.Error()) return } // 记录流水 feeFlag := 2 // 是否计费 // - 收费结果码: // '0': '认证通过'。 // '-1': '认证未通过'。 // '-6': '持卡人信息有误'。 // '-7': '未开通无卡支付'。 // '-8': '此卡被没收'。 // '-9': '无效卡号'。 // '-10': '此卡无对应发卡行'。 // '-11': '该卡未初始化或睡眠卡'。 // '-12': '作弊卡、吞卡'。 // '-13': '此卡已挂失'。 // '-14': '该卡已过期'。 // '-15': '受限制的卡'。 // '-16': '密码错误次数超限'。 // '-17': '发卡行不支持此交易'。 // - 不收费结果码: // '-2': '姓名校验不通过'。 // '-3': '身份证号码有误'。 // '-4': '银行卡号码有误'。 // '-5': '手机号码不合法'。 // '-18': '验证中心服务繁忙'。 // '-19': '验证次数超限,请次日重试'。 // '-20': '该证件号暂不支持核验,当前仅支持二代身份证'。 switch *response.Response.Result { case "0", "-1", "-6", "-7", "-8", "-9", "-10", "-11", "-12", "-13", "-14", "-15", "-16", "-17": feeFlag = 1 } var sql string sql, _ = builder.Insert( builder.Eq{ "LOGID": "SEQ_USERESIGNRECORDLOG.nextval", "RECORDID": record.RECORDID, "USERID": record.USERID, "TEMPLATECONFIGID": record.TEMPLATECONFIGID, "TEMPLATETYPE": record.TEMPLATETYPE, "REQSTATUS": 2, "FEEFLAG": feeFlag, "REQCOMMENT": response.ToJsonString(), "CREATETIME": "SYSDATE", }, ).Into("USERESIGNRECORDLOG").ToBoundSQL() sql = strings.ReplaceAll(sql, "'SEQ_USERESIGNRECORDLOG.nextval'", "SEQ_USERESIGNRECORDLOG.nextval") sql = strings.ReplaceAll(sql, "'SYSDATE'", "SYSDATE") db.GetEngine().Exec(sql) if *response.Response.Result != "0" { err = errors.New("返回结果失败,错误码(" + *response.Response.Result + "),返回信息(" + response.ToJsonString() + ")") logger.GetLogger().Error("调用腾讯云实名认证接口返回结果不成功:", err.Error()) return } // 返回结果结果,更新记录状态 sql = fmt.Sprintf(` UPDATE useresignrecord SET RECORDSTATUS = 3, UPDATETIME = SYSDATE WHERE USERID = %v AND TEMPLATETYPE = 5 `, req.UserId) _, err = db.GetEngine().Exec(sql) if err == nil { rsp = BankCard4Rsp{Code: "0", Description: "认证通过"} } } return }