You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
273 lines
7.0 KiB
273 lines
7.0 KiB
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"` |
|
}
|
|
|