qnc-server-old/api/verify.go
2024-09-14 10:48:09 +08:00

360 lines
11 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package api
import (
"encoding/json"
"errors"
"fmt"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"log"
"net/http"
"qnc-server/db"
"qnc-server/model/model"
"qnc-server/model/request"
"qnc-server/model/response"
"qnc-server/service"
"qnc-server/utils"
)
type Verify struct {
}
var verifisService service.VerifyService
// 注册路由
func InitVerif(group *gin.RouterGroup) {
var c Verify
{
verifPrivateGroup := group.Group("verify")
verifPrivateGroup.Use(JWTAuth())
verifPrivateGroup.POST("phone", c.VerifyNamePhone)
verifPrivateGroup.GET("get_query", c.GetQueryRecord)
verifPrivateGroup.POST("card_no", c.VerifyNameCard)
verifPrivateGroup.POST("bank_card", c.VerifyBankCard)
verifPrivateGroup.POST("skill_cert", c.VerifySkillCert)
}
}
// 姓名手机二要素核验
func (verify *Verify) VerifyNamePhone(c *gin.Context) {
var reqBody request.VerifyNamePhoneReq
if err := c.ShouldBindJSON(&reqBody); err != nil {
response.FailWithMessage("Failed to read request body", c)
return
}
userid := utils.GetUserID(c)
// 查找是否有 未消费 已付费 的订单
order, err := orderService.QueryConsumedOrder(userid, "shoujiheyan")
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
// 为空就没有消费资格
response.OkNeedPay(c)
return
} else {
log.Printf("【手机号核验】查询订单错误:%s", err.Error())
response.FailWithMessage("服务器错误请稍后再试", c)
return
}
}
// 二要素核验
body := map[string]any{
"mobile": reqBody.Phone,
"name": reqBody.Name,
}
respStr, err := requestService.AliYunRequest(http.MethodPost, "http://yyseys.qianshutong.com/web/interface/yyseysyz", nil, body)
if err != nil {
log.Printf("【手机号核验】阿里响应错误: %s", err.Error())
notifyService.SendNotification("阿里响应错误请及时处理", "手机号核验", userid, order.ID)
response.FailRefund(c)
return
}
var verifyPhoneName = model.VerifyPhoneName{}
verifyPhoneName.Resp = respStr
verifyPhoneName.Code, _ = utils.EncryptCode(reqBody.Phone, "776d538f1265a814437d2e12ac10b45b85045bc208a1eb129ef301f4157aa82f")
verifyPhoneName.OrderID = order.ID
verifyPhoneName.UserID = userid
err = db.DB.Create(&verifyPhoneName).Error
if err != nil {
log.Printf("【手机号核验】记录失败:%v", err)
notifyService.SendNotification("【手机号核验】数据保存错误,请及时处理", "手机号核验", userid, order.ID)
response.FailRefund(c)
return
}
orderService.OrderConsumed(order)
response.OkWithData(gin.H{
"record_id": verifyPhoneName.OrderID,
}, c)
}
// 姓名身份证二要素核验
func (verify *Verify) VerifyNameCard(c *gin.Context) {
var reqBody request.VerifyNameCardReq
if err := c.ShouldBindJSON(&reqBody); err != nil {
response.FailWithMessage("Failed to read request body", c)
return
}
userid := utils.GetUserID(c)
// 查找是否有 未消费 已付费 的订单
order, err := orderService.QueryConsumedOrder(userid, "shenfenzhengheyan")
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
// 为空就没有消费资格
response.OkNeedPay(c)
return
} else {
log.Printf("【身份证核验】查询订单错误:%s", err.Error())
response.FailWithMessage("服务器错误请稍后再试", c)
return
}
}
// 二要素核验
body := map[string]any{
"idcard": reqBody.Card,
"name": reqBody.Name,
}
respStr, err := requestService.AliYunRequest(http.MethodPost, "https://kzidcardv1.market.alicloudapi.com/api-mall/api/id_card/check", nil, body)
if err != nil {
log.Printf("【身份证核验】阿里响应错误: %s", err.Error())
notifyService.SendNotification("阿里响应错误请及时处理", "身份证核验", userid, order.ID)
response.FailRefund(c)
return
}
var verifyCardName = model.VerifyCardName{}
verifyCardName.Resp = respStr
verifyCardName.OrderID = order.ID
verifyCardName.UserID = userid
err = db.DB.Create(&verifyCardName).Error
if err != nil {
log.Printf("【身份证核验】记录失败:%v", err)
notifyService.SendNotification("【身份证核验】数据保存错误,请及时处理", "身份证核验", userid, order.ID)
response.FailRefund(c)
return
}
orderService.OrderConsumed(order)
response.OkWithData(gin.H{
"record_id": verifyCardName.OrderID,
}, c)
}
// 银行卡黑名单
func (verify *Verify) VerifyBankCard(c *gin.Context) {
var reqBody request.VerifyBankCardReq
if err := c.ShouldBindJSON(&reqBody); err != nil {
response.FailWithMessage("Failed to read request body", c)
return
}
userid := utils.GetUserID(c)
// 查找是否有 未消费 已付费 的订单
order, err := orderService.QueryConsumedOrder(userid, "yinhangkaheimingdan")
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
// 为空就没有消费资格
response.OkNeedPay(c)
return
} else {
log.Printf("QueryConsumedOrder err:%s", err.Error())
response.FailWithMessage("服务器错误请稍后再试", c)
return
}
}
var verifModel model.VerifyBankCard
reqData := map[string]interface{}{
"cardNo": reqBody.CardNo,
"cardld": reqBody.CardID,
"mobile": reqBody.Phone,
"name": reqBody.Name,
}
plainText, err := verifisService.VerifReqYuShan("FIN019", &reqData)
if err != nil {
log.Printf("【羽山接口请求错误】 %s error %s", "FIN019", err.Error())
notifyService.SendNotification("羽山接口请求错误,请及时处理", "银行卡黑名单查询V1", userid, order.ID)
response.FailRefund(c)
return
}
_, err = verifisService.VerifyDataAnalysis(string(plainText))
if err != nil {
if errors.Is(err, utils.ErrNoRecord) {
notifyService.SendNotification("用户查询数据为空,请及时处理", "银行卡黑名单查询V1", userid, order.ID)
} else {
notifyService.SendNotification("接口系统响应错误,请及时处理", "银行卡黑名单查询V1", userid, order.ID)
}
response.FailRefund(c)
return
}
verifModel.Resp = string(plainText)
verifModel.Code, _ = utils.EncryptCode(reqBody.Phone, "776d538f1265a814437d2e12ac10b45b85045bc208a1eb129ef301f4157aa82f")
verifModel.UserID = userid
err = db.DB.Create(&verifModel).Error
if err != nil {
log.Printf("银行卡黑名单查询V1保存错误%v", err)
notifyService.SendNotification("银行卡黑名单查询V1保存错误请及时处理", "银行卡黑名单查询V1", userid, order.ID)
response.FailRefund(c)
return
}
orderService.OrderConsumed(order)
response.OkWithData(gin.H{
"record_id": verifModel.OrderID,
}, c)
}
// 技能资格证书查询 HRD004
func (verify *Verify) VerifySkillCert(c *gin.Context) {
var reqBody request.VerifyNameCardReq
if err := c.ShouldBindJSON(&reqBody); err != nil {
response.FailWithMessage("Failed to read request body", c)
return
}
// 二要素核验
twoElementsParams := map[string]any{
"name": reqBody.Name,
"idcard": reqBody.Card,
}
twoElementsRespStr, err := requestService.AliYunRequest(http.MethodPost, "https://kzidcardv1.market.alicloudapi.com/api-mall/api/id_card/check", nil, twoElementsParams)
var twoElementsResp response.TwoElementsResp
err = json.Unmarshal([]byte(twoElementsRespStr), &twoElementsResp)
if err != nil {
log.Printf("二要素解析错误:%v", err)
response.FailWithMessage("系统错误,请稍后再试", c)
return
}
if twoElementsResp.Success == false {
response.FailWithMessage("请输入有效的身份证号码", c)
return
}
if twoElementsResp.Data.Result == 1 {
response.FailWithMessage("姓名与身份证不一致", c)
return
}
userid := utils.GetUserID(c)
// 查找是否有 未消费 已付费 的订单
order, err := orderService.QueryConsumedOrder(userid, "jinengzigezhengshu")
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
// 为空就没有消费资格
response.OkNeedPay(c)
return
} else {
log.Printf("QueryConsumedOrder err:%s", err.Error())
response.FailWithMessage("服务器错误请稍后再试", c)
return
}
}
var verifModel model.VerifySkillCert
reqData := map[string]interface{}{
"cardNo": reqBody.Card,
"name": reqBody.Name,
}
plainText, err := verifisService.VerifReqYuShan("HRD004", &reqData)
if err != nil {
log.Printf("【羽山接口请求错误】 %s error %s", "HRD004", err.Error())
var isNoRecord = "羽山接口请求错误"
if order.PaymentMethod == model.PaymentMethod_ALIPAY {
err := orderService.AliRefund(ctx, order)
if err != nil {
notifyService.SendNotification(fmt.Sprintf("【支付宝】%s自动退款失败", isNoRecord), "技能资格证书查询", userid, order.ID)
} else {
notifyService.SendNotification("【支付宝】自动退款成功", order.Product.ProductName, order.Userid, order.ID)
}
} else {
err := orderService.WeChatRefund(order)
if err != nil {
notifyService.SendNotification(fmt.Sprintf("%s自动退款失败", isNoRecord), "技能资格证书查询", userid, order.ID)
}
}
response.FailRefund(c)
return
}
_, err = verifisService.VerifyCertDataAnalysis(string(plainText))
if err != nil {
var isNoRecord string
if errors.Is(err, utils.ErrNoRecord) {
isNoRecord = "用户查询为空"
} else {
isNoRecord = "接口系统错误"
}
if order.PaymentMethod == model.PaymentMethod_ALIPAY {
err := orderService.AliRefund(ctx, order)
if err != nil {
notifyService.SendNotification(fmt.Sprintf("【支付宝】%s自动退款失败", isNoRecord), "技能资格证书查询", userid, order.ID)
} else {
notifyService.SendNotification("【支付宝】自动退款成功", order.Product.ProductName, order.Userid, order.ID)
}
} else {
err := orderService.WeChatRefund(order)
if err != nil {
notifyService.SendNotification(fmt.Sprintf("%s自动退款失败", isNoRecord), "技能资格证书查询", userid, order.ID)
}
}
response.FailRefund(c)
return
}
verifModel.Resp = string(plainText)
verifModel.UserID = userid
err = db.DB.Create(&verifModel).Error
if err != nil {
log.Printf("技能资格证书查询保存错误:%v", err)
notifyService.SendNotification("技能资格证书查询保存错误,请及时处理", "技能资格证书查询", userid, order.ID)
response.FailRefund(c)
return
}
orderService.OrderConsumed(order)
response.OkWithData(gin.H{
"record_id": verifModel.OrderID,
}, c)
}
func (verify *Verify) GetQueryRecord(c *gin.Context) {
var req request.GetQueryRecordReq
if err := c.ShouldBindQuery(&req); err != nil {
response.FailWithMessage("Failed to read request", c)
return
}
userid := utils.GetUserID(c)
var record interface{}
var err error
if req.IsCase {
record, err = verifisService.GetRecordCaseByFeature(req.Feature)
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
log.Printf("无相关示例记录:%v", err)
response.FailWithMessage("无相关示例记录", c)
return
} else {
log.Printf("查询示例记录错误:%v", err)
response.FailWithMessage(err.Error(), c)
return
}
}
} else {
record, err = verifisService.GetRecordByFeature(req.Feature, req.ID, userid)
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
log.Printf("无相关记录:%v", err)
response.FailWithMessage("无相关记录", c)
return
} else {
log.Printf("查询记录错误:%v", err)
response.FailWithMessage(err.Error(), c)
return
}
}
}
response.OkWithData(record, c)
}