66 lines
1.5 KiB
Go
66 lines
1.5 KiB
Go
|
|
package services
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"crypto/sha256"
|
|||
|
|
"encoding/hex"
|
|||
|
|
"strings"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// NormalizeIDCard 归一化身份证号(去空格、末位 X 大写)
|
|||
|
|
func NormalizeIDCard(idCard string) string {
|
|||
|
|
idCard = strings.TrimSpace(idCard)
|
|||
|
|
return strings.ToUpper(idCard)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// HashIDCard 计算身份证号 SHA256 哈希,用于索引与匹配
|
|||
|
|
func HashIDCard(idCard string) string {
|
|||
|
|
sum := sha256.Sum256([]byte(NormalizeIDCard(idCard)))
|
|||
|
|
return hex.EncodeToString(sum[:])
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// MaskIDCard 脱敏展示:350681********0611
|
|||
|
|
func MaskIDCard(idCard string) string {
|
|||
|
|
id := NormalizeIDCard(idCard)
|
|||
|
|
if len(id) <= 10 {
|
|||
|
|
return id
|
|||
|
|
}
|
|||
|
|
return id[:6] + "********" + id[len(id)-4:]
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// IdentityParams 从请求参数中提取的身份证与姓名
|
|||
|
|
type IdentityParams struct {
|
|||
|
|
IDCard string
|
|||
|
|
Name string
|
|||
|
|
OK bool
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ExtractIdentityParams 从解密后的 params map 提取 id_card + name
|
|||
|
|
func ExtractIdentityParams(params map[string]interface{}) IdentityParams {
|
|||
|
|
idCard := firstNonEmptyString(params, "id_card", "idCard")
|
|||
|
|
name := firstNonEmptyString(params, "name")
|
|||
|
|
if idCard == "" {
|
|||
|
|
return IdentityParams{OK: false}
|
|||
|
|
}
|
|||
|
|
return IdentityParams{
|
|||
|
|
IDCard: NormalizeIDCard(idCard),
|
|||
|
|
Name: strings.TrimSpace(name),
|
|||
|
|
OK: true,
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func firstNonEmptyString(params map[string]interface{}, keys ...string) string {
|
|||
|
|
for _, key := range keys {
|
|||
|
|
v, ok := params[key]
|
|||
|
|
if !ok {
|
|||
|
|
continue
|
|||
|
|
}
|
|||
|
|
if s, ok := v.(string); ok {
|
|||
|
|
s = strings.TrimSpace(s)
|
|||
|
|
if s != "" {
|
|||
|
|
return s
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return ""
|
|||
|
|
}
|