go-common/app/job/main/member/model/realname.go
2019-04-22 18:49:16 +08:00

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"`
}