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