274 lines
7.0 KiB
Go
274 lines
7.0 KiB
Go
|
package model
|
||
|
|
||
|
import (
|
||
|
"crypto/md5"
|
||
|
"crypto/rand"
|
||
|
"crypto/rsa"
|
||
|
"crypto/x509"
|
||
|
"encoding/base64"
|
||
|
"encoding/pem"
|
||
|
"fmt"
|
||
|
"strings"
|
||
|
"time"
|
||
|
|
||
|
"go-common/app/job/main/member/conf"
|
||
|
"go-common/library/log"
|
||
|
|
||
|
"github.com/pkg/errors"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
realnameSalt = "biliidentification@#$%^&*()(*&^%$#"
|
||
|
)
|
||
|
|
||
|
//RealnamePersonMessage is.
|
||
|
type RealnamePersonMessage struct {
|
||
|
MID int64 `json:"mid"`
|
||
|
Realname string `json:"realname"`
|
||
|
IdentifyCard string `json:"identify_card"`
|
||
|
}
|
||
|
|
||
|
//RealnameApplyMessage is.
|
||
|
type RealnameApplyMessage struct {
|
||
|
ID int `json:"id"`
|
||
|
MID int64 `json:"mid"`
|
||
|
Realname string `json:"realname"`
|
||
|
Type int `json:"type"`
|
||
|
CardDataCanal string `json:"card_data"`
|
||
|
CardForSearch string `json:"card_for_search"`
|
||
|
FrontIMG int `json:"front_img"`
|
||
|
BackIMG int `json:"back_img"`
|
||
|
FrontIMG2 int `json:"front_img2"`
|
||
|
ApplyTimeUnix int64 `json:"apply_time"`
|
||
|
Operater string `json:"operater"`
|
||
|
OperaterTimeUnix int64 `json:"operater_time"`
|
||
|
Status int8 `json:"status"`
|
||
|
Remark string `json:"remark"`
|
||
|
RemarkStatus int8 `json:"remark_status"`
|
||
|
}
|
||
|
|
||
|
// CardMD5 is.
|
||
|
func (r *RealnameApplyMessage) CardMD5() (res string) {
|
||
|
return cardReMD5(r.CardData(), r.CardType(), r.Country())
|
||
|
}
|
||
|
|
||
|
// cardReMD5 is.
|
||
|
func cardReMD5(encrypedCard string, cardType int, country int) (res string) {
|
||
|
card, err := cardDecrypt([]byte(encrypedCard))
|
||
|
if err != nil {
|
||
|
log.Error("cardNewMD5 decrypt err : %+v", err)
|
||
|
return
|
||
|
}
|
||
|
return cardMD5(string(card), cardType, country)
|
||
|
}
|
||
|
|
||
|
func cardMD5(card string, cardType int, country int) (res string) {
|
||
|
var (
|
||
|
lowerCode = strings.ToLower(card)
|
||
|
key = fmt.Sprintf("%s_%s_%d_%d", realnameSalt, lowerCode, cardType, country)
|
||
|
)
|
||
|
return fmt.Sprintf("%x", md5.Sum([]byte(key)))
|
||
|
}
|
||
|
|
||
|
func cardDecrypt(data []byte) (text []byte, err error) {
|
||
|
var (
|
||
|
decryptedData []byte
|
||
|
size int
|
||
|
)
|
||
|
decryptedData = make([]byte, base64.StdEncoding.DecodedLen(len(data)))
|
||
|
if size, err = base64.StdEncoding.Decode(decryptedData, data); err != nil {
|
||
|
err = errors.Wrapf(err, "base decode %s", data)
|
||
|
return
|
||
|
}
|
||
|
if text, err = rsaDecrypt(decryptedData[:size]); err != nil {
|
||
|
err = errors.Wrapf(err, "rsa decrypt %s , data : %s", decryptedData, data)
|
||
|
return
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func rsaDecrypt(text []byte) (content []byte, err error) {
|
||
|
block, _ := pem.Decode(conf.Conf.RealnameRsaPriv)
|
||
|
if block == nil {
|
||
|
err = errors.New("private key error")
|
||
|
return
|
||
|
}
|
||
|
var (
|
||
|
privateKey *rsa.PrivateKey
|
||
|
)
|
||
|
if privateKey, err = x509.ParsePKCS1PrivateKey(block.Bytes); err != nil {
|
||
|
err = errors.WithStack(err)
|
||
|
return
|
||
|
}
|
||
|
if content, err = rsa.DecryptPKCS1v15(rand.Reader, privateKey, text); err != nil {
|
||
|
err = errors.WithStack(err)
|
||
|
return
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
//ApplyTime is.
|
||
|
func (r *RealnameApplyMessage) ApplyTime() (t time.Time) {
|
||
|
t = time.Unix(r.ApplyTimeUnix, 0)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
//OperaterTime is.
|
||
|
func (r *RealnameApplyMessage) OperaterTime() (t time.Time) {
|
||
|
t = time.Unix(r.OperaterTimeUnix, 0)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
//CardType is.
|
||
|
func (r *RealnameApplyMessage) CardType() (t int) {
|
||
|
if r.Type > 6 {
|
||
|
return 6
|
||
|
}
|
||
|
return r.Type
|
||
|
}
|
||
|
|
||
|
//Country is.
|
||
|
func (r *RealnameApplyMessage) Country() (t int) {
|
||
|
if r.Type > 6 {
|
||
|
return r.Type
|
||
|
}
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
//CardData is.
|
||
|
func (r *RealnameApplyMessage) CardData() (data string) {
|
||
|
if r.CardDataCanal == "" {
|
||
|
log.Warn("card data empty (+v)", r)
|
||
|
return ""
|
||
|
}
|
||
|
bytes, err := base64.StdEncoding.DecodeString(r.CardDataCanal)
|
||
|
if err != nil {
|
||
|
err = errors.Wrapf(err, "decode (%+v) failed", r)
|
||
|
log.Error("+v", err)
|
||
|
return ""
|
||
|
}
|
||
|
return string(bytes)
|
||
|
}
|
||
|
|
||
|
//RealnameApplyImgMessage is.
|
||
|
type RealnameApplyImgMessage struct {
|
||
|
ID int `json:"id"`
|
||
|
IMGData string `json:"img_data"`
|
||
|
AddTimeStr string `json:"add_time"`
|
||
|
AddTimeDB time.Time
|
||
|
}
|
||
|
|
||
|
//AddTime is.
|
||
|
func (r *RealnameApplyImgMessage) AddTime() (t time.Time) {
|
||
|
if r.AddTimeDB.IsZero() {
|
||
|
var err error
|
||
|
if t, err = time.ParseInLocation("2006-01-02 15:04:05", r.AddTimeStr, time.Local); err != nil {
|
||
|
log.Error("%+v", err)
|
||
|
t = time.Now()
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
return r.AddTimeDB
|
||
|
}
|
||
|
|
||
|
// RealnameApplyStatus is.
|
||
|
type RealnameApplyStatus int8
|
||
|
|
||
|
const (
|
||
|
// RealnameApplyStatusPending is.
|
||
|
RealnameApplyStatusPending RealnameApplyStatus = iota
|
||
|
// RealnameApplyStatusPass is.
|
||
|
RealnameApplyStatusPass
|
||
|
// RealnameApplyStatusBack is.
|
||
|
RealnameApplyStatusBack
|
||
|
// RealnameApplyStatusNone is.
|
||
|
RealnameApplyStatusNone
|
||
|
)
|
||
|
|
||
|
// IsPass return is apply passed
|
||
|
func (r RealnameApplyStatus) IsPass() bool {
|
||
|
switch r {
|
||
|
case RealnameApplyStatusPass:
|
||
|
return true
|
||
|
default:
|
||
|
return false
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// RealnameChannel is
|
||
|
type RealnameChannel int8
|
||
|
|
||
|
// RealnameChannel enum
|
||
|
const (
|
||
|
RealnameChannelMain RealnameChannel = iota
|
||
|
RealnameChannelAlipay
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
// RealnameCountryChina is.
|
||
|
RealnameCountryChina = 0
|
||
|
// RealnameCardTypeIdentity is.
|
||
|
RealnameCardTypeIdentity = 0
|
||
|
)
|
||
|
|
||
|
// RealnameInfo is user realname status info
|
||
|
type RealnameInfo struct {
|
||
|
ID int64 `json:"id"`
|
||
|
MID int64 `json:"mid"`
|
||
|
Channel RealnameChannel `json:"channel"`
|
||
|
Realname string `json:"realname"`
|
||
|
Country int `json:"country"`
|
||
|
CardType int `json:"card_type"`
|
||
|
Card string `json:"card"`
|
||
|
CardMD5 string `json:"card_md5"`
|
||
|
Status RealnameApplyStatus `json:"status"`
|
||
|
Reason string `json:"reason"`
|
||
|
CTime time.Time `json:"ctime"`
|
||
|
MTime time.Time `json:"mtime"`
|
||
|
}
|
||
|
|
||
|
// DecryptedCard is
|
||
|
func (r *RealnameInfo) DecryptedCard() (string, error) {
|
||
|
raw, err := cardDecrypt([]byte(r.Card))
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
return string(raw), nil
|
||
|
}
|
||
|
|
||
|
// RealnameApply is user realname apply info from default channel.
|
||
|
type RealnameApply struct {
|
||
|
ID int `json:"id"`
|
||
|
MID int64 `json:"mid"`
|
||
|
Realname string `json:"realname"`
|
||
|
Country int16 `json:"country"`
|
||
|
CardType int8 `json:"card_type"`
|
||
|
CardNum string `json:"card_num"`
|
||
|
CardMD5 string `json:"card_md5"`
|
||
|
HandIMG int `json:"hand_img"`
|
||
|
FrontIMG int `json:"front_img"`
|
||
|
BackIMG int `json:"back_img"`
|
||
|
Status int `json:"status"`
|
||
|
Operator string `json:"operator"`
|
||
|
OperatorID int64 `json:"operator_id"`
|
||
|
OperatorTime time.Time `json:"operator_time"`
|
||
|
Remark string `json:"remark"`
|
||
|
RemarkStatus int8 `json:"remark_status"`
|
||
|
CTime time.Time `json:"ctime"`
|
||
|
MTime time.Time `json:"mtime"`
|
||
|
}
|
||
|
|
||
|
// RealnameAlipayApply is user alipay apply info from alipay channle.
|
||
|
type RealnameAlipayApply struct {
|
||
|
ID int64 `json:"id"`
|
||
|
MID int64 `json:"mid"`
|
||
|
Realname string `json:"realname"`
|
||
|
Card string `json:"card"`
|
||
|
IMG string `json:"img"`
|
||
|
Status RealnameApplyStatus `json:"status"`
|
||
|
Reason string `json:"reason"`
|
||
|
Bizno string `json:"bizno"`
|
||
|
CTime time.Time `json:"ctime"`
|
||
|
MTime time.Time `json:"mtime"`
|
||
|
}
|