179 lines
5.1 KiB
Go
179 lines
5.1 KiB
Go
package cloudauth
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
|
||
cloudauth "github.com/alibabacloud-go/cloudauth-20190307/v4/client"
|
||
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
|
||
util "github.com/alibabacloud-go/tea-utils/v2/service"
|
||
|
||
"github.com/alibabacloud-go/tea/tea"
|
||
"github.com/aliyun/credentials-go/credentials"
|
||
"github.com/zeromicro/go-zero/core/logx"
|
||
)
|
||
|
||
type CloudAuthClient struct {
|
||
Client *cloudauth.Client
|
||
Config *CloudAuthConfig
|
||
}
|
||
|
||
type CloudAuthConfig struct {
|
||
AccessKeyId string
|
||
AccessKeySecret string
|
||
Endpoint string
|
||
SceneId int64
|
||
ReturnUrl string
|
||
}
|
||
type InitFaceVerifyResp struct {
|
||
CertifyId string
|
||
CertifyUrl string
|
||
}
|
||
type DescribeFaceVerifyResp struct {
|
||
Passed bool
|
||
}
|
||
|
||
// InitFaceVerifyRequest 封装初始化人脸认证所需参数
|
||
type InitFaceVerifyParam struct {
|
||
OuterOrderNo string
|
||
CertName string
|
||
CertNo string
|
||
MetaInfo string
|
||
}
|
||
|
||
// NewCloudAuthClient 创建阿里云人脸认证客户端
|
||
func NewCloudAuthClient(cloudAuthconfig CloudAuthConfig) (*CloudAuthClient, error) {
|
||
// 使用AK 初始化Credentials Client。
|
||
credentialsConfig := new(credentials.Config).
|
||
// 凭证类型。
|
||
SetType("access_key").
|
||
// 设置为AccessKey ID值。
|
||
SetAccessKeyId(cloudAuthconfig.AccessKeyId).
|
||
// 设置为AccessKey Secret值。
|
||
SetAccessKeySecret(cloudAuthconfig.AccessKeySecret)
|
||
credentialClient, _err := credentials.NewCredential(credentialsConfig)
|
||
if _err != nil {
|
||
panic(_err)
|
||
}
|
||
|
||
ecsConfig := &openapi.Config{}
|
||
// 配置云产品服务接入地址(endpoint)。
|
||
ecsConfig.Endpoint = tea.String(cloudAuthconfig.Endpoint)
|
||
// 使用Credentials配置凭证。
|
||
ecsConfig.Credential = credentialClient
|
||
|
||
// 创建客户端
|
||
client, err := cloudauth.NewClient(ecsConfig)
|
||
if err != nil {
|
||
panic(fmt.Sprintf("创建阿里云人脸认证客户端失败: %v", err))
|
||
}
|
||
|
||
return &CloudAuthClient{
|
||
Client: client,
|
||
Config: &CloudAuthConfig{
|
||
AccessKeyId: cloudAuthconfig.AccessKeyId,
|
||
AccessKeySecret: cloudAuthconfig.AccessKeySecret,
|
||
Endpoint: cloudAuthconfig.Endpoint,
|
||
SceneId: cloudAuthconfig.SceneId,
|
||
ReturnUrl: cloudAuthconfig.ReturnUrl,
|
||
},
|
||
}, nil
|
||
}
|
||
|
||
// InitFaceVerify 初始化人脸认证
|
||
func (c *CloudAuthClient) InitFaceVerify(param InitFaceVerifyParam) (*InitFaceVerifyResp, error) {
|
||
request := &cloudauth.InitFaceVerifyRequest{
|
||
SceneId: tea.Int64(c.Config.SceneId),
|
||
OuterOrderNo: tea.String(param.OuterOrderNo),
|
||
ProductCode: tea.String("ID_PRO"),
|
||
Model: tea.String("LIVENESS"),
|
||
CertType: tea.String("IDENTITY_CARD"),
|
||
CertName: tea.String(param.CertName),
|
||
CertNo: tea.String(param.CertNo),
|
||
MetaInfo: tea.String(param.MetaInfo),
|
||
ReturnUrl: tea.String(c.Config.ReturnUrl),
|
||
}
|
||
|
||
runtime := &util.RuntimeOptions{
|
||
ReadTimeout: tea.Int(10000),
|
||
ConnectTimeout: tea.Int(5000),
|
||
}
|
||
|
||
response, err := c.Client.InitFaceVerifyWithOptions(request, runtime)
|
||
if err != nil {
|
||
if sdkErr, ok := err.(*tea.SDKError); ok {
|
||
logx.Errorf("认证初始化失败: %s, 建议: %s",
|
||
tea.StringValue(sdkErr.Message),
|
||
getRecommendFromError(sdkErr))
|
||
return nil, fmt.Errorf("认证初始化失败: %s", tea.StringValue(sdkErr.Message))
|
||
}
|
||
logx.Errorf("认证初始化失败: %v", err)
|
||
return nil, fmt.Errorf("认证初始化失败: %v", err)
|
||
}
|
||
|
||
if tea.StringValue(response.Body.Code) != "200" {
|
||
logx.Errorf("认证初始化失败: %s", tea.StringValue(response.Body.Message))
|
||
return nil, fmt.Errorf("认证初始化失败: %s", tea.StringValue(response.Body.Message))
|
||
}
|
||
|
||
return &InitFaceVerifyResp{
|
||
CertifyId: tea.StringValue(response.Body.ResultObject.CertifyId),
|
||
CertifyUrl: tea.StringValue(response.Body.ResultObject.CertifyUrl),
|
||
}, nil
|
||
}
|
||
|
||
// DescribeFaceVerify 获取认证结果
|
||
func (c *CloudAuthClient) DescribeFaceVerify(certifyId string) (*DescribeFaceVerifyResp, error) {
|
||
request := &cloudauth.DescribeFaceVerifyRequest{
|
||
SceneId: tea.Int64(c.Config.SceneId),
|
||
CertifyId: tea.String(certifyId),
|
||
}
|
||
|
||
runtime := &util.RuntimeOptions{
|
||
ReadTimeout: tea.Int(10000),
|
||
ConnectTimeout: tea.Int(5000),
|
||
}
|
||
response, err := c.Client.DescribeFaceVerifyWithOptions(request, runtime)
|
||
if err != nil {
|
||
logx.Errorf("获取认证结果失败: %v", err)
|
||
return nil, fmt.Errorf("获取认证结果失败: %v", err)
|
||
}
|
||
|
||
if tea.StringValue(response.Body.Code) != "200" {
|
||
logx.Errorf("获取认证结果失败: %s", tea.StringValue(response.Body.Message))
|
||
return nil, fmt.Errorf("获取认证结果失败: %s", tea.StringValue(response.Body.Message))
|
||
}
|
||
var passed bool
|
||
var passedStr = tea.StringValue(response.Body.ResultObject.Passed)
|
||
|
||
switch passedStr {
|
||
case "T":
|
||
passed = true
|
||
case "F":
|
||
passed = false
|
||
default:
|
||
passed = false
|
||
}
|
||
return &DescribeFaceVerifyResp{
|
||
Passed: passed,
|
||
}, nil
|
||
}
|
||
|
||
// 从SDK错误中获取推荐信息
|
||
func getRecommendFromError(err *tea.SDKError) string {
|
||
if err == nil || err.Data == nil {
|
||
return ""
|
||
}
|
||
|
||
var data map[string]interface{}
|
||
if err := json.Unmarshal([]byte(tea.StringValue(err.Data)), &data); err != nil {
|
||
return ""
|
||
}
|
||
|
||
if recommend, ok := data["Recommend"].(string); ok {
|
||
return recommend
|
||
}
|
||
|
||
return ""
|
||
}
|