220 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			220 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package service
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"fmt"
 | 
						|
	"io"
 | 
						|
	"net/http"
 | 
						|
	"net/url"
 | 
						|
	"strings"
 | 
						|
	"tydata-server/app/user/cmd/api/internal/config"
 | 
						|
	"tydata-server/pkg/lzkit/crypto"
 | 
						|
 | 
						|
	"github.com/tidwall/gjson"
 | 
						|
)
 | 
						|
 | 
						|
type VerificationService struct {
 | 
						|
	c                 config.Config
 | 
						|
	westDexService    *WestDexService
 | 
						|
	apiRequestService *ApiRequestService
 | 
						|
}
 | 
						|
 | 
						|
func NewVerificationService(c config.Config, westDexService *WestDexService, apiRequestService *ApiRequestService) *VerificationService {
 | 
						|
	return &VerificationService{
 | 
						|
		c:                 c,
 | 
						|
		westDexService:    westDexService,
 | 
						|
		apiRequestService: apiRequestService,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// 二要素
 | 
						|
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) TwoFactorVerificationWest(request TwoFactorVerificationRequest) (*VerificationResult, error) {
 | 
						|
 | 
						|
	params := map[string]interface{}{
 | 
						|
		"name":    request.Name,
 | 
						|
		"id_card": request.IDCard,
 | 
						|
	}
 | 
						|
	marshal, err := json.Marshal(params)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("二要素参数创建错误: %v", err)
 | 
						|
	}
 | 
						|
	resp, err := r.apiRequestService.ProcessLayoutIdcardRequest(marshal)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("请求失败: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	respStr := string(resp)
 | 
						|
	if respStr != "0" {
 | 
						|
		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
 | 
						|
}
 |