161 lines
4.7 KiB
Go
161 lines
4.7 KiB
Go
|
package api
|
|||
|
|
|||
|
import (
|
|||
|
"encoding/json"
|
|||
|
"github.com/gin-gonic/gin"
|
|||
|
"log"
|
|||
|
"net/http"
|
|||
|
request2 "qnc-server/model/request"
|
|||
|
"qnc-server/model/response"
|
|||
|
"qnc-server/service"
|
|||
|
"strings"
|
|||
|
)
|
|||
|
|
|||
|
type Feature struct {
|
|||
|
}
|
|||
|
|
|||
|
var featureService service.Feature
|
|||
|
|
|||
|
// 注册路由
|
|||
|
func InitFeature(group *gin.RouterGroup) {
|
|||
|
var f Feature
|
|||
|
featruePrivate := group.Group("feature")
|
|||
|
featruePrivate.Use(JWTAuth())
|
|||
|
featruePrivate.POST("ocr_name", f.OcrName)
|
|||
|
featruePrivate.POST("verify_elements", f.VerifyElements)
|
|||
|
|
|||
|
}
|
|||
|
func (f *Feature) OcrName(c *gin.Context) {
|
|||
|
var request request2.FeatureOcrReq
|
|||
|
|
|||
|
// 绑定 JSON 请求体到 OcrRequest 结构体
|
|||
|
if err := c.ShouldBindJSON(&request); err != nil {
|
|||
|
response.Fail(c)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// 调用 OCRService
|
|||
|
ocrResult, err := featureService.OCRService(request.Base64)
|
|||
|
if err != nil {
|
|||
|
log.Printf("【OCR校验】请求错误:%v", err)
|
|||
|
response.FailWithMessage("系统错误,请稍后再试", c)
|
|||
|
return
|
|||
|
}
|
|||
|
// 尝试解析为错误响应
|
|||
|
var ocrError response.OcrErrorResponse
|
|||
|
json.Unmarshal([]byte(ocrResult), &ocrError)
|
|||
|
if ocrError.ErrorCode != 0 {
|
|||
|
// 如果解析成功,且存在 error_code,则返回错误信息
|
|||
|
response.FailWithMessage("检测签名错误,请重新签名", c)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// 尝试解析为成功响应
|
|||
|
var ocrSuccess response.OcrSuccessResponse
|
|||
|
err = json.Unmarshal([]byte(ocrResult), &ocrSuccess)
|
|||
|
if err != nil {
|
|||
|
// 如果解析失败,则返回解析错误
|
|||
|
response.FailWithMessage("系统错误错误,请稍后再试", c)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// 判断 words_result_num 是否等于 1
|
|||
|
if ocrSuccess.WordsResultNum != 1 {
|
|||
|
response.FailWithMessage("检测签名错误,请重新签名", c)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// 判断 OCR 结果的第一个 words 是否与 name 匹配
|
|||
|
if len(ocrSuccess.WordsResult) > 0 && strings.Contains(ocrSuccess.WordsResult[0].Words, request.Name) {
|
|||
|
response.Ok(c)
|
|||
|
} else {
|
|||
|
response.FailWithMessage("签名不匹配,请输入签入正确的姓名", c)
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
func (f *Feature) VerifyElements(c *gin.Context) {
|
|||
|
var reqBody request2.FeatureVerifyElementsReq
|
|||
|
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.CardNo,
|
|||
|
}
|
|||
|
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.Code != 200 {
|
|||
|
response.FailWithMessage(twoElementsResp.Msg, c)
|
|||
|
return
|
|||
|
}
|
|||
|
if twoElementsResp.Data.Result == 1 {
|
|||
|
response.FailWithMessage("姓名与身份证不一致", c)
|
|||
|
return
|
|||
|
}
|
|||
|
response.Ok(c)
|
|||
|
// 三要素
|
|||
|
//westName, err := utils.WestDexEncrypt(reqBody.Name, "121a1e41fc1690dd6b90afbcacd80cf4")
|
|||
|
//if err != nil {
|
|||
|
// log.Printf("西部加密错误:%v", err)
|
|||
|
// response.FailWithMessage("系统错误,请稍后再试", c)
|
|||
|
// return
|
|||
|
//}
|
|||
|
//westIDCard, err := utils.WestDexEncrypt(reqBody.CardNo, "121a1e41fc1690dd6b90afbcacd80cf4")
|
|||
|
//if err != nil {
|
|||
|
// log.Printf("西部加密错误:%v", err)
|
|||
|
// response.FailWithMessage("系统错误,请稍后再试", c)
|
|||
|
// return
|
|||
|
//}
|
|||
|
//westPhone, err := utils.WestDexEncrypt(reqBody.Mobile, "121a1e41fc1690dd6b90afbcacd80cf4")
|
|||
|
//if err != nil {
|
|||
|
// log.Printf("西部加密错误:%v", err)
|
|||
|
// response.FailWithMessage("系统错误,请稍后再试", c)
|
|||
|
// return
|
|||
|
//}
|
|||
|
//threeElementsReq := map[string]interface{}{
|
|||
|
// "name": westName,
|
|||
|
// "idNo": westIDCard,
|
|||
|
// "phone": westPhone,
|
|||
|
//}
|
|||
|
//
|
|||
|
//threeElements, err := requestService.WestDexRequest("G15BJ02", threeElementsReq)
|
|||
|
//var data response.Wrapper[response.ThreeElementsResponse]
|
|||
|
//err = json.Unmarshal([]byte(threeElements), &data)
|
|||
|
//if err != nil {
|
|||
|
// log.Printf("响应解析失败:%v", err)
|
|||
|
// response.FailWithMessage("系统错误,请稍后再试", c)
|
|||
|
// return
|
|||
|
//}
|
|||
|
//
|
|||
|
//switch data.Data.Code {
|
|||
|
//case "1000":
|
|||
|
//case "1003":
|
|||
|
// response.FailWithMessage("姓名、证件号均与手机号实名信息不一致", c)
|
|||
|
// return
|
|||
|
//case "1004":
|
|||
|
// response.FailWithMessage("姓名不正确", c)
|
|||
|
// return
|
|||
|
//case "1005":
|
|||
|
// response.FailWithMessage("证件号码不正确", c)
|
|||
|
// return
|
|||
|
//default:
|
|||
|
// log.Printf("三要素检测错误%v", data.Data.Msg)
|
|||
|
// response.FailWithMessage("服务器错误请稍后再试", c)
|
|||
|
// return
|
|||
|
//}
|
|||
|
}
|