first commit
This commit is contained in:
		
							
								
								
									
										189
									
								
								app/user/cmd/api/internal/service/verificationService.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										189
									
								
								app/user/cmd/api/internal/service/verificationService.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,189 @@
 | 
			
		||||
package service
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/tidwall/gjson"
 | 
			
		||||
	"io"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"tydata-server/app/user/cmd/api/internal/config"
 | 
			
		||||
	"tydata-server/pkg/lzkit/crypto"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type VerificationService struct {
 | 
			
		||||
	c              config.Config
 | 
			
		||||
	westDexService *WestDexService
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewVerificationService(c config.Config, westDexService *WestDexService) *VerificationService {
 | 
			
		||||
	return &VerificationService{
 | 
			
		||||
		c:              c,
 | 
			
		||||
		westDexService: westDexService,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 二要素
 | 
			
		||||
type TwoFactorVerificationRequest struct {
 | 
			
		||||
	Name   string
 | 
			
		||||
	IDCard string
 | 
			
		||||
}
 | 
			
		||||
type TwoFactorVerificationResp struct {
 | 
			
		||||
	Msg     string                     `json:"msg"`
 | 
			
		||||
	Success bool                       `json:"success"`
 | 
			
		||||
	Code    int                        `json:"code"`
 | 
			
		||||
	Data    *TwoFactorVerificationData `json:"data"` //
 | 
			
		||||
}
 | 
			
		||||
type TwoFactorVerificationData struct {
 | 
			
		||||
	Birthday string `json:"birthday"`
 | 
			
		||||
	Result   int    `json:"result"`
 | 
			
		||||
	Address  string `json:"address"`
 | 
			
		||||
	OrderNo  string `json:"orderNo"`
 | 
			
		||||
	Sex      string `json:"sex"`
 | 
			
		||||
	Desc     string `json:"desc"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 三要素
 | 
			
		||||
type ThreeFactorVerificationRequest struct {
 | 
			
		||||
	Name   string
 | 
			
		||||
	IDCard string
 | 
			
		||||
	Mobile string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// VerificationResult 定义校验结果结构体
 | 
			
		||||
type VerificationResult struct {
 | 
			
		||||
	Passed bool
 | 
			
		||||
	Err    error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ValidationError 定义校验错误类型
 | 
			
		||||
type ValidationError struct {
 | 
			
		||||
	Message string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *ValidationError) Error() string {
 | 
			
		||||
	return e.Message
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *VerificationService) TwoFactorVerification(request TwoFactorVerificationRequest) (*VerificationResult, error) {
 | 
			
		||||
	appCode := r.c.Ali.Code
 | 
			
		||||
	requestUrl := "https://kzidcardv1.market.alicloudapi.com/api-mall/api/id_card/check"
 | 
			
		||||
 | 
			
		||||
	// 构造查询参数
 | 
			
		||||
	data := url.Values{}
 | 
			
		||||
	data.Add("name", request.Name)
 | 
			
		||||
	data.Add("idcard", request.IDCard)
 | 
			
		||||
 | 
			
		||||
	req, err := http.NewRequest(http.MethodPost, requestUrl, strings.NewReader(data.Encode()))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("创建请求失败: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
	req.Header.Set("Authorization", "APPCODE "+appCode)
 | 
			
		||||
	req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
 | 
			
		||||
	client := &http.Client{}
 | 
			
		||||
	resp, err := client.Do(req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("请求失败: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	defer resp.Body.Close()
 | 
			
		||||
 | 
			
		||||
	if resp.StatusCode != http.StatusOK {
 | 
			
		||||
		return nil, fmt.Errorf("请求失败, 状态码: %d", resp.StatusCode)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	respBody, err := io.ReadAll(resp.Body)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("响应体读取失败:%v", err)
 | 
			
		||||
	}
 | 
			
		||||
	var twoFactorVerificationResp TwoFactorVerificationResp
 | 
			
		||||
	err = json.Unmarshal(respBody, &twoFactorVerificationResp)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("二要素解析错误: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !twoFactorVerificationResp.Success {
 | 
			
		||||
		return &VerificationResult{
 | 
			
		||||
			Passed: false,
 | 
			
		||||
			Err:    &ValidationError{Message: "请输入有效的身份证号码"},
 | 
			
		||||
		}, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if twoFactorVerificationResp.Code != 200 {
 | 
			
		||||
		return &VerificationResult{
 | 
			
		||||
			Passed: false,
 | 
			
		||||
			Err:    &ValidationError{Message: twoFactorVerificationResp.Msg},
 | 
			
		||||
		}, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if twoFactorVerificationResp.Data.Result == 1 {
 | 
			
		||||
		return &VerificationResult{
 | 
			
		||||
			Passed: false,
 | 
			
		||||
			Err:    &ValidationError{Message: "姓名与身份证不一致"},
 | 
			
		||||
		}, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &VerificationResult{Passed: true, Err: nil}, nil
 | 
			
		||||
}
 | 
			
		||||
func (r *VerificationService) ThreeFactorVerification(request ThreeFactorVerificationRequest) (*VerificationResult, error) {
 | 
			
		||||
	westName, err := crypto.WestDexEncrypt(request.Name, r.c.WestConfig.Key)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	westIDCard, err := crypto.WestDexEncrypt(request.IDCard, r.c.WestConfig.Key)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	westPhone, err := crypto.WestDexEncrypt(request.Mobile, r.c.WestConfig.Key)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	threeElementsReq := map[string]interface{}{
 | 
			
		||||
		"data": map[string]interface{}{
 | 
			
		||||
			"name":  westName,
 | 
			
		||||
			"idNo":  westIDCard,
 | 
			
		||||
			"phone": westPhone,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	resp, err := r.westDexService.CallAPI("G15BJ02", threeElementsReq)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	dataResult := gjson.GetBytes(resp, "data.code")
 | 
			
		||||
	if !dataResult.Exists() {
 | 
			
		||||
		return nil, fmt.Errorf("code 字段不存在")
 | 
			
		||||
	}
 | 
			
		||||
	code := dataResult.Int()
 | 
			
		||||
	switch code {
 | 
			
		||||
	case 1000:
 | 
			
		||||
	case 1002:
 | 
			
		||||
		return &VerificationResult{
 | 
			
		||||
			Passed: false,
 | 
			
		||||
			Err:    &ValidationError{Message: "姓名、证件号、手机号信息不一致"},
 | 
			
		||||
		}, nil
 | 
			
		||||
	case 1003:
 | 
			
		||||
		return &VerificationResult{
 | 
			
		||||
			Passed: false,
 | 
			
		||||
			Err:    &ValidationError{Message: "姓名、证件号、手机号信息不一致"},
 | 
			
		||||
		}, nil
 | 
			
		||||
	case 1004:
 | 
			
		||||
		return &VerificationResult{
 | 
			
		||||
			Passed: false,
 | 
			
		||||
			Err:    &ValidationError{Message: "姓名不正确"},
 | 
			
		||||
		}, nil
 | 
			
		||||
	case 1005:
 | 
			
		||||
		return &VerificationResult{
 | 
			
		||||
			Passed: false,
 | 
			
		||||
			Err:    &ValidationError{Message: "证件号码不正确"},
 | 
			
		||||
		}, nil
 | 
			
		||||
	default:
 | 
			
		||||
		dataResultMsg := gjson.GetBytes(resp, "data.msg")
 | 
			
		||||
		if !dataResultMsg.Exists() {
 | 
			
		||||
			return nil, fmt.Errorf("msg字段不存在")
 | 
			
		||||
		}
 | 
			
		||||
		return nil, fmt.Errorf("三要素核验错误状态响应: %s", dataResultMsg.String())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &VerificationResult{Passed: true, Err: nil}, nil
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user