Files
im_server/server/realname/aliyun/id2meta.go
T

113 lines
3.4 KiB
Go

package aliyun
import (
"errors"
"strconv"
"strings"
"time"
cloudauth "github.com/alibabacloud-go/cloudauth-20190307/v3/client"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/dara"
)
type Config struct {
AccessKeyID string
AccessKeySecret string
RegionID string
Endpoint string
TimeoutMS int
}
type ID2MetaResult struct {
Passed bool
BizCode string
RequestID string
ProviderCode string
ProviderMessage string
ProviderStatusCode int32
Latency time.Duration
}
type ID2MetaClient struct {
client *cloudauth.Client
timeoutMS int
}
func NewID2MetaClient(config Config) (*ID2MetaClient, error) {
if strings.TrimSpace(config.AccessKeyID) == "" || strings.TrimSpace(config.AccessKeySecret) == "" {
return nil, errors.New("missing aliyun realname credentials")
}
if strings.TrimSpace(config.RegionID) == "" {
config.RegionID = "cn-hangzhou"
}
clientConfig := &openapi.Config{
AccessKeyId: dara.String(strings.TrimSpace(config.AccessKeyID)),
AccessKeySecret: dara.String(strings.TrimSpace(config.AccessKeySecret)),
RegionId: dara.String(strings.TrimSpace(config.RegionID)),
Protocol: dara.String("https"),
}
if endpoint := strings.TrimSpace(config.Endpoint); endpoint != "" {
clientConfig.Endpoint = dara.String(endpoint)
}
client, err := cloudauth.NewClient(clientConfig)
if err != nil {
return nil, err
}
if config.TimeoutMS <= 0 {
config.TimeoutMS = 1500
}
return &ID2MetaClient{client: client, timeoutMS: config.TimeoutMS}, nil
}
func (c *ID2MetaClient) Verify(name, idNumber string) (*ID2MetaResult, error) {
if c == nil || c.client == nil {
return nil, errors.New("nil aliyun realname client")
}
name = strings.TrimSpace(name)
idNumber = strings.TrimSpace(idNumber)
if name == "" || idNumber == "" {
return nil, errors.New("missing realname identity fields")
}
started := time.Now()
resp, err := c.client.Id2MetaVerifyWithOptions(&cloudauth.Id2MetaVerifyRequest{
UserName: dara.String(name),
IdentifyNum: dara.String(idNumber),
ParamType: dara.String("normal"),
}, (&util.RuntimeOptions{}).SetConnectTimeout(c.timeoutMS).SetReadTimeout(c.timeoutMS).SetAutoretry(false))
latency := time.Since(started)
if err != nil {
return nil, err
}
result := &ID2MetaResult{Latency: latency}
if resp != nil {
result.ProviderStatusCode = dara.Int32Value(resp.StatusCode)
}
if resp == nil || resp.Body == nil {
return result, errors.New("empty aliyun realname response")
}
result.RequestID = dara.StringValue(resp.Body.RequestId)
result.ProviderCode = dara.StringValue(resp.Body.Code)
result.ProviderMessage = dara.StringValue(resp.Body.Message)
if resp.Body.ResultObject != nil {
result.BizCode = strings.TrimSpace(dara.StringValue(resp.Body.ResultObject.BizCode))
}
if result.ProviderCode != "" && result.ProviderCode != "200" {
return result, errors.New("aliyun realname response code " + result.ProviderCode)
}
if result.BizCode == "" {
return result, errors.New("empty aliyun realname biz code")
}
result.Passed = result.BizCode == "1"
return result, nil
}
func ParseTimeoutMS(value string, fallback int) int {
parsed, err := strconv.Atoi(strings.TrimSpace(value))
if err != nil || parsed <= 0 {
return fallback
}
return parsed
}