package verifyDun import ( "encoding/json" "errors" "io" "net/http" "net/url" "strconv" "strings" "time" ) // 请求返回值 type idCardResponseData struct { Code int `json:"code"` // 接口调用状态。200:正常;其它值:调用出错 Msg string `json:"msg"` // 结果说明。如果接口调用出错,那么返回错误描述。成功则返回 ok Result idCardResult `json:"result"` // 接口返回结果,各个接口自定义,数据结构参考具体文档说明 } type idCardResult struct { Status int `json:"status"` // 认证结果,1-通过 2-不通过(原因见reasonType) 0-待定 ReasonType int `json:"reasonType"` // 原因详情 TaskId string `json:"taskId"` // 本次请求数据标识,可以根据该标识在控制台进行数据查询 IsPayed int `json:"isPayed"` // 本次请求是否收费标识,1代表收费,0代表不收费 } // CheckIdCard 实证认证 func CheckIdCard(name, cardNo string) (bool, error) { formData := url.Values{} formData.Set("name", name) formData.Set("cardNo", cardNo) formData.Set("secretId", secretId) formData.Set("businessId", "45a8fd254b4649e9bd25d773ac7ab666") formData.Set("version", "v1") formData.Set("timestamp", strconv.FormatInt(time.Now().UnixNano()/1000000, 10)) formData.Set("nonce", string(make([]byte, 32))) formData.Set("signature", GenSignature(formData)) resp, err := http.Post(apiUrl+"/"+version+"/idcard/check", "application/x-www-form-urlencoded", strings.NewReader(formData.Encode())) if err != nil { return false, errors.New("调用API接口失败:" + err.Error()) } defer func(Body io.ReadCloser) { _ = Body.Close() }(resp.Body) body, err := io.ReadAll(resp.Body) if err != nil { return false, err } var responseData idCardResponseData err = json.Unmarshal(body, &responseData) if err != nil { // json解析失败 return false, err } if responseData.Code != 200 { if responseData.Msg != "" { return false, errors.New(responseData.Msg) } else { return false, errors.New("身份证认证失败") } } if responseData.Result.Status == 2 { if responseData.Result.ReasonType == 2 { return false, errors.New("输入姓名和身份证号不一致") } else if responseData.Result.ReasonType == 3 { return false, errors.New("查无此身份证") } else if responseData.Result.ReasonType == 4 { return false, errors.New("身份证照片信息与输入信息不一致") } else { return false, errors.New("身份证认证失败") } } return true, nil }