| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 |
- package tencentcloud
- import (
- "encoding/json"
- "errors"
- "fmt"
- "mtp2_if/config"
- "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) {
- var err error
- var authinfo []byte
- if req.Type == 1 {
- if authinfo, err = json.Marshal(req.Person); err != nil {
- rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
- return
- }
- } else {
- if authinfo, err = json.Marshal(req.Company); err != nil {
- rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
- return
- }
- }
- if utils.TencenCloudFaceIdClient == nil {
- err = fmt.Errorf("腾讯云FaceId客户端未初始化")
- logger.GetLogger().Errorf("CreateConsoleLoginUrl failed: %s", err.Error())
- rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
- return
- }
- // 校验入参
- if req.Type == 1 && req.Person == nil {
- err = errors.New("缺少参数")
- rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
- return
- }
- if req.Type == 2 && req.Company == nil {
- err = errors.New("缺少参数")
- rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
- return
- }
- // 从交易库中获取类型为实名认证的电子签信息
- var record models.Useresignrecord
- var has bool
- has, err = db.GetEngine().Where("TEMPLATETYPE = 5 AND USERID = ?", req.UserId).Get(&record)
- if err != nil {
- rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
- return
- }
- if !has {
- // err = errors.New("无对应实名认证记录信息")
- // logger.GetLogger().Error("无对应实名认证记录信息, userId:", req.UserId)
- rsp = BankCard4Rsp{Code: "0", Description: "认证通过"}
- return
- }
- if record.RECORDSTATUS == 3 {
- // 原信息已实名,则判断两次提交的内容是否一致,如不一致则重新实名
- if record.AUTHINFO == "" {
- err = errors.New("实名认证记录信息异常")
- logger.GetLogger().Error("实名认证记录信息异常, userId:", req.UserId)
- rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
- return
- }
- if req.Type == 1 {
- // 个人
- var oriAuthInfo reqModels.PersonBankCard4
- err = json.Unmarshal([]byte(record.AUTHINFO), &oriAuthInfo)
- if err != nil {
- rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
- 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)
- rsp = BankCard4Rsp{Code: "0", Description: "认证通过"}
- return
- } else {
- // 信息不一致,重新进行实名认证
- 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 {
- rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
- return
- }
- }
- } else {
- // 企业
- var oriAuthInfo reqModels.CompanyBankCard4
- err = json.Unmarshal([]byte(record.AUTHINFO), &oriAuthInfo)
- if err != nil {
- rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
- 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)
- rsp = BankCard4Rsp{Code: "0", Description: "认证通过"}
- return
- } else {
- // 信息不一致,重新进行实名认证
- 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 {
- rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
- return
- }
- }
- }
- }
- // 目前腾讯云不支持企业实名认识,如果类型为企业则直接返回认证成功
- if req.Type == 2 {
- // 企业
- sql := fmt.Sprintf(`
- UPDATE useresignrecord
- SET RECORDSTATUS = 3,
- UPDATETIME = SYSDATE,
- AUTHINFO = '%v'
- WHERE USERID = %v AND TEMPLATETYPE = 5
- `, string(authinfo), req.UserId)
- _, err = db.GetEngine().Exec(sql)
- if err == nil {
- rsp = BankCard4Rsp{Code: "0", Description: "认证通过"}
- }
- } else {
- // 判断当日是否已经超过配额
- type FeeCount struct {
- FeeCount int `xorm:"FEECOUNT"`
- }
- feeCount := FeeCount{}
- sql := fmt.Sprintf(`select count(t.logid) FEECOUNT
- from USERESIGNRECORDLOG t
- where t.userid = %d and trunc(t.createtime) = trunc(sysdate) and t.feeflag = 1`, req.UserId)
- has, err = db.GetEngine().SQL(sql).Get(&feeCount)
- if err != nil {
- rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
- return
- }
- if has {
- if feeCount.FeeCount >= config.SerCfg.TencentCloudCfg.DailyQuota {
- rsp = BankCard4Rsp{Code: "3", Description: "次数超过每日配额"}
- return
- }
- }
- // 个人
- // 调用腾讯云接口
- // 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())
- rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
- return
- }
- if response.Response.Result == nil {
- err = errors.New("返回结果为空")
- logger.GetLogger().Error("调用腾讯云实名认证接口发生错误:", err.Error())
- rsp = BankCard4Rsp{Code: "1", Description: 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
- }
- 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" {
- // 返回结果结果,更新记录状态
- sql = fmt.Sprintf(`
- UPDATE useresignrecord
- SET RECORDSTATUS = 3,
- UPDATETIME = SYSDATE,
- AUTHINFO = '%v'
- WHERE USERID = %v AND TEMPLATETYPE = 5
- `, string(authinfo), req.UserId)
- _, err = db.GetEngine().Exec(sql)
- if err != nil {
- rsp = BankCard4Rsp{Code: "1", Description: err.Error()}
- return
- }
- }
- rsp = BankCard4Rsp{Code: *response.Response.Result, Description: *response.Response.Description}
- }
- return
- }
|