package userrpc import ( "encoding/json" "errors" "strconv" "time" "git.tetele.net/tgo/crypter" "github.com/golang/protobuf/proto" ) /** * 绑定第三方平台openid * 2021/04/05 * gz */ func BindThird(site_id, dbname, platform, user_id, openid, openname, unionid, avatar, mobile string, url ...string) (*Res, error) { conn, err := rpc_server_conn(url...) if err != nil { return nil, err } defer conn.Close() data := BindThirdReq{} data.SiteId = site_id data.Dbname = dbname data.Openid = openid data.Openname = openname data.Platform = platform data.Unionid = unionid data.Avatar = avatar data.Mobile = mobile data.Userid = user_id data_json, err := json.Marshal(data) if err != nil { return nil, err } encryData := crypter.DesEn(string(data_json), DES_KEY) now_int64 := time.Now().Unix() now := strconv.FormatInt(now_int64, 10) sign := Sign(encryData, now) req := &Request{ proto.String(encryData), proto.String(now), proto.String(sign), nil} res := &Response{} err = conn.BindThird(req, res) if err != nil { return nil, err } return HandleRes(res) } /** * 查找第三方平台openid * 2021/04/06 * gz */ func GetThird(site_id, dbname, platform, user_id string, url ...string) (*Third, error) { conn, err := rpc_server_conn(url...) if err != nil { return nil, err } defer conn.Close() data := GetThirdReq{} data.SiteId = site_id data.Dbname = dbname data.Platform = platform data.Userid = user_id data_json, err := json.Marshal(data) if err != nil { return nil, err } encryData := crypter.DesEn(string(data_json), DES_KEY) now_int64 := time.Now().Unix() now := strconv.FormatInt(now_int64, 10) sign := Sign(encryData, now) req := &Request{ proto.String(encryData), proto.String(now), proto.String(sign), nil} res := &Response{} err = conn.GetThird(req, res) if err != nil { return nil, err } return HandleGetThirdRes(res) } /** * 处理返回结果 */ func HandleGetThirdRes(res *Response) (*Third, error) { res_data := res.GetData() if res_data == "" { return nil, errors.New("未收到收据") } time_int64, err := strconv.ParseInt(res.GetTime(), 10, 64) if err != nil { return nil, err } now_int64 := time.Now().Unix() if now_int64-time_int64 > 10 || time_int64-now_int64 > 10 { //时间误差前后10秒,返回 return nil, errors.New("返回时间错误") } check_sign := CheckSign(res.GetSign(), res_data, res.GetTime()) if !check_sign { return nil, errors.New("返回数据签名错误") } //解密 res_data_de := crypter.DesDe(res_data, DES_KEY) var res_arr Third err = json.Unmarshal([]byte(res_data_de), &res_arr) if err != nil { return nil, err } return &res_arr, nil }