113 lines
3.4 KiB
Go
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
|
|
}
|