新增实名认证,新增检测子级

This commit is contained in:
2023-07-20 15:57:59 +08:00
parent f4e1ab3c4f
commit 28afabd449
10 changed files with 162 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
package verifyDun
+32
View File
@@ -0,0 +1,32 @@
package verifyDun
import (
"crypto/md5"
"encoding/hex"
"net/url"
"sort"
)
const (
apiUrl = "https://verify.dun.163.com" // 本机认证服务身份证实人认证在线检测接口地址
version = "v1"
secretId = "0bcf9a5633eb9ca9d196583e67c3762b" // 产品密钥ID,产品标识
secretKey = "b31e8220d115b6531a22ee71d1e89936" // 产品私有密钥,服务端生成签名信息使用,请严格保管,避免泄露
)
// GenSignature 生成签名信息
func GenSignature(params url.Values) string {
var paramStr string
keys := make([]string, 0, len(params))
for k := range params {
keys = append(keys, k)
}
sort.Strings(keys)
for _, key := range keys {
paramStr += key + params[key][0]
}
paramStr += secretKey
md5Reader := md5.New()
md5Reader.Write([]byte(paramStr))
return hex.EncodeToString(md5Reader.Sum(nil))
}
+82
View File
@@ -0,0 +1,82 @@
package verifyDun
import (
"encoding/json"
"errors"
"io"
"net/http"
"net/url"
"strconv"
"strings"
"time"
)
// 请求返回值
type responseData struct {
Code int `json:"code"` // 接口调用状态。200:正常;其它值:调用出错
Msg string `json:"msg"` // 结果说明。如果接口调用出错,那么返回错误描述。成功则返回 ok
Result result `json:"result"` // 接口返回结果,各个接口自定义,数据结构参考具体文档说明
}
type result 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 responseData
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
}