WxLogin.ts 6.05 KB
import WxApi from "./WxApi";
import DataService from "../service/DataService";
import { ErrorCode } from "../base/SDKConst";
import { SDKApi } from "../http/SDKApi";
import WxSystem from "./WxSystem";
import DateUtils from "../utils/DateUtils";
import LogService from "../service/LogService";
import { DOT_SHARE_TYPE } from "../base/SDKEnum";
import ShareVideoService from "../service/ShareVideoService";
import OnlineService from "../service/OnlineService";

export default class WxLogin {
    /**
     * 发起登录
     * @param isAuthorize Boolean 是否重新登录
     * tip1:如果是重新登录,需要把之前的token清空
     * tip2:必须先调用wxLogin才能使用getUserInfo
     */
     async login(isAuthorize: boolean): Promise<any> {
        return new Promise(async (resolve, reject) => {
            let code = await WxApi.I.login();
            if (isAuthorize) {
                WxApi.I.getUserinfo()
                    .then((ret: any) => this.authedlogin(ret, code, resolve, reject))
                    .catch((err: any) => this.weakLogin(err, code, resolve, reject));
            } else {
                this.weakLogin({ errCode: 1, msg: '默认未授权登录' }, code, resolve, reject)
            }
        });
    }
    private isFirst: boolean

    /**
     * 授权后登录登陆
     * @param ret
     * @param resolve
     * @param reject
     */
    private async authedlogin(ret: _GetUserInfoSuccessObject, code: string, resolve: any, reject: any) {//_GetUserInfoSuccessObject
        let { rawData, iv, encryptedData, signature, userInfo } = ret;
        let params = {
            ...this.buildParams(),
            code,
            signature,
            iv: iv,//encodeURIComponent(),
            // raw_data: encodeURIComponent(Base64.encode(rawData)),
            encryptedData: encryptedData//encodeURIComponent(encryptedData)
        };
        // 设置性别
        userInfo && DataService.I.setGender(userInfo.gender);
        SDKApi.Login(params)
            .then((data: any) => {
                // console.log("登录", data)
                this.handleLogin(data, resolve, true);
                resolve(data);
            })
            .catch((err: any) => reject(err));
    }

    /**
     * 弱登录
     * @param err
     * @param resolve
     * @param reject
     */
    private async weakLogin(err: any, code: string, resolve: any, reject: any) {
        // console.log("弱登录")
        // 重新登录不需要继续往下走
        if (!err || err.errCode === ErrorCode.InvalidLogin.code)
            return;

        // 传递来源appid
        let refererInfo = DataService.I.ReferrerInfo;
        let params = {
            ...this.buildParams(),
            // refAppId: refererInfo.appId || 0,
            code
        };

        SDKApi.weakLogin(params)
            .then((data: any) => {
                this.handleLogin(data, resolve, false);
            })
            .catch((err: any) => reject(err));
    }

    /**
     * 处理登录/弱登录请求结果
     * @param data
     * @param isAuthorize 是否授权:true=已授权 false=没有授权成功
     */
    private handleLogin(data: any, resolve: any, isAuthorize: boolean) {
        // console.log("登录请求结果data", data)
        if (data) {
            // 设置登录信息
            if (data.data) {
                let { channel, uid, firstlogin, token, reftoken, openid, expire, isnew, gameconfig,logindays,amount,pon } = data.data;
                LogService.I.setLogind({
                    channel,
                    userId: uid,
                    regTime: firstlogin,
                    openId: openid,
                    isnew,
                    token,
                    refToken: reftoken,
                    expire,
                    logindays,
                    amount,
                    pon
                });
                OnlineService.I.setData(gameconfig)
                LogService.I.active();
                if (!this.isFirst && DataService.I.ShareKey && DataService.I.ShareId) {
                    this.isFirst = true;
                    LogService.I.share(DataService.I.ShareKey, DataService.I.ShareId, DOT_SHARE_TYPE.click);
                }
                this.handleExpire(expire)
                ShareVideoService.I.forward()
            }
        }
        resolve(data)
    }

    /**
     * 构建登录/弱登录公用参数
     */
    private buildParams() {
        let channel = DataService.I.QueryChannelId + '';
        let brand = WxSystem.I.brand;
        let model = WxSystem.I.model;
        let version = WxSystem.I.version;
        let system = WxSystem.I.system;
        let platform = WxSystem.I.platform;
        let sdkversion = WxSystem.I.SDKVersion;
        let shareuid = +DataService.I.QueryUserInviteUid;
        let scene = DataService.I.Scene + '';
        let sharekey = DataService.I.ShareKey;
        let shareid = DataService.I.ShareId + '';
        return {
            channel,
            brand,
            model,
            version,
            system,
            platform,
            sdkversion,
            shareuid,
            scene,
            sharekey,
            shareid
        };
    }

    /**
     * 刷新token
     * @param expire 
     */
    private countDown
    private handleExpire(expire) {
        let time = expire - DateUtils.now;
        this.countDown && clearTimeout(this.countDown)
        this.countDown = setTimeout(this.refreshToken, time * 1000);
    }

    private refreshToken() {
        SDKApi.reftoken({
            channel: DataService.I.ChannelId + '',
            uid: DataService.I.UserId,
            token: DataService.I.Token,
            reftoken: DataService.I.refToken
        }).then(res => {
            let { token, reftoken, expire } = res.data;
            DataService.I.setLoginData({
                token,
                refToken: reftoken,
                expire,
            });
            this.handleExpire(expire)
        })
    }

    private static _instance: WxLogin;
    static get I(): WxLogin {
        return this._instance || (this._instance = new WxLogin);
    }
}